变量覆盖
变量覆盖:值我们可以用我们的传参值去替换程序原有的变量值。
经常导致变量覆盖漏洞场景有:
$$使用不当;
extract()函数使用不当;
parse_str()函数使用不当;
import_request_variables()使用不当,开启了全局变量注册等。
$$ 导致的变量覆盖问题在CTF代码审计题目中经常在foreach中出现,如以下的示例代码,使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的值作为变量的值。因此就产生了变量覆盖漏洞。
例如:
<?php
$a = 1;
foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach($$_request as $_key=>$_value)
{$$_key=addslashes($_value);}}
echo $a;
?>
// $a 完全可以由传参决定。
靶场
duomicms-v2.0
本地测试
安装
审计
发现这个地方可能存在变量覆盖:/duomiphp/common.php
跟我们上面提到的结构很相像。
我们可以自己构造变量去覆盖原有的变量。
这段代码不在任何条件当中,正常往下的流程就会执行到这里。
那么,我们需要找到哪里使用到这个文件和这段代码。
查看包含了common.php的地方:
先看看后台登录的地方,调用了common.php。
login.php查看了一下,没有可以构造变量的地方。
但是login.php包含了check.admin.php。
check.admin.php中的keepUser方法在login.php被使用了
是一个登录判断的功能。登录成功之后会保存用户的session。
我们的漏洞点就是构造$_SESSION变量,成功登录到管理员后台。
而$_SESSION变量我们可以进行变量覆盖。
为了能成功登录到管理员后台,我们需要知道session中包含哪些东西。
check.admin.php:
_ S E S S I O N [ \_SESSION[ _SESSION[this->keepUserIDTag] = $this->userID;
_ S E S S I O N [ \_SESSION[ _SESSION[this->keepgroupidTag] = $this->groupid;
S E S S I O N [ _SESSION[ SESSION[this->keepUserNameTag] = $this->userName;
显然,我们需要构造的有:
$_SESSION[duomi_admin_id]=userID
$_SESSION[duomi_group_id]=groupid
$_SESSION[duomi_admin_name]=userName
那么让这些值等于什么才能是管理员权限呢?
userID与userName 好理解,就是用户id与用户名嘛。
那groupid是什么呢?
全文搜索一下:/admin/admin_manager.php
groupid=1即为系统管理员。
经过搜索,userID与userName是可以任意构造的。
那么我们的payload也就形成了:
_SESSION[duomi_admin_id]=11&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=666
其实构造userID与groupid就行了。
那么构造好了payload需要在哪里使用呢?
既然与session有关,那必然要使用session_start()。
所以需要找到同时包含common.php与使用session_start()的地方。
interface/gbook.php:下可以成功执行。
http://192.168.17.144/Duomicms_X2.0/upload/interface/gbook.php?_SESSION[duomi_admin_id]=11&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=666
成功登录到后台,无需账户与密码。
interface/comment.php
interface/comment.php/api/index.php
interface/comment.php/api/send.php
member/cpwd.php
member/exchange.php
member/exit.php
…等等这些路径下也可以执行,没有全部测试。但是应该大部分都可以。
靶场:
_SESSION[duomi_admin_id]=11&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=123
拿到flag: