首先这个题的题目为unserialize3,这个单词在php中代表反序列化,所以这个题基本就是和反序列化有关的题目。
其次看源码知道,要上传一个code的变量,我们可以猜想,用get方法上传code变量,其值为flag的序列化字符,然后网站反序列化得到flag。
但是原代码中并没有序列化所以我们无法进行反序列化,所以我们需要添加一个序列化来将我们的变量变成字符串。
使用php运行在线工具:PHP 在线调试工具_在线测试工具 - IT屋 (it1352.com)
运行代码:
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$a=new xctf();
print(serialize($a));
得到序列化后的flag
O:4:"xctf":1:{s:4:"flag";s:3:"111";} ①
我们不能直接反改序列化字符得到flag,因为看网站源码有--wakeup(),我们搜索,知道了,**__wakeup()**是PHP的一个魔法函数(一般魔法函数都以两条下划线开头),在进行unserialize反序列化的时候,首先查看有无该函数有的话,就会先执行他,从而直接结束程序输出 bad requests,所以我们要绕过--wakeup。
然后 重点来了 :
反序列化漏洞:根据漏洞(CVE-2016-7124)使序列化字符串中表示对象属性个数的值大于真实的属性个数,以此跳过__wakeup 的执行,达到绕过的目的。
根据本题我们得到的序列化字符串,看到标准的格式:O:<类名的长度>:“<类名>”:<成员属性的个数>:{S:…这里我们将属性个数由1改为2进行绕过。(类成员属性的个数的判断:class里定义了几个变量,就有几个类成员属性,所以我们由①式看到本题属性个数为1,我们改成2,或3或以上,就可以执行漏洞了)
我们将 O:4:"xctf":2:{s:4:"flag";s:3:"111";} 放到URL中,得到flag