PHP反序列化漏洞

序列化与反序列化

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class animal{
public $name;
public $age;

public function __sleep(){
if(@$_GET['cmd']=="xiu"){
system('calc');
}
}

}

$an1=new animal;

$an1->name="dog";
$an1->age=3;

//var_dump($an1);

@serialize($an1);

?>

什么是反序列化漏洞?

序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令,

修改序列化后的数据,目的是什么?

为了满足一定的条件以后实现链式调用