ThinkPHP 6.0.11 存在多语言目录穿越、反序列化POP链及任意文件写入风险,需禁用LoadLangPack中间件、关闭lang_switch_on、正则约束路由变量、拦截路径遍历字符、清除pearcmd等扩展,并升级至6.0.14或替换Route.php补丁。

ThinkPHP 6.0.11 存在已知的路由解析与参数绑定相关安全风险,但需明确:官方未单独为 v6.0.11 发布 CVE 或专项公告,该版本实际处于 v6.0.x 的中间迭代阶段(v6.0.0–v6.0.13 范围内),其暴露的问题多与以下三类漏洞交叉关联:
- 多语言功能引发的目录穿越 +
pearcmd远程命令执行(需开启think_lang路由变量) - 任意文件写入(影响 v6.0.0–v6.0.1,依赖 session 写入路径可控)
- 反序列化 POP 链触发(v6.0.12 LTS 前普遍存在,v6.0.11 同样未修复)
因此,“修复 v6.0.11 路由漏洞”本质是堵住路由入口层可被滥用的危险行为链,而非仅修改某条路由规则。以下是直接可用、无需二次验证的实操步骤:
确认当前版本并停用高危路由特性
进入项目根目录,执行:
php think version —— 确认输出为 v6.0.11
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即关闭非必要功能:
- 注释或删除
app/middleware.php中启用thinkmiddlewareLoadLangPack的行(禁用多语言自动加载) - 检查
config/app.php,将'lang_switch_on' => true改为false - 若未使用多语言,直接删除
thinkphp/lang/目录(防止think_lang路由变量被解析)
加固路由定义与参数校验
所有显式定义的路由,必须强制约束变量格式和长度,禁止通配符裸奔:
- 避免使用
/:id这类无限制路由,改用正则限定:Route::get('user/:id', 'user.read')->pattern(['id' => 'd{1,8}']); - 对含点号、斜杠、双斜杠的参数做拦截,在全局中间件中加入:
if (strpos($request->url(), '..') !== false || preg_match('/[/\\]{2,}/', $request->url())) { return abort(400); } - 禁用动态方法调用:检查控制器中是否使用
input('s')或input('a')拼接类/方法名,一律改为白名单映射
清理与隔离扩展风险组件
v6.0.11 默认不带 pearcmd,但若项目手动引入过第三方扩展(如旧版 pear 工具包),需彻底清除:
- 搜索整个项目:
grep -r "pearcmd" . --include="*.php",定位并删除所有相关文件 - 检查
extend/目录,移除pearcmd/、phpunit/、phpmailer/等调试/测试类库(生产环境无需) - 确认
composer.json中无"pear/pear-core-minimal"或类似 dev-only 依赖,运行composer remove pear/pear-core-minimal
升级或打补丁的务实选择
v6.0.11 不再受官方支持,继续使用存在持续风险。推荐两个落地方案:
-
稳妥升级:执行
composer update "topthink/framework:^6.0.14"(v6.0.14 是 v6.0.x 最终安全版,已修复目录穿越与反序列化关键链) -
最小补丁:若无法升级,手动替换核心文件:
下载 v6.0.14 的 thinkphp/library/think/Route.php,覆盖本地同路径文件(仅此一个文件即可阻断多数路由层利用)


















