thinkphp 5.1.29存在变量覆盖漏洞(cve-2018-20063),因控制器参数绑定未限制可写变量范围,攻击者可通过_method=__construct等参数覆盖属性,触发反序列化或代码执行;需确认版本、检查危险绑定方式、方法伪造入口及gadget链。

ThinkPHP 5.1.29 存在变量覆盖漏洞(CVE-2018-20063),本质是框架在处理控制器参数绑定时,未严格限制可写入的变量范围,导致攻击者可通过特定请求参数(如 _method=__construct 配合 filter、method 等)覆盖对象属性,进而触发反序列化、任意方法调用或代码执行。
确认是否使用易受攻击版本
该漏洞影响 ThinkPHP 5.1.x 的多个早期小版本,5.1.29 明确在受影响列表中。审计前需先确认:
- 查看项目
composer.json或thinkphp/library/think/Env.php中的版本声明 - 运行
php think version(若命令可用)或输出\think\Version::get() - 注意:升级至 5.1.31+ 或 5.1.37+ 可修复此漏洞(官方补丁已合并)
检查是否存在危险的参数绑定方式
漏洞触发关键路径是控制器中使用了不安全的参数自动绑定,尤其是以下模式:
-
public function index(Request $request)+ 直接使用$request->param()后赋值给对象属性 - 自定义方法中调用
input()、param()并配合array_merge()或extract()类函数动态导入变量 - 控制器构造方法或初始化方法中,对
$this->xxx进行无过滤的批量赋值(如foreach ($data as $k => $v) { $this->$k = $v; })
重点审计路由与请求方法伪造入口
该漏洞常通过 HTTP 方法伪造(_method 参数)触发,需检查:
- 是否启用
var_method配置(默认为_method),且未禁用 POST/PUT/PATCH 请求中的该参数解析 - 是否存在表单或 AJAX 请求显式提交
_method=__construct或_method=call_user_func_array等恶意值 - 检查中间件或全局过滤器是否对
_method、filter、callback等敏感键做过滤或白名单校验
验证是否存在可利用的 gadget 链
变量覆盖本身不直接执行代码,但可能为后续反序列化或魔术方法利用铺路。需排查:
- 项目中是否引入了存在危险
__destruct、__wakeup或__call方法的第三方类(如旧版 Guzzle、Monolog、PHPExcel) - 是否在控制器或模型中存在将用户可控变量传入
unserialize()、create_function()、assert()、eval()或模板渲染(fetch())的逻辑 - 检查
config/app.php中'default_filter'是否被设为用户可控输入(如input('filter')),这可能绕过基础过滤
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











