变量覆盖漏洞全面解析与实战教学
1. 变量覆盖定义
变量覆盖指的是攻击者可以通过传入的参数值替换程序原有的变量值,从而改变程序执行流程或获取不当权限的安全漏洞。
2. 变量覆盖的风险
- 可能导致获取Webshell
- 可能直接获取服务器权限
- 可绕过身份验证机制
- 可篡改关键程序变量
3. 变量覆盖常见场景
3.1 导致变量覆盖的常见函数
3.1.1 extract()函数
作用:从数组中将变量导入到当前的符号表,将数组中的内容转化为变量。
示例代码:
$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.2 parse_str()函数
作用:将查询字符串解析到变量中。
示例代码:
parse_str("name=zkaq&&age=60");
echo $name."<br>";
echo $age;
等效操作:
$name = 'zkaq';
$age = '60';
风险:如果直接传入用户可控的查询字符串,可能导致变量被覆盖。
3.1.3 import_request_variables()函数
作用:将GET/POST/Cookie变量导入到全局作用域中。
风险:此函数在PHP 5.4.0中已被移除,但在旧版本中可能导致严重的变量覆盖问题。
3.2 特殊符号导致的变量覆盖
3.2.1
\[符号使用不当 **示例代码**: ```php $a = 1; foreach(array('_COOKIE','_POST','_GET') as $_request) { foreach( \]
_request as \(_key=>\)_value) {
\[_key = addslashes($_value); } } echo $a; ``` **风险**:此代码会遍历所有请求参数,并将它们注册为变量,可能导致任意变量被覆盖。 ## 4. 变量覆盖漏洞挖掘方法 ### 4.1 代码审计要点 1. 搜索以下关键词: - `extract(` - `parse_str(` - `import_request_variables(` - ` \]
` (变量变量)
-
检查这些函数是否处理了用户可控的输入
-
检查是否有对关键变量名的过滤机制
4.2 使用Seay代码审计系统
- 开启数据库监控
- 登录后台进行测试
- 更新数据库监控记录
- 在规则管理中添加匹配规则(如
\$\$)
5. 实战案例:DuomiCMS变量覆盖漏洞分析
5.1 漏洞位置
duomiphp/common.php文件中存在变量覆盖代码
5.2 漏洞条件分析
变量覆盖需满足以下条件之一:
- 有传参
- 键名没有
cfg_和GLOBALS前缀 - COOKIE传参中没有
$_k
只要有一条不满足,就会产生变量覆盖漏洞。
5.3 漏洞利用链
admin/login.php包含了common.phplogin.php调用了check.admin.phpcheck.admin.php输出常量duomi_INC并退出- 通过
common.php可以伪造session
5.4 Session机制分析
- Session与Cookie功能相似但存储在服务端
- 通过设置session值可以伪造身份
- 当
groupid=1时表示管理员权限
5.5 实际攻击步骤
- 退出admin账号
- 构造攻击URL:
interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin - 再次访问admin目录,系统会自动登录
6. 防御措施
- 避免使用危险函数:尽可能不使用
extract()、parse_str()等函数 - 使用安全替代方案:
- 使用
$_GET['key']而非extract() - 使用
parse_str()时指定输出数组参数
- 使用
- 严格过滤输入:
- 检查变量名是否合法
- 禁止覆盖关键变量(如前缀检查)
- 禁用危险配置:
- 关闭
register_globals - 不使用
import_request_variables()
- 关闭
- 使用最新PHP版本:新版PHP已移除或限制了许多危险函数
7. 总结
变量覆盖漏洞是一种常见但危害严重的安全问题,主要源于PHP中某些函数和特性的不当使用。通过本文的分析,我们了解了:
- 导致变量覆盖的主要函数和语法
- 如何审计代码寻找此类漏洞
- 实际案例中的利用方法
- 有效的防御策略
开发人员应充分认识这些风险,在编码时采取预防措施,安全人员则可以利用这些知识进行有效的漏洞挖掘和防护。