ThinkPHP 5.1.31需实测验证RCE修复有效性:检查路由层拦截非法命名空间调用、_method参数属性覆盖、反序列化入口清除、缓存序列化配置及调试模式关闭,确保无敏感信息泄露。

ThinkPHP 5.1.31 本身是官方修复 CVE-2018-20062、CVE-2018-1002015 等 RCE 漏洞的安全版本,但若你自行升级至此版本,或在旧版基础上打了补丁,仍需验证修复是否真正生效。验证不能只看版本号,而要从请求入口、行为响应和底层逻辑三方面实测。
检查路由层是否拦截非法命名空间调用
攻击者常通过 ?s=index/\think\app/invokefunction 或 ?s=/thinkconfig/get 绕过控制器校验。执行以下测试:
- 访问
http://your-domain.com/index.php?s=/think\app/invokefunction,应返回 404 或“控制器不存在”,而非 PHP 错误页或空白响应 - 访问
http://your-domain.com/index.php?s=index/\think\process\pipes\Windows,同样应被拒绝(注意 Windows 类是 POP 链关键起点) - 若启用强制路由,
'url_route_must' => true生效时,所有未明确定义的/think\*路径都应直接 404
验证 Request::method() 是否已加固
原漏洞依赖 _method=__construct 触发属性覆盖。构造 POST 请求测试:
- 发送
POST /index.php?s=index,Body 含:_method=__construct&filter[]=phpinfo&method=get - 正常响应应为 400、302 或普通页面,不能执行 phpinfo(),也不能返回函数输出或报错堆栈
- 检查响应头中是否含
X-Powered-By: ThinkPHP,若存在且无详细类路径/文件行号,说明app_debug => false已生效
确认反序列化入口已被清除或隔离
即使框架层修复,业务代码仍可能引入风险。重点验证:
- 全局搜索项目中是否存在
unserialize(、base64_decode.*unserialize,尤其出现在控制器或中间件中接收input('data')、$_POST['payload']后的代码段 - 尝试传入伪造序列化字符串,如
POST /index.php带data=O:8:"stdClass":0:{},观察是否触发异常或日志告警(理想情况应被静默丢弃或 400 拒绝) - 检查缓存配置(
config/cache.php),若使用type => 'file'且'serialize' => true,需确认该配置已关闭或替换为json序列化
观察错误响应是否泄露敏感信息
调试模式未关闭会极大降低攻击门槛:
- 主动触发一个非法请求,例如访问不存在的控制器
?s=test/abc - 响应体中不应出现完整类名(如
think\route\dispatch\Url)、文件绝对路径、__destruct或__toString调用栈 - 正确表现是简洁提示:“控制器不存在”或 HTTP 404 页面,且无 PHP
Warning、Fatal error输出
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











