在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象s进行序列化
序列化后得到的结果是这个样子的: O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
PHP 序列化与反序列化-案例ser.php:
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
这里的功能是输入一个序列化数据,源码审计此页面是根据序列化的数据创建S对象时执行了echo,返回对象里test变量的值。如构造正常的值如
提交后会返回pikachu,但如果提交构造的payload如
则S执行destruct方法时就会echo js脚本,在前端实现xss的效果了。
那么如何构造一个正确的payload的呢?我们在php里面写一个类然后定义一个变量,把变量的名称写成一段恶意的js代码然后new一下对他进行序列化。得到的序列化的内容也就是我们的payload
序列化漏洞很难通过黑盒测试发现,一般发掘反序列化漏洞主要还是通过源码审计。
我们在靶场中输入payload即已经定义好的反序列化语句。
这里就是提交一个序列化的内容,然而序列化中的内容就是恶意js代码,把他提交后台,后台会进行反序列化,然后通过魔法方法echo到了前端。这样就是通过反序列化的一个接口造成了xss的执行。
在后端代码中我们可以看到后端使用了一个php魔法方法
这边就是把接收到的数据做一个反序列化。