1.变量覆盖定义
变量覆盖指的是可以用我们的传参值替换程序原有的变量值
2.风险
变量覆盖漏洞有的时候可以直接让我们获取Webshell,拿到服务器的权限
3.寻找变量覆盖
经常导致变量覆盖漏洞场景有:
1. $$使用不当 2. extract()函数使用不当, 3. parse_str()函数使用不当 4. import_request_variables()使用不当,开启了全局变量注册等
3.1.经常引发变量覆盖漏洞的函数
extract() parse_str() import_request_variables()
3.1.1.extract()函数
3.1.1.1.作用
从数组中将变量导入到当前的符号表
将数组中的内容转化为变量
3.1.1.2.实例
$a = "1"; $my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); extract($my_array); echo "\$a = $a; \$b = $b; \$c = $c"; ?>
运行结果:
$a = Cat; $b = Dog; $c = Horse
3.1.1.3.CTF举例
3.1.2.parse_str()
3.1.2.1.作用
将查询字符串解析到变量中
3.1.2.2.实例
<?php parse_str("name=zkaq&&age=60"); echo $name."<br>"; echo $age; ?>
parse_str("name=Bill&age=60") 相当于完成了$name ='zkaq'和$age ='60'
3.1.2.3.
如果在parse_str中可以直接传参,也可以覆盖变量
3.1.3.$$
不仅仅是函数会导致变量覆盖,有些特殊符号的特殊搭配也会引起变量覆盖漏洞,比如$$
3.1.3.1.代码实例
$a = 1; foreach(array('_COOKIE','_POST','_GET') as $_request) { foreach($$_request as $_key=>$_value) {$$_key=addslashes($_value);}} echo $a; ?>
4.本地测试
DuomiCMS
4.1.本地搭建环境
4.1.1.将源码放入WWW目录
4.1.2.安装
4.2.Seay代码审计系统
4.2.1.开启数据库监控
4.2.2.登录后台
4.2.3.更新数据库监控
4.2.4.规则管理
4.3.审计
4.3.1.添加一个匹配$$的规则
([^\$"]|$)\$\{?\$或者简单点\$\$
4.3.2.开始
4.3.3.发现一个存在变量覆盖的地方
duomiphp\common.php文件
4.3.4.定位函数
4.3.5.
get_magic_quotes_gpc()
判断是否开启魔术引号
4.3.6.变量覆盖需满足的条件
1.有传参
2.键名没有有cfg_和GLOBALS
3.COOKIE传参中没有$_k
同时满足会进入exit函数,那三条只要有一条不满足,就会产生变量覆盖漏洞
4.3.7.包含common.php文件的地方
admin目录下的login.php文件中包含了common.php文件
这个页面还调用了check.admin.php
4.3.8.check.admin.php
输出常量duomi_INC,exit(duomi_INC)
发现为常量duomi_INC的值为duomiphp,在该目录下找到check.admin.php文件
该文件为控制session的,可以通过common.php进行一个伪造session
4.3.8.1.session
Session与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
Cookie为什么有权限 -> 使用了session,访问网页,留一个空间,里面可以通过代码 例如session里有admin=1,可以判断为管理员
4.3.9.session的值
设置session值进行赋值来获得权限,groupid是权限的意思,全局搜索,发现groupid为1的时候,为管理员
4.4.本地测试攻击
4.4.1.退出admin账号
4.4.2.构造攻击
interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin
4.4.3.再次访问admin目录
自动登录上了,因为session已经和当前用户cookie配对了