第四届上海大学生信息安全比赛------web2
这道题目是一道代码审计题
源码:
题目思路是:变量覆盖,反序列化漏洞
看到源码里面有parse_str()函数,这个函数如果没有带array()这个参数,将会导致变量被重新赋值
过first http://192.168.133.167:88/web2/index.php?first=doller
过 var http://192.168.133.167:88/web2/index.php?first=doller&a=var=give
过 bbb http://192.168.133.167:88/web2/index.php?first=doller&a=var=give%26bbb=me
这里用%26不能用&是因为bbb这些参数都要算是a的值
如果用&那么bbb就不算是a的值,就会当作是一个新的变量,那么$_GET[‘a’]就获 取不到bbb的值,也就不能重新赋值了
过 ccc
http://192.168.133.167:88/web2/index.php?first=doller&a=var=give%26bbb=me%26ccc=flag
下面post进去一个值,然后将这个值反序列化,这里就是反序列化漏洞的利用了
看class
反序列化漏洞就是对魔术方法的利用,这里有__wake() function ,一旦进行反序列化,那么就会执行这个函数,但是这个函数是可以绕过的,只要传进去的反序列,属性的数目比真正的数目多,那么就会绕过这个__wake() ,但是漏洞应该是受php版本限制的,我windows下面的php 是 php7.0.7的,可以成功绕过,直接执行__destruct() 。但是我的linux下面的php是php7.0.32的,这个函数就不能绕过了。不知道比赛的环境是怎样的,还是按正常流程来
魔术方法的执行顺序这里不说,前面已经写过相关的笔记
看class 的流程
传去的 私有变量 args 要求是一个array() ,然后对传进来的值进行waf处理
对很多字符都进行了过滤 ,不输入这些字符就好,不影响
下面还对flag进行了过滤,但是只要重写flag就可以了,
执行完之后,程序结束之前,会自动执行__destruct() function
这里有一个call_user_func_array(array($this, $this->method), $this->args),可以执行任意函数,但是上面判断是method这个参数要等于echo ,代码也重写了echo这个函数
call_user_func_array(array($this, $this->method), $this->args),这个函数要求$this->args是一个数组
参数$host的值就是args的值,如果$host的值是ls ,那么就会直接输出echo ls ,因为它这里将ls当成一个字符串了,那么可以用 ` ` 括起来(这两个是esc下面那个东东),就是
Echo `ls` ,那么就会先执行ls,然后再执行echo
下面构造payload
注意变量是private,还是public
Private的变量,序列化之后是看不到的,所以要经过urldecode 才能看到
输入发送过去就会将当前的目录的文件列出来
如果要查看一个文件的内容就要 cat 1.php
但是空格被过滤了,这里就要用到$IFS,
$IFS是Linux下面的一个环境变量,它的意思可以是空格,换行,tab等
可以将源码读出来了
结束了,为什么要那样子构建payload,在前面的笔记文章里面有详细的说,这里不详细说了
我自己搭建了一个docker,名称是nienie/ubuntu16_php7_apache2:3.0
里面有包含了web1 web2 web3的环境,不是比赛的环境,可能有些小问题,请自行修改。