修复 ThinkPHP 5 反序列化漏洞最稳妥的办法是升级到官方发布的最新安全版本。如果业务无法立即通过 Composer 升级,则需要手动替换核心框架目录或应用官方提供的安全补丁文件,并严格限制控制器访问。
先说结论:官方已发布多个安全版本修复已知风险,优先通过包管理工具升级核心框架,无法升级时再考虑手动修补。
- 先判断:确认当前项目使用的 ThinkPHP 具体版本号及是否修改过核心文件
- 优先做:通过 Composer 升级到 5.x 系列的最新维护版本或迁移至 6.x/8.x
- 再验证:检查版本号文件并使用安全扫描工具确认漏洞是否消除
Composer 升级方案
如果项目使用 Composer 管理依赖,请修正包名为 topthink/framework(注意中间无横杠),并在项目根目录执行以下命令。
1. 升级至 5.1 系列最新维护版本
修改 composer.json 中的版本约束,或直接使用 require 命令指定版本:
composer require topthink/framework:5.1.*2. 更新依赖
如果已修改配置文件,执行更新命令:
composer update topthink/framework3. 配置示例
确保 composer.json 中包含正确的依赖配置:
{
"require": {
"topthink/framework": "^5.1"
}
}手动补丁应用步骤
若服务器无法连接 Composer 仓库或业务锁定旧版本,可采用手动替换核心文件的方式。
1. 备份当前代码
在进行任何升级或修改前,务必对当前代码目录和数据库进行完整备份,以便出现问题时回滚。
2. 下载官方修复版本
访问 ThinkPHP 官方 GitHub 仓库,下载对应系列(如 5.1.x)的最新 Release 包。不要直接下载 master 分支,请选择带有 Release Tag 的稳定版本。
3. 替换核心目录
将下载包中的 thinkphp 目录覆盖项目中的同名目录。注意:不要覆盖项目的 application、config 或 public 目录,仅替换框架核心。
4. 关键文件检查(如需手动修改)
如果无法替换整个目录,需重点检查 thinkphp/library/think/Request.php。历史漏洞多源于此处对输入变量的过滤缺陷。官方修复方案通常涉及增加对反序列化数据的严格过滤。建议直接对比官方修复版本的该文件差异,将过滤逻辑同步到当前文件,而非自行编写过滤规则。
漏洞验证方法
升级或补丁应用后,需通过以下方法验证修复是否生效。
1. 版本号检查
查看项目根目录或 vendor 目录下的版本文件,通常是 thinkphp/base.php。确认 THINK_VERSION 常量已变更为官方最新的安全版本。
cat thinkphp/base.php | grep THINK_VERSION2. 配置检查
确保 config.php 中未开启不必要的调试模式,生产环境应关闭 app_debug。部分补丁需要配合配置调整才能生效。
'app_debug' => false,3. 安全行为测试
在测试环境中,尝试发送包含特殊构造参数的请求。修复后的版本应拒绝执行恶意序列化数据,通常表现为返回标准错误页面而非执行代码或抛出敏感堆栈信息。可使用常见的 Web 漏洞扫描工具对目标 URL 进行扫描,观察是否还能检测到 ThinkPHP 远程代码执行漏洞。
常见坑与排查
1. 核心文件被篡改
如果之前为了修复漏洞手动修改过 Request.php 等核心文件,Composer 升级可能会覆盖这些修改,或者手动修改未覆盖到所有漏洞点。建议直接升级官方完整核心。
2. 缓存未清除
升级后如果网站表现异常,尝试清除 runtime 目录下的缓存文件。OPcache 等 PHP 缓存也可能导致旧代码依然生效,必要时重启 PHP 服务。
rm -rf runtime/*
service php-fpm restart3. 依赖冲突
升级框架核心可能导致部分第三方扩展不兼容。升级前请在测试环境验证业务功能是否正常,特别是涉及模型操作和请求绑定的功能。
参考来源
- ThinkPHP 官方 GitHub 仓库:https://github.com/top-think/framework
- ThinkPHP 官方网站:https://www.thinkphp.cn