Java代码审计之Struts2-004(四)
字数 1338 2025-08-25 22:59:09

Struts2-004 目录遍历漏洞分析与复现

漏洞概要

Struts2-004 是一个目录遍历漏洞,影响以下版本:

  • Struts 2.0.0 - 2.0.11.2
  • Struts 2.1.0 - 2.1.2

该漏洞允许攻击者通过精心构造的URL访问服务器上的任意文件,可能导致敏感信息泄露。

环境搭建

所需组件

  • Apache Tomcat 6.0.10
  • Struts 2.0.8

下载地址

漏洞分析

漏洞位置

漏洞主要存在于 FilterDispatcher 类对静态资源文件的处理逻辑中。

关键代码分析

  1. 请求处理流程

    • 当请求的资源文件路径以 /struts 开头时,会调用 findStaticResource 方法寻找资源
    • findStaticResource 方法中:
      • 如果文件后缀不为 .class,则调用 findInputStream 来读取文件内容
      • 文件路径会进行一次 URL 解码(URLdecode)
      • 关键问题:没有对文件名进行任何过滤,导致路径穿越问题
  2. 漏洞触发点

    • 攻击者可以通过构造包含 ..%252f(双重URL编码的../)的路径来遍历目录
    • 例如:http://localhost:8081/struts2_004/struts/..%252f

漏洞原理

  • 双重URL编码绕过:%252f/ 的URL编码的URL编码
  • 服务器在处理时会进行URL解码,将%252f解码为%2f,然后再次解码为/
  • 最终形成有效的路径遍历序列../

漏洞复现

复现步骤

  1. 搭建包含漏洞版本的Struts2环境
  2. 构造恶意URL访问服务器文件:
    http://vulnerable-server/struts/..%252f..%252f..%252fetc%252fpasswd
    
  3. 观察服务器响应,确认是否返回了目标文件内容

示例攻击

http://localhost:8081/struts2_004/struts/..%252fWEB-INF/web.xml

此URL可能泄露web应用的配置文件内容。

漏洞修复

修复方案

官方在Struts 2.0.12中修复了此漏洞,主要修复点:

  1. 使用 URL.getFile() 获取文件的真实路径
  2. 结合 endWith 来判断文件后缀
  3. 两种方法结合有效解决了路径穿越问题

修复代码对比

  • 漏洞版本 (struts-core-2.0.8):没有对文件名进行过滤
  • 修复版本 (struts-core-2.0.12):
    • 获取真实路径:URL.getFile()
    • 严格校验文件后缀:endWith

防御建议

  1. 及时升级到不受影响的Struts2版本
  2. 在自定义过滤器中对请求路径进行严格校验
  3. 禁止双重URL编码的请求
  4. 实施最小权限原则,限制Web服务器的文件系统访问权限

参考资源

Struts2-004 目录遍历漏洞分析与复现 漏洞概要 Struts2-004 是一个目录遍历漏洞,影响以下版本: Struts 2.0.0 - 2.0.11.2 Struts 2.1.0 - 2.1.2 该漏洞允许攻击者通过精心构造的URL访问服务器上的任意文件,可能导致敏感信息泄露。 环境搭建 所需组件 Apache Tomcat 6.0.10 Struts 2.0.8 下载地址 Struts 2.0.8: http://archive.apache.org/dist/struts/binaries/struts-2.0.8-all.zip Tomcat 6.0.10: https://archive.apache.org/dist/tomcat/tomcat-6/v6.0.10/bin/apache-tomcat-6.0.10.zip 漏洞分析 漏洞位置 漏洞主要存在于 FilterDispatcher 类对静态资源文件的处理逻辑中。 关键代码分析 请求处理流程 : 当请求的资源文件路径以 /struts 开头时,会调用 findStaticResource 方法寻找资源 在 findStaticResource 方法中: 如果文件后缀不为 .class ,则调用 findInputStream 来读取文件内容 文件路径会进行一次 URL 解码(URLdecode) 关键问题 :没有对文件名进行任何过滤,导致路径穿越问题 漏洞触发点 : 攻击者可以通过构造包含 ..%252f (双重URL编码的 ../ )的路径来遍历目录 例如: http://localhost:8081/struts2_004/struts/..%252f 漏洞原理 双重URL编码绕过: %252f 是 / 的URL编码的URL编码 服务器在处理时会进行URL解码,将 %252f 解码为 %2f ,然后再次解码为 / 最终形成有效的路径遍历序列 ../ 漏洞复现 复现步骤 搭建包含漏洞版本的Struts2环境 构造恶意URL访问服务器文件: 观察服务器响应,确认是否返回了目标文件内容 示例攻击 此URL可能泄露web应用的配置文件内容。 漏洞修复 修复方案 官方在Struts 2.0.12中修复了此漏洞,主要修复点: 使用 URL.getFile() 获取文件的真实路径 结合 endWith 来判断文件后缀 两种方法结合有效解决了路径穿越问题 修复代码对比 漏洞版本 (struts-core-2.0.8):没有对文件名进行过滤 修复版本 (struts-core-2.0.12): 获取真实路径: URL.getFile() 严格校验文件后缀: endWith 防御建议 及时升级到不受影响的Struts2版本 在自定义过滤器中对请求路径进行严格校验 禁止双重URL编码的请求 实施最小权限原则,限制Web服务器的文件系统访问权限 参考资源 官方通告: https://cwiki.apache.org/confluence/display/WW/S2-004 Struts2漏洞项目: Struts2-Vuln