0x00 变量覆盖

我们传递进去的值会覆盖掉程序中的原有值,就是一个变量覆盖。

常见的变量覆盖的地方:

1、$$使用不当 (将用户传递的参数当做一个变量)

2、extract()使用不当

3、parse_str()使用不当

4、import_request_variables()使用不当

5、开启了全局变量覆盖(基本没有)

0x01 危害

利用变量覆盖漏洞仿造session进行用户登录或者进入后台、拿webshell等

0x02 代码审计

以 DuomiCms X2.0 影视管理系统为例

下载源码,全局搜索 $$

变量覆盖1.png

定位到 duomiphp/common.php 文件

变量覆盖2.png

第2行,用$_REQUEST获取的传参,并且进行键值分离

第4行,进入if()需要同时满足三个条件:传参的长度大于0,出现cfg_或者GLOBALS,在COOKIE中有这个参数

第6行,发现exit(),而为了利用变量覆盖漏洞,必须要避开第4行的if()

所以只需要任意一个条件不满足就可以避开exit()

第28行,使用了$$,并且在第26行接收了GET、POST、COOKIE传参并存入$_request中

第28行进行了键值分离,此处调用了_RunMagicQuotes函数,这个函数在第10行定义,功能是检测是否开启魔术引号,如果开启,直接返回传进来的参数,如果没有开启,则对传进来的参数进行转义,在单引号’,双引号”,反斜杠,前添加/

找到了变量覆盖,接下来要找可以利用的地方,继续寻找哪个文件包含了duomiphp/comment.php

而且需要满足:被覆盖的变量在之后没有被定义

在login.php文件满足条件

变量覆盖3.png

在第2行包含了duomiphp/comment.php

在第3行包含了duomi_INC."/check.admin.php"

不知道duomi_INC具体的值,可以在本地修改源码,直接将其输出

变量覆盖4.png

访问login.php

变量覆盖5.png

知道了duomi_INC的值

接下来追踪duomiphp/check.admin.php

变量覆盖6.png

这个文件是定义session的,在第27-29行传递了具体的值

因此,可以利用common.php中的变量覆盖漏洞,去覆盖掉duomiphp/check.admin.php第27-29行中的三个值,达到仿造session,以管理员身份进入后台。

而伪造session需要开启session_start(),在interface/comment.php中发现满足条件:

变量覆盖7.png

最终payload:

interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin

0x03 靶场复现

根据payload,访问

http://www.test.com/interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin

变量覆盖8.png

然后直接访问后台

变量覆盖9.png

0x04 防御措施

1、在对变量进行赋值时先检测变量是否存在

2、自行申明的变量要初始化