Java Web审计中常见的任意文件操作绕过缺陷
字数 1098 2025-08-20 18:18:10

Java Web审计中常见的任意文件操作绕过缺陷分析与防御

0x00 前言

在Java Web应用程序中,任意文件操作漏洞允许攻击者通过操纵应用程序访问服务器上的敏感文件。这种漏洞通常源于对用户输入的文件路径参数处理不当。

常见文件操作类

审计时应重点关注以下类:

  • InputStream
  • File
  • OutputStream
  • BufferedInputStream
  • FileInputStream

参数位置分类

  1. 请求参数:较常见,通过request.getParameter获取
  2. 请求路径
    • 自定义Servlet实现
    • 框架特性(如@PathVariable注解)

0x01 常见绕过缺陷

1.1 过滤内容不严谨

1.1.1 Windows目录穿越符

当仅过滤../时,攻击者可能使用:

  • ..\(Windows反斜杠)
  • %5C(反斜杠的URL编码)

示例漏洞代码:

public static boolean check(String filePath) {
    if (StringUtil.isBlank(filePath)) {
        return true;
    }
    return StringUtil.contains(filePath, "../");
}

1.1.2 java.net.URL处理特性

利用URL类特性绕过后缀检查:

URL url = new URL("file:/var/log/etc/passwd#.png");
System.out.println(url.getPath()); // 忽略#后的内容

双重URL编码绕过:

// 原始路径:../../etc/passwd
// 第一次编码:%2E%2E%2F%2E%2E%2Fetc%2Fpasswd
// 第二次编码:%252E%252E%252F%252E%252E%252Fetc%252Fpasswd

1.1.3 与其他安全措施冲突

当多个过滤器存在执行顺序问题时:

@Override
public String getParameter(String parameter) {
    String value = super.getParameter(parameter);
    if (value == null) {
        return null;
    }
    return JsoupUtil.clean(cleanAnyFileRead((String) value));
}

private static String cleanAnyFileRead(String value) {
    value = value.replaceAll("\\.+/", "");
    return value;
}

绕过方式:

..<script>/..<script>/..<script>/etc/passwd

1.2 获取实际访问文件资源方法不当

StringUtils.cleanPath问题

该方法对路径规范化的处理不彻底:

  1. \\替换为/
  2. 处理.(当前目录)和..(上级目录)
  3. 但存在以下问题:
    • pathArray.length != pathElements.size()时,会保留多余的..
    • 多个连续/会被视为"空"目录,影响处理结果

漏洞示例:

public static String readLogFile(String fileName) {
    String fullPath = "/var/log/" + fileName;
    // 读取文件逻辑...
}

绕过方式:

  1. 直接访问/etc/passwd
    StringUtils.cleanPath("/etc/passwd") // 原样输出
    
  2. 使用足够多的../
    StringUtils.cleanPath("/var/log/../../etc/passwd") // 返回/etc/passwd
    

0x02 防御建议

  1. 严格路径校验

    • 使用Path.normalize()标准化路径
    • 检查规范化后的路径是否在允许范围内
    Path path = Paths.get("/var/log", fileName).normalize();
    if (!path.startsWith("/var/log")) {
        return null; // 非法路径
    }
    
  2. 多重防御

    • 结合白名单和黑名单
    • 对Windows和Linux路径分别处理
    • 处理URL编码和双重编码情况
  3. 安全工具类使用

    • 避免单独依赖StringUtils.cleanPath
    • 结合getCanonicalPath()检查实际路径
  4. 框架特性利用

    • 参考CVE-2023-34062修复方案
    • 使用Path.normalize()后检查路径前缀

0x03 总结

Java Web应用中任意文件操作漏洞的防御需要:

  1. 全面理解各种绕过技术(Windows特性、URL处理、编码问题等)
  2. 避免单一依赖某个安全函数
  3. 实施多层防御策略
  4. 定期审计路径处理逻辑
  5. 关注框架安全更新和最佳实践

通过规范化路径处理、严格边界检查和多层次验证,才能有效防御任意文件操作漏洞。

Java Web审计中常见的任意文件操作绕过缺陷分析与防御 0x00 前言 在Java Web应用程序中,任意文件操作漏洞允许攻击者通过操纵应用程序访问服务器上的敏感文件。这种漏洞通常源于对用户输入的文件路径参数处理不当。 常见文件操作类 审计时应重点关注以下类: InputStream File OutputStream BufferedInputStream FileInputStream 参数位置分类 请求参数 :较常见,通过request.getParameter获取 请求路径 : 自定义Servlet实现 框架特性(如@PathVariable注解) 0x01 常见绕过缺陷 1.1 过滤内容不严谨 1.1.1 Windows目录穿越符 当仅过滤 ../ 时,攻击者可能使用: ..\ (Windows反斜杠) %5C (反斜杠的URL编码) 示例漏洞代码: 1.1.2 java.net.URL处理特性 利用URL类特性绕过后缀检查: 双重URL编码绕过: 1.1.3 与其他安全措施冲突 当多个过滤器存在执行顺序问题时: 绕过方式: 1.2 获取实际访问文件资源方法不当 StringUtils.cleanPath问题 该方法对路径规范化的处理不彻底: 将 \\ 替换为 / 处理 . (当前目录)和 .. (上级目录) 但存在以下问题: 当 pathArray.length != pathElements.size() 时,会保留多余的 .. 多个连续 / 会被视为"空"目录,影响处理结果 漏洞示例: 绕过方式: 直接访问 /etc/passwd : 使用足够多的 ../ : 0x02 防御建议 严格路径校验 : 使用 Path.normalize() 标准化路径 检查规范化后的路径是否在允许范围内 多重防御 : 结合白名单和黑名单 对Windows和Linux路径分别处理 处理URL编码和双重编码情况 安全工具类使用 : 避免单独依赖 StringUtils.cleanPath 结合 getCanonicalPath() 检查实际路径 框架特性利用 : 参考CVE-2023-34062修复方案 使用 Path.normalize() 后检查路径前缀 0x03 总结 Java Web应用中任意文件操作漏洞的防御需要: 全面理解各种绕过技术(Windows特性、URL处理、编码问题等) 避免单一依赖某个安全函数 实施多层防御策略 定期审计路径处理逻辑 关注框架安全更新和最佳实践 通过规范化路径处理、严格边界检查和多层次验证,才能有效防御任意文件操作漏洞。