序列化的概念:
把对象转换为字节序列的过程。
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
PHP代码
class S{
public $test="kwan";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:4:"kwan";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
4:变量值的长度
kwan:变量值
反序列化的概念:
把字节序列恢复为对象的过程。
PHP代码
$u=unserialize("O:1:"S":1:{s:4:"test";s:4:"kwan";}");
echo $u->test; //得到的结果为kwan
反序列化漏洞产生的原因
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
常见的PHP魔法函数
__construct() 当一个对象创建时被调用
__destruct() 当一个对象销毁时被调用
__toString() 当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup 将在反序列化之前立即被调用
反序列化漏洞的前提条件
- 参数可控
- 类中使用了魔术方法
反序列化漏洞演示
查看pikachu网站源码
构造Payload
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
将构造好的payload复制到文本框中,单击提交按钮
执行后效果
反序列化防御
-
禁止相关魔法函数,减少使用魔法函数
-
对输入数据进行严格的过滤验证
-
升级web应用程序