Java代码审计之Struts2-002
字数 1567 2025-08-25 22:59:02

Struts2-002漏洞分析与利用指南

漏洞概述

Struts2-002是一个XSS(跨站脚本)漏洞,影响Struts2框架的特定版本。该漏洞主要存在于s:urls:a标签中,当这些标签的属性includeParams=all时,攻击者可以构造恶意输入触发XSS攻击。

影响版本:Struts 2.0.0 - Struts 2.1.8.1

漏洞环境搭建

  1. 所需组件

    • Apache Tomcat 8.5.47
    • Struts 2.0.8
  2. 下载地址

    • 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

漏洞详细分析

漏洞触发原理

  1. 标签处理流程

    • 当解析Struts标签时,会调用org.apache.struts2.views.jsp.ComponentTagSupport:doStartTag()方法
    • 对于s:url标签,处理组件为org.apache.struts2.components.URL类对象
  2. 关键方法调用链

    • URL:start()方法检查includeParams属性
    • includeParams=all时,调用mergeRequestParameters方法
    • mergeRequestParametersthis.req.getParameterMap()的键值对存入this.parameters属性
    • 后续处理还包括includeGetParametersincludeExtraParameters方法
    • 最终由URLHelper类处理this.parameters数据并拼接在URL中返回给用户
  3. 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

漏洞利用方法

  1. 构造恶意URL

    http://localhost:8081/struts2-001/login.action?<script>alert(1);</script>=hello
    
  2. 利用条件

    • 目标页面使用了s:urls:a标签
    • 标签设置了includeParams="all"属性

漏洞修复方案

  1. 官方修复

    • 在Struts 2.0.11.1版本中,将<script>标签替换为<strong>script</strong>
    • 修复方式简单,存在绕过可能(如使用<script 1>
  2. 建议修复措施

    • 升级到不受影响的Struts2版本
    • 对所有用户输入进行严格的过滤和转义
    • 避免在标签中使用includeParams="all"

学习资源

  1. 参考链接

  2. 相关项目

    • Struts2-Vuln:持续更新Struts2漏洞分析的项目

总结

Struts2-002漏洞展示了框架标签处理中的XSS风险,特别强调了参数处理不当可能导致的安全问题。理解该漏洞有助于:

  1. 掌握Struts2标签处理机制
  2. 了解XSS漏洞的多种触发场景
  3. 学习框架安全修复的思路和局限性

该漏洞分析也体现了Java代码审计中跟踪框架组件调用链的重要性,以及理解不同参数处理方法差异的关键性。

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 类对象 关键方法调用链 : 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执行 关键代码分析 特殊限制 仅当 includeParams=all 时才能触发漏洞 includeParams=get 不会触发,因为: 只执行 includeGetParameters 方法 使用 this.req.getQueryString() 获取数据(不会自动URL解码) 返回的数据是URL编码过的,无法执行XSS 漏洞利用方法 构造恶意URL : 利用条件 : 目标页面使用了 s:url 或 s:a 标签 标签设置了 includeParams="all" 属性 漏洞修复方案 官方修复 : 在Struts 2.0.11.1版本中,将 <script> 标签替换为 <strong>script</strong> 修复方式简单,存在绕过可能(如使用 <script 1> ) 建议修复措施 : 升级到不受影响的Struts2版本 对所有用户输入进行严格的过滤和转义 避免在标签中使用 includeParams="all" 学习资源 参考链接 : Struts2框架: S2-002 漏洞详细分析 官方通告 相关项目 : Struts2-Vuln:持续更新Struts2漏洞分析的项目 总结 Struts2-002漏洞展示了框架标签处理中的XSS风险,特别强调了参数处理不当可能导致的安全问题。理解该漏洞有助于: 掌握Struts2标签处理机制 了解XSS漏洞的多种触发场景 学习框架安全修复的思路和局限性 该漏洞分析也体现了Java代码审计中跟踪框架组件调用链的重要性,以及理解不同参数处理方法差异的关键性。