什么是变量覆盖漏洞:
变量覆盖指的是我们自定义的参数替换程序的原有的变量值
危险函数:
-
extract()函数
官方说法"从数组中将变量导入当前的符号表",通俗的讲就是将数组中的键值对注册成变量, 例如
运行结果是
发现$a=“1”被成功覆盖了
-
prase_str()函数
解析字符串并注册成变量,在注册变量之前不会验证当前变量是否已经存在,所以会直接覆盖原有变量,例如
-
$$变量覆盖
本地复现:
此处发现foreach进行遍历数组,发现将$$_request进行键值分离,我们的GET,POST,COOKIE传参可以传入任意变量,这部分可能导致变量覆盖漏洞,观察此代码上部分
发现要想执行到下面,当有传参且传参中键名以cfg_或者GLOBALS开头并且COOKIE传参中没有键名就继续往下执行
而此处漏洞实现完整的攻击需要结合程序的其他功能来实现,所以查询包含common.php的文件,发现login.php文件包含,发现进行if语句判断来验证是否成功登录并转向管理主页
进入此处需要$res==1
发现此处执行keepUser()中的方法,定位keepUser()函数
发现此处使用SESSION来验证成功返回1,而使用session验证需要开启session_start,并且要想执行到这一步,需要userID!=""和groupid!=""全文追踪这两个参数
发现是定义一个类,所以SESSION传参中需要有duomi_admin_id,duomi_group_id,duomi_admin_name,这三个参数,但是需要知道这三个参数的值为什么时才能正确登录,所以可以现在本地成功登录并将$_SESSION使用var_dump打印出来
发现duomi_admin_id=1, duomi_group_id=1,duomi_admin_name=admin便可以成功登录,现在只需要查找到开启session_start并且包含common.php的文件
所以访问http://127.0.0.1/Duomicms_X2.0/upload/interface/gbook.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin就可以成功登录
总结:
我们知道了common.php存在变量覆盖发现登录页面login.php包含此文件,通过$res的值来判断是否登录管理用户,发现此处执行keepUser()中的方法,定位函数发现在chech.admin.php可以控制session,所以我们能通过common.php来伪造session来成功登录
POC:interface/gbook.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin
原文始发于微信公众号(是恒恒呐):duomicms变量覆盖复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论