1. 简介
路径遍历攻击(Path Traversal Attack)是一种常见但极具破坏力的安全漏洞。它利用应用程序中对文件或目录访问控制的疏漏,试图访问系统中本不应被公开访问的文件或目录。攻击者可以借此读取应用源码、敏感数据,甚至操作系统关键文件,例如 /etc/passwd
。
这类攻击在 Web 应用、文件下载接口、上传解压功能中尤为常见。接下来我们将从攻击原理、常见手法、防御策略等方面深入分析。
2. 路径遍历漏洞原理
简而言之,攻击者的目的是访问本不应被允许访问的文件系统路径。这可能包括:
✅ 读取敏感文件(如配置文件、密码文件)
✅ 修改文件内容(如上传恶意文件)
✅ 注入后门程序或创建新用户账户
常见攻击方式
攻击通常通过构造特殊路径参数实现,例如:
http://www.somecompany.com/someapp/download?file=../../../../../../etc/passwd
这个例子中,攻击者使用 ../
序列尝试访问 Web 根目录之外的系统文件。在 Linux 中,../
表示“返回上一级目录”,Windows 中则为 ..\
。这种攻击也被称为 dot-dot-slash 攻击。
路径绕过编码技巧
为了绕过简单的过滤逻辑,攻击者常常对路径进行编码混淆,例如:
.
可以用%2e
、%252e
(双编码)、%c0%ae
(UTF-8 编码)/
可以用%2f
、%252f
、%c0%af
\
可以用%5c
、%255c
、%c1%9c
:
可以用%3a
、%253a
、%c0%3a
这类编码方式会绕过一些简单字符串匹配的过滤机制。
其他攻击场景
除了 HTTP 接口,路径遍历也可能出现在:
✅ ZIP 文件解压(如未处理文件名中的 ../
)
✅ 本地文件读取功能(如日志查看器)
✅ 文件上传功能(上传后被服务端执行)
3. 防御路径遍历攻击
路径遍历是勒索软件攻击的常见入口之一。攻击者通过上传恶意代码、修改应用逻辑,诱导服务器执行恶意脚本。因此,我们必须采取有效手段进行防御。
推荐防御策略
✅ 避免直接使用用户输入作为文件路径
- 不要将用户输入拼接到文件操作路径中,尤其是
java.io.File
、FileInputStream
、FileOutputStream
等 API 的使用
✅ 限制应用权限
- 应用应以最小权限运行,仅能访问必要的路径
- 使用受限账户启动服务,避免使用 root 或管理员权限
✅ 使用 chroot 限制文件访问范围
- 通过
chroot
将应用限制在一个“虚拟根目录”中,防止访问外部文件系统
✅ 严格验证用户输入
- 对文件名进行白名单校验(如只允许字母、数字、下划线)
- 拒绝包含
../
、..\
、%2e
、%2f
等可疑字符的输入 - 解码后再次校验(防止多层编码绕过)
✅ 使用安全库处理路径
- Java 中可使用
java.nio.file.Paths.get()
+normalize()
检查路径是否越界 - 使用
java.nio.file.Files.isSameFile()
判断目标路径是否在允许目录下
示例:Java 中路径安全处理
import java.nio.file.*;
public class FilePathValidator {
private static final Path BASE_DIR = Paths.get("/safe/uploads").toAbsolutePath();
public static Path validatePath(String userInput) throws Exception {
Path targetPath = BASE_DIR.resolve(userInput).normalize();
if (!targetPath.startsWith(BASE_DIR)) {
throw new SecurityException("Invalid path: attempted path traversal");
}
return targetPath;
}
}
这段代码确保用户输入的路径不会超出 /safe/uploads
目录范围。
4. 总结
路径遍历漏洞虽然原理简单,但破坏力极强。一个未验证的文件名参数就可能造成整个系统沦陷。攻击者通过编码绕过、文件上传、压缩包解压等方式,不断寻找突破口。
作为开发人员,我们应当时刻警惕用户输入,不要相信任何外部输入。通过严格的输入校验、权限控制、路径限制等手段,可以有效防范路径遍历攻击。
✅ 核心防御原则:永远不要直接使用用户输入作为路径
✅ 最小权限 + 输入校验 + 安全 API + 安全编码习惯 = 安全基础