Java Web审计中常见的任意文件操作绕过缺陷
字数 1098 2025-08-20 18:18:10
Java Web审计中常见的任意文件操作绕过缺陷分析与防御
0x00 前言
在Java Web应用程序中,任意文件操作漏洞允许攻击者通过操纵应用程序访问服务器上的敏感文件。这种漏洞通常源于对用户输入的文件路径参数处理不当。
常见文件操作类
审计时应重点关注以下类:
- InputStream
- File
- OutputStream
- BufferedInputStream
- FileInputStream
参数位置分类
- 请求参数:较常见,通过request.getParameter获取
- 请求路径:
- 自定义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问题
该方法对路径规范化的处理不彻底:
- 将
\\替换为/ - 处理
.(当前目录)和..(上级目录) - 但存在以下问题:
- 当
pathArray.length != pathElements.size()时,会保留多余的.. - 多个连续
/会被视为"空"目录,影响处理结果
- 当
漏洞示例:
public static String readLogFile(String fileName) {
String fullPath = "/var/log/" + fileName;
// 读取文件逻辑...
}
绕过方式:
- 直接访问
/etc/passwd:StringUtils.cleanPath("/etc/passwd") // 原样输出 - 使用足够多的
../:StringUtils.cleanPath("/var/log/../../etc/passwd") // 返回/etc/passwd
0x02 防御建议
-
严格路径校验:
- 使用
Path.normalize()标准化路径 - 检查规范化后的路径是否在允许范围内
Path path = Paths.get("/var/log", fileName).normalize(); if (!path.startsWith("/var/log")) { return null; // 非法路径 } - 使用
-
多重防御:
- 结合白名单和黑名单
- 对Windows和Linux路径分别处理
- 处理URL编码和双重编码情况
-
安全工具类使用:
- 避免单独依赖
StringUtils.cleanPath - 结合
getCanonicalPath()检查实际路径
- 避免单独依赖
-
框架特性利用:
- 参考CVE-2023-34062修复方案
- 使用
Path.normalize()后检查路径前缀
0x03 总结
Java Web应用中任意文件操作漏洞的防御需要:
- 全面理解各种绕过技术(Windows特性、URL处理、编码问题等)
- 避免单一依赖某个安全函数
- 实施多层防御策略
- 定期审计路径处理逻辑
- 关注框架安全更新和最佳实践
通过规范化路径处理、严格边界检查和多层次验证,才能有效防御任意文件操作漏洞。