thinkphp任意文件读取漏洞本质是路径遍历与输入过滤缺失导致的权限失控,常见于多语言参数lang=和未鉴权api接口,可通过编码、大小写混用等手法绕过简单过滤,修复需结合白名单、路径规范化与强制鉴权。

ThinkPHP框架中任意文件读取漏洞,本质是路径遍历(Path Traversal)与输入过滤缺失共同导致的权限失控问题。它不依赖远程代码执行,却能直接暴露数据库配置、源码、系统凭证等关键信息,是渗透测试中高频发现、危害明确的一类高利用价值漏洞。
常见触发点:多语言加载与未授权接口
漏洞常出现在两类典型场景:
-
多语言参数 lang=:如
/index/ajax/lang?lang=../../application/database。框架将用户传入的 lang 值拼接到语言文件路径中,未校验是否超出允许目录范围,导致可向上回溯读取任意文件。 -
未鉴权的 API 接口:如 ThinkAdmin v6 的
/admin.html?s=admin/api.Update/node,参数rules控制文件列表,但未做身份验证和路径白名单限制,攻击者可传入["./"]或构造编码路径实现遍历。
绕过手法:编码、嵌套与白名单绕过
防御措施若仅做简单字符串过滤,往往容易被绕过:
- URL 编码两次:
%2e%2e%2f→../,绕过对明文..的检测; - 大小写混用:
..%c0%af(UTF-8 过度编码)或..%252f(双重编码),干扰 WAF 解析; - 利用白名单逻辑缺陷:如只允许读取
app/admin目录,但未规范化路径,app/admin/../../../etc/passwd仍可成功解析。
影响面广:从 FastAdmin 到 ThinkAdmin 再到原生 TP
多个基于 ThinkPHP 的主流项目均曾曝出同类问题:
- FastAdmin :通过
/index/ajax/lang读取application/database.php,直接获取数据库账号密码; - ThinkAdmin v6(CVE-2020-25540):未授权调用 Update::node 方法,配合 rules 参数实现任意文件读取与目录遍历;
-
ThinkPHP6 多语言本地包含:lang 参数未过滤,可加载并解析 PHP 文件(如
?lang=../../public/index),在特定条件下触发代码执行。
修复核心:白名单 + 路径规范化 + 权限隔离
有效修复不是加一层过滤,而是重构访问逻辑:
- 禁用动态文件路径拼接,改用预定义键值映射(如
lang_map = ['zh-cn' => 'zh-cn.php']); - 所有路径操作前调用
realpath()或框架内置的normalizePath(),再比对是否落在白名单根目录内; - 敏感功能(如配置读取、更新接口)必须强制鉴权,禁止未登录状态访问;
- 生产环境关闭调试模式(
app_debug=false)、禁用自动路由、限制日志输出级别。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











