第四届上海大学生信息安全比赛------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下面的phpphp7.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,

$IFSLinux下面的一个环境变量,它的意思可以是空格,换行,tab

 

 

可以将源码读出来了

 

结束了,为什么要那样子构建payload,在前面的笔记文章里面有详细的说,这里不详细说了

我自己搭建了一个docker,名称是nienie/ubuntu16_php7_apache2:3.0

里面有包含了web1 web2 web3的环境,不是比赛的环境,可能有些小问题,请自行修改。

posted @ 2018-11-07 11:07  捏捏nienie  阅读(250)  评论(0编辑  收藏  举报