路径遍历

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 身份运行服务,并确保目录权限限定于指定的服务或命令。