Java代码审计之Struts2-002
字数 1567 2025-08-25 22:59:02
Struts2-002漏洞分析与利用指南
漏洞概述
Struts2-002是一个XSS(跨站脚本)漏洞,影响Struts2框架的特定版本。该漏洞主要存在于s:url和s:a标签中,当这些标签的属性includeParams=all时,攻击者可以构造恶意输入触发XSS攻击。
影响版本:Struts 2.0.0 - Struts 2.1.8.1
漏洞环境搭建
-
所需组件:
- Apache Tomcat 8.5.47
- Struts 2.0.8
-
下载地址:
- Struts 2.0.8: http://archive.apache.org/dist/struts/binaries/struts-2.0.8-all.zip
- 参考环境: https://github.com/vulhub/vulhub/tree/master/struts2/s2-001
漏洞详细分析
漏洞触发原理
-
标签处理流程:
- 当解析Struts标签时,会调用
org.apache.struts2.views.jsp.ComponentTagSupport:doStartTag()方法 - 对于
s:url标签,处理组件为org.apache.struts2.components.URL类对象
- 当解析Struts标签时,会调用
-
关键方法调用链:
URL:start()方法检查includeParams属性- 当
includeParams=all时,调用mergeRequestParameters方法 mergeRequestParameters将this.req.getParameterMap()的键值对存入this.parameters属性- 后续处理还包括
includeGetParameters和includeExtraParameters方法 - 最终由
URLHelper类处理this.parameters数据并拼接在URL中返回给用户
-
XSS触发点:
- 攻击者可以构造恶意参数,如
<script>alert(1);</script>=hello - 这些参数会被处理并直接输出到页面,导致XSS执行
- 攻击者可以构造恶意参数,如
关键代码分析
// 在URL:start()方法中
if ("all".equals(this.includeParams)) {
this.mergeRequestParameters(this.parameters, this.req.getParameterMap());
}
// mergeRequestParameters方法
protected void mergeRequestParameters(Map params, Map requestParams) {
if (requestParams != null) {
params.putAll(requestParams);
}
}
特殊限制
- 仅当
includeParams=all时才能触发漏洞 includeParams=get不会触发,因为:- 只执行
includeGetParameters方法 - 使用
this.req.getQueryString()获取数据(不会自动URL解码) - 返回的数据是URL编码过的,无法执行XSS
- 只执行
漏洞利用方法
-
构造恶意URL:
http://localhost:8081/struts2-001/login.action?<script>alert(1);</script>=hello -
利用条件:
- 目标页面使用了
s:url或s:a标签 - 标签设置了
includeParams="all"属性
- 目标页面使用了
漏洞修复方案
-
官方修复:
- 在Struts 2.0.11.1版本中,将
<script>标签替换为<strong>script</strong> - 修复方式简单,存在绕过可能(如使用
<script 1>)
- 在Struts 2.0.11.1版本中,将
-
建议修复措施:
- 升级到不受影响的Struts2版本
- 对所有用户输入进行严格的过滤和转义
- 避免在标签中使用
includeParams="all"
学习资源
-
参考链接:
-
相关项目:
- Struts2-Vuln:持续更新Struts2漏洞分析的项目
总结
Struts2-002漏洞展示了框架标签处理中的XSS风险,特别强调了参数处理不当可能导致的安全问题。理解该漏洞有助于:
- 掌握Struts2标签处理机制
- 了解XSS漏洞的多种触发场景
- 学习框架安全修复的思路和局限性
该漏洞分析也体现了Java代码审计中跟踪框架组件调用链的重要性,以及理解不同参数处理方法差异的关键性。