PHP反序列化学习
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
- class S{
- public $test="pikachu";
- }
- $s=new S(); //创建一个对象
- serialize($s); //把这个对象进行序列化
- 序列化后得到的结果是这个样子的:O::"S"::{s::"test";s::"pikachu";}
- O:代表object
- :代表对象名字长度为一个字符
- S:对象的名称
- :代表对象里面有一个变量
- s:数据类型
- :变量名称的长度
- test:变量名称
- s:数据类型
- :变量值的长度
- pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
- $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
- echo $u->test; //得到的结果为pikachu
0x01 初识反序列化
反序列化我们需要了解php的类和魔术方法,这里举个简单的例子用到的魔术方法是__destruct
销毁一个类之前执行执行析构方法。
当对象创建后输出我们的$a
变量的值。那么我们把它的值改变后用serialize()
看看
可以看见这是我们12345序列化之后的值O:4:"test":1:{s:1:"a";s:5:"12345";}
那么我们传入O:4:"test":1:{s:1:"a";s:5:"zhong";}
O:4:"test":1:{s:1:"a";s:5:"12345";}
是我们序列化的值,然后unserialize($_GET['id']);
传入我们改变的值 O:4:"test":1:{s:1:"a";s:5:"zhong";}
成功打印了我们的改变的值,因为反序列化我们可以控制类属性且这个过程会触发这些能够触发的魔术方法
- __wakeup() //使用unserialize时触发
- __sleep() //使用serialize时触发
- __destruct() //对象被销毁时触发
- __call() //在对象上下文中调用不可访问的方法时触发
- __callStatic() //在静态上下文中调用不可访问的方法时触发
- __get() //用于从不可访问的属性读取数据
- __set() //用于将数据写入不可访问的属性
- __isset() //在不可访问的属性上调用isset()或empty()触发
- __unset() //在不可访问的属性上使用unset()时触发
- __toString() //把类当作字符串使用时触发
- __invoke() //当脚本尝试将对象调用为函数时触发
0X02从一道简单的CTF了解
- <?php
- class foo1{
- public $varr;
- function __destruct(){
- $this->varr->evaltest();
- }
- }
- class foo2{
- public $str;
- function evaltest(){
- eval($this->str);
- }
- }
- ?>
我们看到在foo2中evaltest()
函数中存在eval,而foo1中调用了函数evaltest()
,我们就想可不可以让foo1调用foo2中的evaltest()
函数顺边还把它的$str
中的值改写了。
我们看到在foo2中evaltest()
函数中存在eval,而foo1中调用了函数evaltest()
,我们就想可不可以让foo1调用foo2中的evaltest()
函数顺边还把它的$str
中的值改写了
PHP反序列化学习的更多相关文章
- PHP序列化与反序列化学习
序列化与反序列化学习 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. <?php class UserInfo { public $name = &q ...
- PHP Phar反序列化学习
PHP Phar反序列化学习 Phar Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件.它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句. 默认开启版 ...
- weblogic-CVE-2020-2551-IIOP反序列化学习记录
CORBA: 具体的对CORBA的介绍安全客这篇文章https://www.anquanke.com/post/id/199227说的很详细,但是完全记住是不可能的,我觉得读完它要弄清以下几个点: 1 ...
- 从零开始的pickle反序列化学习
前言 在XCTF高校战疫之中,我看到了一道pickle反序列化的题目,但因为太菜了花了好久才做出来,最近正好在学flask,直接配合pickle学一下. 找了半天终于找到一个大佬,这里就结合大佬的文章 ...
- RMI反序列化学习
RMI学习 1.RMI简介 RMI(Remote Method Invocation),远程方法调用方法,其实就是本地java虚拟机要调用其他java虚拟机的方法,两个虚拟机可以是运行在相同计算机上的 ...
- phar 反序列化学习
前言 phar 是 php 支持的一种伪协议, 在一些文件处理函数的路径参数中使用的话就会触发反序列操作. 利用条件 phar 文件要能够上传到服务器端. 要有可用的魔术方法作为"跳板&qu ...
- java中的序列化和反序列化学习笔记
须要序列化的Person类: package cn.itcast_07; import java.io.Serializable; /* * NotSerializableException:未序列化 ...
- Java序列化与反序列化学习(三):序列化机制与原理
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的 过程.Java序列化API提供 ...
- Java序列化与反序列化学习(二):序列化接口说明
一.序列化类实现Serializable接口 Serializable接口没有方法,更像是个标记.有了这个标记的Class就能被序列化机制处理. ObjectOutputStream只能对Serial ...
- Java序列化与反序列化学习(一)
一.序列化与反序列化概述 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网 ...
随机推荐
- TCP协议探究(三):RTT、滑动窗口和阻塞处理
1 RTT算法 1.1 概述 上一节说了重传机制需要设置一个重传超时值(RTO,Retransmission TimeOut),RTO设长了,重发太慢:设短了,可能导致包没有丢,就重发了,可能导致雪崩 ...
- 如何演讲-摘录自TED
一.首先,只传递一个主要思想 想法是个很复杂的东西,你要对你的内容做减法,突出重点,只关注一个主要思想,也就是你最富有热情的观点,利用机会好好的阐述它.你要给出案例,分享案例,生动阐述所以,找到一个 ...
- core路由设置
全局路由设置 app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:exi ...
- RabbitMQ的基本概念与原理(一)
1.什么是MQ? MQ全称为Message Queue, 顾名思义,即消息队列,它是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,生产者不断的往消息队列中不断写入消息, ...
- SpringMVC【二、项目搭建】
HelloWorld搭建 1.用Maven WebApp框架创建一个项目 红框中的是后添加的 2.添加pom引用(此处因为要引用多个spring包,建议把版本号提出来放到Properties) 会导入 ...
- Maven新建项目出现 Could not calculate build plan:plugin 错误解决办法
删除本地.m2仓库中 org.apache.maven.plugins:maven-resources-plugin所在目录. 然后右击项目 Maven->Update Project-> ...
- adreno的tbdr
看完apple的(&&powervr) 再来撸高通的.. FlexRender 能自己选三种模式 Direct Binning 这个只是分块 HWVizBinning 这个估计就是tb ...
- 包 ,模块(time、datetime、random、hashlib、typing、requests、re)
目录 1. 包 1. 优先掌握 2. 了解 3. datetime模块 1. 优先掌握 4. random模块 1. 优先掌握 2. 了解 5. hashlib模块和hmac模块 6. typing模 ...
- P4145——线段树点修改&&模板题
题目 链接 题意:对一个数列进行以下两种操作: 给$[l,r]$中的每个数开平方(下取整) 询问$[l,r]$中各个数的和 解决方法 显然,区间开平方不满足区间可加性,所以对区间中每个数开平方不能通过 ...
- URAL 2052 Physical Education(数位DP)
题目链接:https://vjudge.net/contest/254142#problem/G 参考题解:https://blog.csdn.net/zearot/article/details/4 ...