ThinkPHP 3.2.0 全局变量覆盖漏洞源于早期初始化时未隔离用户输入,结合 extract()、可变变量及 register_globals 模拟逻辑,导致 $cfg_dbprefix 等关键变量被覆写;修复需入口过滤加固、危险操作清理、敏感变量强制初始化三管齐下。

ThinkPHP 3.2.0 的全局变量覆盖漏洞,本质是框架在早期初始化阶段对用户输入(尤其是 $_GET/$_POST/$_REQUEST)缺乏严格隔离,配合危险函数(如 extract())、不安全的可变变量写法(如 ${$_k} = ...),以及未关闭历史遗留配置(如 register_globals 模拟逻辑),导致攻击者可通过 URL 或表单参数直接覆写关键变量(如 $cfg_dbprefix、$where、$map 等),进而操控 SQL 查询、模板赋值或路由行为。
修复需聚焦三个层面:入口过滤加固、危险操作清理、关键变量防护,不能只依赖单一补丁。
关闭 REQUEST_VARS_FILTER 的虚假防护
ThinkPHP 3.2.0 默认开启 REQUEST_VARS_FILTER = true,但其内置的 think_filter() 函数仅在匹配到 EXP、IN 等关键词后尾部加空格($value .= ' '),完全无法阻止注入。
- 检查
Conf/config.php,确认未手动关闭该选项;若已关闭,则更危险——意味着零过滤。 -
必须移除或重写
think_filter()调用逻辑:在App.class.php的init()方法中,注释或删除对$_GET/$_POST/$_REQUEST的array_walk_recursive(..., 'think_filter')行。 - 替换为白名单式清洗:例如只允许字母、数字、下划线、短横线,其余字符统一替换为空或拒绝请求。
清理所有 extract() 和可变变量赋值
框架及项目代码中常见类似写法:
foreach($_POST as $k => $v) { ${$k} = $v; }
// 或
extract($_GET, EXTR_SKIP);
这类代码是变量覆盖的直连通道。
- 全局搜索
extract(、foreach.*\$_(GET|POST|REQUEST)、\$\{\$,逐个替换:- 用显式键名接收替代
extract(),如$id = I('get.id', 0, 'intval'); - 禁止
${$_k}写法,改用白名单数组映射,例如:$allowed = ['title', 'status', 'sort']; $data = []; foreach ($_POST as $k => $v) { if (in_array($k, $allowed)) $data[$k] = htmlspecialchars($v); }
- 用显式键名接收替代
强制初始化并锁定敏感变量作用域
未初始化的变量(如 $where = '' 缺失)或局部作用域变量(如控制器方法内 $map),极易被用户输入覆盖。
- 在所有控制器方法开头、模型操作前,主动声明并初始化:
-
$where = [];、$map = [];、$data = []; - 多维结构也需预设,如
$order = ['id' => 'DESC'];
-
- 对数据库查询条件(如
where()参数),禁止接收用户直接传入的数组(如?id[0]=exp&id[1]=...),改用字符串条件或严格校验键名:- 拒绝
['id' => ['exp', '...']]类型输入; - 若必须支持 EXP,仅限内部调用,且
id[0]值必须在白名单中(如'eq','neq','like'),排除'exp'。
- 拒绝
阻断 EXP 表达式执行链路
EXP 是 ThinkPHP 3.2 的设计缺陷,不是过滤能解决的。只要 where() 接收含 ['exp', 'xxx'] 的数组,就会在 parseThinkWhere() 中无条件拼接。
- 在
Model.class.php或基类CommonModel的where()方法中前置校验:if (is_array($where)) { foreach ($where as $key => $val) { if (is_array($val) && isset($val[0]) && strtolower($val[0]) === 'exp') { E('EXP not allowed in user input'); } } } - 同时检查所有调用点,如
M()->where(I('post.where'))->select(),改为M()->where(['id' => I('post.id', 0, 'intval')])->select()。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











