覆盖变量漏洞

发布于 2022-03-16  455 次阅读


变量覆盖介绍

变量覆盖指的是可以用我们的传参值替换程序原有的变量值(代码从上往下执行,在定义好的变量下面再次定义这个变量就会覆盖原有的变量值),一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。变量覆盖漏洞大多数由函数使用不当导致,$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。

Session

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

寻找漏洞方法

任意定义变量 并且没有过滤SESSION 而且开启了提前session_start 就有可能存在漏洞(黑盒测试基本上做不出来)

函数

  • extract() 将数组中的键值堆变成变量——把数组变成变量
  • parse_str() 把字符串变成变量
  • $$双美元符,二次变量

​ 双写$$,如果$a=b $b=c 那么$$a => $b=c
​ foreach(array(‘_COOKIE’,’_POST’,’_GET’) as $_request)
​ 将数组’_COOKIE’,’_POST’,’_GET’依次循环放入$_request

危害

变量覆盖的漏洞危害主要还是要看代码具体的流程,如果可覆盖掉的变量在后面会进行代码执行,那么他的危害就是代码执行。具体还是要看后面代码具体的作用之类的。特殊的就是课堂上所教的Session覆盖,强行给Seesion赋值。然后拥有管理员权限

靶场实操

先对本地文件进行代码审计,定位这些函数

image-20220314212714657

只有$$能被定位

admin目录下一般都是需要有后台权限,这里忽略掉
一般代码审查中 ||.func.|| ||.class.|| ||.inc.|| 这样的文件往往可能会有用

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

代码执行到这里,就可以通过传参得到变量

要确保不执行上面的if条件,

不能满足$_REQUEST传参的键大于0

键是以cfg和GLOBALS开头且cookie为空

对登录页面抓取数据包

image-20220314213628008
image-20220314213827795

发到了admin/login.php

于是就审计这个文件内容

发现keepUser() 保持用户

image-20220314214132331

session的赋值出现在这里

image-20220314214357736

增加代码,登录就会输出session

image-20220314214426182

如果可以设置session,则就不需要登录也可以给cookie附上值,因为cookie和session是绑定的

session 开启 session_startimage-20220314214938186

image-20220314214938186

这里可以设置

interface/comment.php?

_SESSION[duomi_ckstr]=cqbc&_SESSION[duomi_ckstr_last]=&_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin
image-20220314215434285

退出登录,现在没有权限

interface/comment.php?进行传参

image-20220314215650750
image-20220314215748683

直接访问了后台,成功

靶场

image-20220314215914612

要登陆

/interface/comment.php?_SESSION[duomi_ckstr]=cqbc&_SESSION[duomi_ckstr_last]=&_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin

直接传参

image-20220314220329120
image-20220314220345392

成功进入后台

image-20220314220520220

得到flag

如何防御呢???不允许传session就可以达到一定的防御