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
下载地址
- 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访问服务器文件:
http://vulnerable-server/struts/..%252f..%252f..%252fetc%252fpasswd - 观察服务器响应,确认是否返回了目标文件内容
示例攻击
http://localhost:8081/struts2_004/struts/..%252fWEB-INF/web.xml
此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