OWASP 类别: MASVS-STORAGE:存储
概述
路径遍历漏洞发生在攻击者可以控制路径的一部分,然后在未经验证的情况下将其传递给文件系统 API 时。这可能导致未经授权的文件系统操作。例如,攻击者可能会使用 ../
等特殊字符来意外更改资源目标,通过遍历目标目录之外的目录。
影响
影响根据操作和文件内容而有所不同,但通常会导致文件覆盖(写入文件时)、数据泄露(读取文件时)或权限更改(更改文件或目录权限时)。
缓解措施
使用 File.getCanonicalPath()
规范化路径,并将前缀与预期目录进行比较
Kotlin
@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
val f = File(path)
val canonicalPath = f.canonicalPath
require(canonicalPath.startsWith(expectedDir!!))
return f
}
Java
public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
File f = new File(path);
String canonicalPath = f.getCanonicalPath();
if (!canonicalPath.startsWith(expectedDir)) {
throw new IllegalArgumentException();
}
return f;
}
另一个最佳实践是使用验证来确保只发生预期的结果。示例包括以下内容
- 检查文件是否已存在,以防止意外覆盖。
- 检查目标文件是否为预期目标,以防止数据泄露或错误地更改权限。
- 检查操作的当前目录是否与规范路径返回值中完全一样。
- 确保权限系统明确限定于操作范围,例如检查它是否未以 root 身份运行服务,并确保目录权限限定于指定的服务或命令。