ThinkPHP 5.0系列存在控制器绕过RCE和preg_replace /e代码执行等高危漏洞,TP6.0.0–6.0.13则存在CVE-2024-48112反序列化RCE漏洞,需立即升级至≥6.0.14并禁用危险配置。

ThinkPHP6.0和5.0漏洞差异极大,不是补丁级区别而是攻击面重构——TP5.0系列仍广泛存在未修复的控制器绕过RCE、preg_replace /e代码执行等可直接getshell的高危漏洞,而TP6.0虽引入更严输入校验,却在6.0.13及之前版本中埋有CVE-2024-48112反序列化RCE这个致命坑,攻击者仅需一个可控参数即可远程执行系统命令,且该漏洞在Linux与Windows环境均稳定触发。
先确认你当前到底在用哪个“5.0”或“6.0”
这一步不能跳:很多项目自称“TP5”,实际是5.1.22这种已停止维护的老版本;也有项目标着“TP6”,但composer show topthink/framework输出的是6.0.12——这种版本号才是真实依据。
执行命令查看真实版本:php think version 或检查 composer.lock 中 topthink/framework 的 exact version 字段。
【必须立刻停用TP5.0.x全系及TP5.1.29及以下版本】——它们存在控制器名绕过漏洞(如?s=index/ hink pp/invokefunction),PHP 7.1+下可直接调用call_user_func_array执行任意函数,无需登录即可RCE。
TP6.0升级安全基线操作
如果你当前是TP6.0.0–6.0.13,请立即执行以下操作:
① 运行 composer update topthink/framework:^6.0.14,这是唯一有效的漏洞修复方式;
② 升级后验证是否生效:访问任意不存在的URL路径(如 /testabc),观察响应头中 X-Powered-By 是否显示 ThinkPHP v6.0.14;
③ 检查 config/app.php 中是否仍存在 'url_route_must' => false 这类危险配置,若存在,改为 true 并重启服务——该配置关闭路由强制匹配,会放大CVE-2024-48112的利用成功率。
注意:不要试图用 php.ini 禁用 unserialize() 来“缓解”CVE-2024-48112,这会导致缓存失效、会话中断等连锁故障,属于掩耳盗铃。
TP5.x项目迁移至TP6.0的硬性前提
这不是“升级”,而是重写级迁移。必须满足以下三条才可启动:
方法一:PHP环境确认
确保服务器PHP ≥ 7.1.0(推荐8.0+),且已启用 mbstring、json、openssl、fileinfo 四个扩展;漏掉 fileinfo 会导致TP6模板编译失败、上传类无法识别MIME类型。
方法二:配置结构重置
删除旧版 config.php,按TP6规范新建 config/app.php、config/database.php 等文件;.env 必须命名为 .env(不能是 .env.local),且其中数据库密码含特殊字符时要用双引号包裹,例如 DB_PASSWORD="p@ss#word!"。
方法三:核心调用方式重构
控制器方法必须声明 Request 类型参数和返回类型,例如:public function index(Request $request): Json;所有 Db::name() 调用需改用容器注入或 app('db') 获取实例,直接 new 实例或静态调用将报错。
多语言功能必须立刻加固
TP6.0.13及更早版本中,?lang=../../../../etc/passwd 可直接导致任意文件读取——这不是配置问题,而是 Lang::load() 内部未做路径净化的硬伤。
临时方案:将 config/lang.php 中 'switch' => true 改为 false,彻底禁用运行时语言切换;
长期方案:升级到 ≥6.0.14 后,在中间件中加入白名单校验:in_array($this->request->param('lang'), ['zh-cn', 'en-us']),非列表内值直接抛出400错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











