想要挖掘一个漏洞我们首先就要知道这个漏洞是如何产生的。
1.漏洞产生原理
没有对用户输入的序列化字符串做检测,导致攻击者可以控制反序列化过程。
序列化(serialize())就是将对象转换成字符串,可以更方便的将数据保存到本地文件
反序列化(unserialize())就是将字符串还原成对象
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
2.漏洞触发条件
unserialize函数的变量可控,php文件中存在可利用的类,类中有魔法函数。
3.靶场案例讲解——使用pikachu-php反序列化
经过代码审计后得知
没有对输入的数据进行过滤,并且这里调用的属性test是外部可控的,构造对象,序列化这个对象,得到一个对应的序列化后的字符串。提交后还会输出构造对象中的test属性
所以我们可以配合xss漏洞
构造匹配的序列化代码:
<?php
class S{
var $test="pikachu";
}
$s= new S();
$payload="<script>alert('xss')</scripe>";
$s->test=$payload;
echo serialize($s);
?>
浏览器访问拥有上述代码的文件,右键查看源码可得到序列化的结果:O:1:”S”:1:{s:4:”test”;s:29:”alert(‘xss’)”;}
将结果提交触发xss弹窗
4.危害
反序列化漏洞产生的危害有很多种,可能是文件包含、命令执行、sql注入…
这取决于魔术方法
5.防护
反序列化漏洞是因为用户参数的控制问题引起的,所以最好的预防措施就是不要把用户的输入或者用户可控的参数直接放进反序列化操作中去。