一、一条“路径”,可以走向系统崩溃
文件路径遍历漏洞(Path Traversal Vulnerability),俗称“目录穿越”漏洞,是一种经典而又常被忽视的安全风险。攻击者通过构造特殊路径,如 ../../../etc/passwd
,试图绕过服务器的访问控制机制,访问或读取系统上原本受保护的文件。
这种漏洞看似简单,却屡屡出现在现代Web应用、微服务、容器和API系统中,其危害之深常常被开发与测试人员低估。更令人警惕的是,路径遍历漏洞往往作为更高级攻击(如RCE、本地提权、敏感信息泄露)的前置步骤,具有极高的战术价值。
本文将从原理解析、检测思维、手动与自动化检测技巧、代码审计关注点、AI辅助方法等多个维度,深入讲解文件路径遍历漏洞的检测技术,旨在提升安全测试人员的洞察力和实战能力。
二、路径未受控,文件任意读
1. 漏洞定义(OWASP术语)
路径遍历漏洞(Path Traversal) 是指攻击者通过向应用提交经过特殊构造的路径参数,使应用访问到原本无权访问的文件资源,突破目录边界限制。
2. 攻击载荷示例
GET /download?file=../../../../etc/passwd
常见绕过方式:
-
..%2F..%2F..%2Fetc%2Fpasswd
-
....//....//....//etc/passwd
-
%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
(Unicode编码)
3. 受影响的常见接口:
-
下载文件接口
/download?file=...
-
图片/资源加载接口
/image?path=...
-
日志查看接口
/view?log=...
-
静态资源代理
/static?f=...
三、路径遍历检测策略与思维框架
核心思维:路径参数 + 拼接路径 + 缺乏验证 = 风险爆发点
检测前需明确三件事:
-
应用是否允许用户指定路径或文件名?
-
是否进行了路径清理、白名单限制或沙箱处理?
-
是否存在文件系统暴露风险(Linux/Windows、挂载点等)?
路径遍历识别“三段论”:
识别要素 | 检查内容 |
---|---|
输入点识别 | 有哪些参数或HTTP路径包含文件路径 |
拼接模式识别 | 服务端是否直接拼接路径而无验证 |
读取逻辑识别 | 最终是否通过open() 、File() 等API访问文件 |
四、渗透测试人员的黑盒视角
1. 利用操作系统特性构造绕过路径
-
UNIX 风格:
-
../../../../etc/passwd
-
%2e%2e/%2e%2e/%2e%2e/etc/passwd
-
使用 NULL 字节绕过:
file=../../etc/passwd%00.png
(旧PHP)
-
-
Windows 风格:
-
..\\..\\boot.ini
-
..\..\..\windows\win.ini
-
\\?\C:\Windows\System32\drivers\etc\hosts
-
2. 检测“含糊错误信息泄露”
观察返回值:
-
200 + 内容片段(如
root:x:0:0:
)→ 可读 -
403/404 → 拒绝或不存在,但路径可能仍被解析
-
500 → 文件读取时程序异常(空指针、路径错误)
3. 利用已有文件作为探针
-
Linux探针:
/etc/passwd
、/proc/self/environ
-
Windows探针:
C:\boot.ini
、C:\Windows\win.ini
-
Tomcat探针:
/WEB-INF/web.xml
⚠️ 建议结合目录爆破工具(如 DirBuster、ffuf)寻找“文件包含”型参数
五、自动化检测工具与技术
1. 专业扫描器支持
工具 | 功能亮点 |
---|---|
Burp Suite + BApp插件(Path Traversal Scanner) | 自动识别路径相关参数并尝试遍历 |
ZAP | 可自定义Fuzzer Payloads |
Nuclei | 使用模板自动探测路径遍历漏洞 |
Nikto | 支持部分路径遍历模式识别 |
2. DAST工具策略建议
-
优先扫描
/download
,/log
,/view
,/static
等路径参数 -
对路径参数强制注入
../
组合,结合URL编码绕过检测 -
模拟常见Web容器的目录结构
六、白盒检测与代码审计技巧
1. 关键危险函数定位(按语言)
语言 | 高风险函数示例 |
---|---|
Java | FileInputStream , new File() , Servlet.getRealPath() |
Python | open() , os.path.join() (不安全拼接) |
PHP | file_get_contents() , include() , require() |
Node.js | fs.readFile() , fs.createReadStream() |
2. 编码审计要点
-
路径是否来源于用户输入?
-
是否使用了
realpath()
、basename()
、path.normalize()
等清理逻辑? -
是否做了严格的白名单校验?(如仅允许
.pdf
文件,或特定目录内) -
是否检查路径是否“越界”目标根目录?(如限制在
/var/app/data/
)
✅ 推荐:引入沙箱路径检查机制,使用
chroot()
或根路径前缀白名单对比
七、AI与路径遍历检测的融合探索
1. 大模型进行静态代码审计
基于 LLM(如 GPT-4)可进行语义级代码审查,提示潜在的路径拼接风险,如:
def read_file(user_input):
return open("/data/uploads/" + user_input).read()
LLM能理解拼接模式并提示“缺乏目录边界验证”。
2. AI辅助渗透测试
-
自动生成路径遍历Payload变种
-
结合AI判断返回响应是否为敏感文件(识别
/etc/passwd
格式、错误模式) -
LLM辅助构建定制测试脚本(如自动探测应用结构并组合路径)
八、防御与修复建议
方法 | 说明 |
---|---|
路径规范化 | 使用 realpath() 或 path.normalize() 清理路径 |
白名单校验 | 仅允许访问指定目录、特定后缀文件 |
文件系统隔离 | 将上传目录与系统关键文件物理隔离 |
权限最小化 | 限制Web服务进程文件系统访问权限 |
沙箱机制 | 如chroot、容器化运行,防止跨目录访问 |
九、漏洞虽“旧”,思维需“新”
路径遍历漏洞不是技术复杂度高的漏洞,但它检验的是开发的边界意识、测试的攻击思维、运维的隔离策略,更体现了组织对“最小信任”的真正理解。
它不会在视觉界面中跳出警告,而是藏在那一层未经验证的路径拼接、一段模糊的日志查看接口中,静静等待被利用。对于专业的安全团队而言,路径遍历漏洞检测不只是“扫描”,更是对“系统边界感知能力”的一次体检。