看题目提示,这里是get传参code
审计一下代码,__wakeup()会直接退出然后返回bad request,那就没得玩了。也没有说哪里的程序可以返回flag,估计题目是让我们绕过这个魔术方法,然后返回flag给我们。
__wakeup()执行漏洞:
只存在于版本:PHP5 < 5.6.25、PHP7 < 7.0.10
在进行unserialize的时候,首先查看有无该函数有的话
就会先执行他。
一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数。
绕过方式:
当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。
例如:O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}中将变量个数2(s:3:"age";表示第一个变量的名字,i:20;表示第一个变量的值,因此像这种东西,都是成对出现的,几对就有几个变量)修改为3即可。
开始解题:
构造exp
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
修改为:O:4:"xctf":2:{s:4:"flag";s:3:"111";}
Payload:
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
做题时参考的博客,我觉得写的很好,看完对反序列化的原理理解深了一点。
攻防世界unserialize3题解_Leng_tian的博客-CSDN博客