路径遍历

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