ThinkPHP 6.0.14是修复版本,非漏洞版本;CVE-2022-38352等漏洞已在该版本修复,需确认实际运行版本是否为6.0.14+,并排查残留不安全配置、多语言lang参数路径遍历及用户输入拼接include等风险。

ThinkPHP 6.0.14 本身不是漏洞版本,而是修复版本。CVE-2022-38352(反序列化RCE)和多个文件包含相关风险(如多语言lang参数路径遍历、Session ID任意文件操作等)在 6.0.14 及以上版本中已得到官方修复。因此,“修复ThinkPHP 6.0.14的文件包含漏洞”这个说法存在前提错误——6.0.14 没有已知公开的文件包含漏洞,它正是用来修复旧版本问题的。
真正需要关注的是:
✅ 你是否误将低版本(如6.0.0–6.0.13)当作6.0.14运行?
✅ 是否升级后仍残留不安全配置或自定义代码?
✅ 是否混淆了“文件包含漏洞”与“反序列化触发的任意代码执行”或“lang参数目录遍历”等不同机制?
下面分三类常见风险场景,说明如何确认并加固:
确认是否真的在用6.0.14+
检查 composer.lock 或执行:
php think version # 或查看 vendor/topthink/framework/composer.json 中 "version": "v6.0.14"
若显示低于6.0.14,请立即升级:
立即学习“PHP免费学习笔记(深入)”;
composer require topthink/framework:^6.0.14
防御多语言(lang参数)导致的路径遍历
该风险存在于6.0.13及以下,但即使升级,若项目手动启用了LoadLangPack中间件且未校验输入,仍可能被利用。
关键防护点:
- 检查
app/middleware.php是否注册了\think\middleware\LoadLangPack::class - 若无需多语言,直接在
config/lang.php中设'switch' => false - 若必须启用,确保对
lang参数做严格路径校验:$lang = $request->param('lang', 'zh-cn'); $baseDir = realpath(config('lang.path', app()->getAppPath() . 'lang')); $target = realpath($baseDir . DIRECTORY_SEPARATOR . basename($lang)); if (!$target || strpos($target, $baseDir) !== 0) { throw new HttpException(400, 'Invalid lang parameter'); }
阻断用户可控路径的include行为(通用原则)
ThinkPHP本身不直接暴露include()调用,但开发者若在控制器/中间件中自行拼接路径(例如 include input('file') . '.php'),就会引入LFI风险。
必须做到:
- 禁止将任何用户输入(GET/POST/cookie/header)直接用于
include、require、file_get_contents等函数 - 如需动态加载,使用白名单映射:
$allowed = ['home', 'about', 'contact']; $page = input('page'); if (in_array($page, $allowed)) { include './pages/' . $page . '.php'; } - 启用 PHP 配置限制:
allow_url_include = Off allow_url_fopen = Off
不复杂但容易忽略



















