变量覆盖漏洞
0x00 变量覆盖
我们传递进去的值会覆盖掉程序中的原有值,就是一个变量覆盖。
常见的变量覆盖的地方:
1、$$使用不当 (将用户传递的参数当做一个变量)
2、extract()使用不当
3、parse_str()使用不当
4、import_request_variables()使用不当
5、开启了全局变量覆盖(基本没有)
0x01 危害
利用变量覆盖漏洞仿造session进行用户登录或者进入后台、拿webshell等
0x02 代码审计
以 DuomiCms X2.0 影视管理系统为例
下载源码,全局搜索 $$
定位到 duomiphp/common.php 文件
第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文件满足条件
在第2行包含了duomiphp/comment.php
在第3行包含了duomi_INC.”/check.admin.php”
不知道duomi_INC具体的值,可以在本地修改源码,直接将其输出
访问login.php
知道了duomi_INC的值
接下来追踪duomiphp/check.admin.php
这个文件是定义session的,在第27-29行传递了具体的值
因此,可以利用common.php中的变量覆盖漏洞,去覆盖掉duomiphp/check.admin.php第27-29行中的三个值,达到仿造session,以管理员身份进入后台。
而伪造session需要开启session_start(),在interface/comment.php中发现满足条件:
最终payload:
1 | interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin |
0x03 靶场复现
根据payload,访问
1 | http://www.test.com/interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin |
然后直接访问后台
0x04 防御措施
1、在对变量进行赋值时先检测变量是否存在
2、自行申明的变量要初始化