PHP反序列化漏洞

PHP反序列化漏洞
xiu序列化与反序列化
seriallization 序列化 : 将对象转化为便于传输的格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。
deseriallization 反序列化:将序列化的数据恢复为对象的过程。
漏洞成因
不管是PHP的反序列化漏洞还是JAVA的反序列化漏洞都基于一定的前提
比如java反序列化漏洞大名鼎鼎的cc链就需要服务端使用存在漏洞的commoncollections版本,并且jdk也要对
客户端可以控制序列化的对象传入服务端的readObject()方法,大多数的服务端应用都会重写这个方法,当服务端启用某些出名的组件时,我们也可以看到这些组件的代码,当组件中存在可以执行任意代码的代码块,假设为A,我们可以分析这块代码块在组件运行中被哪些对象B调用,找到B以后找调用B的C,直到找到接受我们序列化对象的readObject()方法调用,在对象中填入相关参数,满足这一系列的调用条件,形成链子
PHP反序列化
serialize(); 将对象序列化成字符串
unserialize(); 将字符串反序列化回对象
序列化
对象转换成字符串
方便传输
创建类
class Stu{
public $name;
public $age;
public $sex;
public $score;
}
创建对象(序列化)
$stu1 = new Stu();
$stu1->name = “xiu”;
$stu1->age = 18;
$stu1->sex = true;
var_dump($stu1);
echo “
“;
echo serialize($stu1);
反序列化
字符串转换成对象
O:object
反序列化漏洞
以 __ 开头的函数,是PHP 中的魔术方法。
类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。
__construct() 在创建对象时自动调用
__destruct() 在销毁对象时自动调用
__wakeup() unserialize()时会自动调用这个函数
__sleep() serialize()时会自动调用这个函数
例子
1 | class animal{ |
什么是反序列化漏洞?
序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令,
修改序列化后的数据,目的是什么?
为了满足一定的条件以后实现链式调用