PHP反序列化漏洞
原资料参考: xiu博客
文章目录
序列化与反序列化
seriallization 序列化 : 将对象转化为便于传输的格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。
deseriallization 反序列化:将序列化的数据恢复为对象的过程。
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 "<hr />";
echo serialize($stu1);
反序列化
字符串转换成对象
O:object
反序列化漏洞
以 __ 开头的函数,是PHP 中的魔术方法。
类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。
两个下划线
__construct() 在创建对象时自动调用
__destruct() 在销毁对象时自动调用
**__wakeup() unserialize()时会自动调用这个函数**
**__sleep()** serialize()时会自动调用这个函数
例子
<?php
class animal{
public $name;
public $age;
public function__sleep(){
if(@$_GET['cmd' ]=="abc"){
a() ;
}
}
}
$anl=new animal;
$anl->name="dog";
$anl->age=3;
//var_dump($anl);
@serialize ($anl);
?>
什么是反序列化漏洞?
序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令,
修改序列化后的数据,目的是什么
为了满足一定的条件以后实现链式调用