ThinkPHP 3.x目录遍历漏洞源于未规范校验用户输入路径,导致../等跳转符绕过限制;需强制realpath规范化+根目录限定、禁用危险函数直传、后缀白名单校验,并升级至TP6.x。

TP框架目录遍历漏洞怎么产生的
ThinkPHP(尤其是3.x老版本,如TP3.2.3)在处理用户可控的文件路径参数时,若直接拼接字符串用于include、file_get_contents、fopen或模板加载等操作,且未对输入中的../、..\、URL编码变体(如%2e%2e%2f、%c0%ae%c0%ae%2f)做统一过滤和规范化校验,就极易触发目录遍历。
典型场景包括:
- 附件预览/下载接口中,用
$_GET['file']拼接服务器绝对路径 - 模板渲染时动态加载
$_COOKIE['TEMPLATE']或$_GET['tpl'] - 后台“模版管理”“附件管理”等功能中,允许用户指定路径但未限制根目录范围
- 日志/缓存文件读取接口暴露了
filename参数,且未白名单校验后缀
常见攻击手法与Payload示例
攻击者会围绕路径跳转符构造多种绕过方式,尤其针对TP旧版默认不自动解码、不规范路径的特性:
-
?file=../../../etc/passwd—— 基础Unix遍历 -
?file=..%2f..%2f..%2fwindows%2fsystem.ini—— URL编码斜杠 -
?file=%c0%ae%c0%ae%2fetc%2fpasswd—— UTF-8双字节绕过(影响部分配置为URIEncoding=UTF-8的Tomcat+TP组合) -
?file=....//....//....//etc/passwd—— 多点混淆,部分WAF误判为无效 - 结合上传功能:
filename=../../public/shell.php—— 实现任意路径写入
关键修复措施(TP3.2.3及兼容版本)
不能只依赖“过滤../”,必须从输入、路径、输出三环节设防:
-
强制路径规范化 + 根目录限定:使用
realpath()解析用户输入路径后,检查是否以预期安全根目录(如APP_PATH . 'Common/Template/')开头;拒绝任何解析后超出该范围的路径 -
禁用危险函数的原始参数直传:避免
include($_GET['tpl'])这类写法;改用映射表或ID查表机制,例如$map = ['login'=>'login.html', 'user'=>'profile.html']; include(TPL_PATH . $map[$_GET['id']]); -
后缀白名单硬校验:对所有文件操作参数,先
pathinfo($filename, PATHINFO_EXTENSION)提取扩展名,仅允许['html','htm','txt','pdf','jpg','png']等业务必需类型 -
关闭调试模式下的敏感信息泄露:确保
APP_DEBUG = false,防止错误页面暴露出真实物理路径 -
Web服务器层加固:Apache加
.htaccess禁止访问config/、data/等敏感目录;Nginx配置location ~ ^/(config|data|runtime)/ { deny all; }
升级与替代建议
TP3.2.3已停止官方维护,存在多个已知高危漏洞(含SQL注入、RCE、目录穿越)。生产环境应尽快迁移:
- 升级至TP6.x LTS版本,其内置
think\File类默认进行路径安全校验,view组件也限制模板路径范围 - 若无法升级,至少打上社区补丁(如
ThinkPHP3.2.3-PathTraversal-Fix),并配合WAF规则拦截含../、%2e%2e、%c0%ae的请求 - 对所有文件类操作接口增加日志审计,记录
file、path、template等参数原始值与解析后路径,便于溯源

















