MENU

php反序列化__wakeup()函数绕过(CVE-2016-7124)

May 20, 2020 • Read: 497 • CTF

漏洞影响版本:

PHP5 < 5.6.25
PHP7 < 7.0.10

漏洞产生原因:

__wakeup()会在执行unserialize()函数的时候调用,unserialize()会先检查类中是否存在魔术方法__wakeup(),若存在,则先调用__wakeup(),再执行unserialize()
对应的__sleep()魔法函数会在执行serialize()的时候调用,先检查是否存在__sleep(),存在则先调用__sleep()

__wakeup()漏洞则是如果一个字符串或对象被序列化后,其对应的对象属性个数发生改变时,就会导致反序列化失败,而同时使得__wakeup()失效。
也就是说unserialize()的时候会先检查接受的序列化字符串,再执行__wakeup(),最后执行unserialize

漏洞复现:

题目来源:攻防世界 unserialize3

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

分析:这道题没有给出过多的提示,源码也没有hint,通过__wakeup()可以看出是道PHP反序列化的题目
因为没有过多的信息,尝试一下触发__wakeup()

<?php
class xctf
{
    public $flag = '111';
}
$a = new xctf();
echo serialize($a);

QQ截图20200520013908.png

触发了__wakeup,更改一个属性个数来绕过__wakeup()函数

QQ截图20200520014150.png

成功触发漏洞,绕过__wakeup()