Weblogic 远程命令执行漏洞分析(CVE-2019-2725)及利用payload构造详细解读
字数 1435 2025-08-29 08:32:24

Weblogic远程命令执行漏洞分析(CVE-2019-2725)及利用Payload构造详解

0x01 漏洞简介

CVE-2019-2725是Weblogic服务器中的一个远程命令执行漏洞,属于XMLDecoder反序列化漏洞系列。该漏洞的核心利用点是Weblogic对SOAP消息处理时存在XMLDecoder反序列化漏洞,通过构造特殊的XML Payload可以实现远程代码执行。

0x02 漏洞细节分析

漏洞触发流程

  1. SOAP消息处理:Weblogic核心类处理SOAP消息时,SOAP header部分的workcontext元素内容被传入WorkContextXmlInputAdapter适配器

  2. XMLDecoder实例化WorkContextXmlInputAdapter的构造方法中实例化了一个XMLDecoder对象,并将输入流赋值给xmlDecoder属性

  3. 反序列化触发:调用链最终会执行xmlDecoder.readObject()方法,由于输入可控,导致反序列化漏洞

关键调用链:

WorkContextXmlInputAdapter -> WorkContextLocalMap.readEntry() -> WorkContextXmlInputAdapter.readUTF() -> xmlDecoder.readObject()

0x03 Payload构造演进

初始利用方式(CVE-2017-3506)

最早的XMLDecoder反序列化利用方式,直接使用object元素构造ProcessBuilder对象:

<?xml version="1.0" encoding="UTF-8"?>
<java>
  <object class="java.lang.ProcessBuilder">
    <array class="java.lang.String" length="1">
      <void index="0">
        <string>calc.exe</string>
      </void>
    </array>
    <void method="start"/>
  </object>
</java>

第一次绕过(CVE-2017-10271)

Oracle补丁禁止了object标签,改用void元素的class属性:

<java version="1.4.0" class="java.beans.XMLDecoder">
  <void class="java.lang.ProcessBuilder">
    <array class="java.lang.String" length="3">
      <void index="0">
        <string>/bin/bash</string>
      </void>
      <void index="1">
        <string>-c</string>
      </void>
      <void index="2">
        <string>id > /tmp/b4</string>
      </void>
    </array>
    <void method="start"/>
  </void>
</java>

变种Payload(使用newmethod元素):

<java version="1.4.0" class="java.beans.XMLDecoder">
  <new class="java.lang.ProcessBuilder">
    <string>calc</string>
    <method name="start"/>
  </new>
</java>

Oracle补丁限制

Oracle针对CVE-2017-10271的补丁增加了以下限制:

  1. 禁止objectnewmethod元素节点
  2. void元素只能使用index属性或空属性
  3. array元素的class属性只能是byte

CVE-2019-2725绕过方式

利用class元素节点绕过限制,结合特定类的构造方法实现利用:

  1. 利用oracle.toplink.internal.sessions.UnitOfWorkChangeSet

    • 该类构造方法接受字节数组并直接反序列化
    • 可以构造二次反序列化利用链
    • 可利用JDK7u21 gadget或CommonCollections gadget实现RCE
  2. 利用Spring组件

    • WebLogic包含Spring组件
    • 使用FileSystemXmlApplicationContextClassPathXmlApplicationContext加载恶意Spring配置文件
    • 通过Spring依赖注入实现RCE

0x04 漏洞修复与防御

Oracle最新补丁进一步扩充黑名单:

  • 禁止class元素
  • 限制array元素的长度

0x05 参考工具与资源

  1. XMLDecoder反序列化漏洞利用项目参考
  2. ysoserial工具生成序列化对象
  3. JDK7u21 gadget和CommonCollections gadget利用链

附录:完整利用思路

  1. 使用class元素指定目标类(如UnitOfWorkChangeSet
  2. 构造符合补丁限制的参数(字节数组或基础类型)
  3. 利用二次反序列化链实现最终RCE
  4. 或者通过Spring上下文加载实现RCE

注意:实际利用需要考虑WebLogic版本和依赖库版本,不同环境可能需要调整Payload。

Weblogic远程命令执行漏洞分析(CVE-2019-2725)及利用Payload构造详解 0x01 漏洞简介 CVE-2019-2725是Weblogic服务器中的一个远程命令执行漏洞,属于XMLDecoder反序列化漏洞系列。该漏洞的核心利用点是Weblogic对SOAP消息处理时存在XMLDecoder反序列化漏洞,通过构造特殊的XML Payload可以实现远程代码执行。 0x02 漏洞细节分析 漏洞触发流程 SOAP消息处理 :Weblogic核心类处理SOAP消息时,SOAP header部分的 workcontext 元素内容被传入 WorkContextXmlInputAdapter 适配器 XMLDecoder实例化 : WorkContextXmlInputAdapter 的构造方法中实例化了一个 XMLDecoder 对象,并将输入流赋值给 xmlDecoder 属性 反序列化触发 :调用链最终会执行 xmlDecoder.readObject() 方法,由于输入可控,导致反序列化漏洞 关键调用链: 0x03 Payload构造演进 初始利用方式(CVE-2017-3506) 最早的XMLDecoder反序列化利用方式,直接使用 object 元素构造 ProcessBuilder 对象: 第一次绕过(CVE-2017-10271) Oracle补丁禁止了 object 标签,改用 void 元素的 class 属性: 变种Payload(使用 new 和 method 元素): Oracle补丁限制 Oracle针对CVE-2017-10271的补丁增加了以下限制: 禁止 object 、 new 、 method 元素节点 void 元素只能使用 index 属性或空属性 array 元素的 class 属性只能是 byte CVE-2019-2725绕过方式 利用 class 元素节点绕过限制,结合特定类的构造方法实现利用: 利用 oracle.toplink.internal.sessions.UnitOfWorkChangeSet 类 : 该类构造方法接受字节数组并直接反序列化 可以构造二次反序列化利用链 可利用JDK7u21 gadget或CommonCollections gadget实现RCE 利用Spring组件 : WebLogic包含Spring组件 使用 FileSystemXmlApplicationContext 或 ClassPathXmlApplicationContext 加载恶意Spring配置文件 通过Spring依赖注入实现RCE 0x04 漏洞修复与防御 Oracle最新补丁进一步扩充黑名单: 禁止 class 元素 限制 array 元素的长度 0x05 参考工具与资源 XMLDecoder反序列化漏洞利用项目参考 ysoserial工具生成序列化对象 JDK7u21 gadget和CommonCollections gadget利用链 附录:完整利用思路 使用 class 元素指定目标类(如 UnitOfWorkChangeSet ) 构造符合补丁限制的参数(字节数组或基础类型) 利用二次反序列化链实现最终RCE 或者通过Spring上下文加载实现RCE 注意:实际利用需要考虑WebLogic版本和依赖库版本,不同环境可能需要调整Payload。