ThinkPHP 6.0.7存在未修复的lang参数路径遍历漏洞,可导致任意文件读取及RCE,需立即升级至6.0.14及以上版本,并配合禁用多语言开关、拦截非法lang参数、封堵日志目录Web访问、最小化生产配置等措施加固。

ThinkPHP 6.0.7 存在已知且未修复的多语言参数(lang)路径遍历漏洞,可导致任意文件读取,严重时结合 pearcmd.php 等组件触发远程代码执行(RCE)。该版本不包含官方修复,CVE-2022-38352 及相关文件包含风险在 6.0.14 才被正式解决。因此,“修补 6.0.7 的日志文件包含漏洞”本质是升级加固 + 配置清理 + 输入拦截三步并行。
以下为具体、可落地的操作项:
确认是否真在运行 6.0.7
运行命令验证实际版本:
php think version # 或查看 vendor/topthink/framework/composer.json 中 "version": "v6.0.7"
若确认为 6.0.7,说明系统处于高危状态,必须立即处理。
立即学习“PHP免费学习笔记(深入)”;
升级到安全基线版本(首选方案)
执行升级命令,覆盖至已修复版本:
composer require topthink/framework:^6.0.14 --update-with-dependencies
升级后务必检查:
-
config/lang.php中'switch' => false(如无需多语言) -
app/middleware.php中移除\think\middleware\LoadLangPack::class(除非强依赖且已校验) - 运行
php think clear清除配置与路由缓存
手动拦截 lang 参数路径遍历(升级前或过渡期必须)
若因兼容性暂无法升级,需在请求入口(如全局中间件或基础控制器)插入强制校验逻辑:
$lang = $request->param('lang', 'zh-cn');
$baseDir = realpath(config('lang.path', app()->getAppPath() . 'lang'));
$target = realpath($baseDir . DIRECTORY_SEPARATOR . basename($lang) . '.php');
if (!$target || strpos($target, $baseDir) !== 0) {
throw new HttpException(400, 'Invalid language identifier');
}⚠️ 注意:仅用 basename() 或正则替换 .. 是无效的,必须调用 realpath() 并做前缀比对。
封堵日志类间接利用路径(常见绕过点)
6.0.7 中攻击者常通过 lang=../../runtime/log/202610/xxx.log 加载含恶意 PHP 代码的日志文件。为此需:
- 禁用日志目录的 Web 可访问性:在 Nginx/Apache 中屏蔽
runtime/log/路径 - 设置
runtime/目录权限为750,属主为 Web 进程用户,禁止其他用户读写 - 在
config/log.php中关闭file日志的json格式(避免注入可解析的 PHP 结构)
关闭非必要功能,最小化攻击面
- 将
app_debug = false和show_error_msg = false设为强制生产配置 - 删除或重命名
public/static/下的测试文件、示例模板等冗余资源 - 检查第三方插件(如 FastAdmin、ThinkAdmin)是否自带
lang接口,禁用或打补丁
不复杂但容易忽略



















