cve-2019-2729挖掘思路 - cve-2019-2725 bypass
字数 1577 2025-08-27 12:33:23

CVE-2019-2729漏洞分析与利用教学文档

1. 漏洞背景

Weblogic在处理WSDL中的SOAP消息体时依赖XMLDecoder进行数据转换。XMLDecoder是JDK内置的将XML描述转换为Java对象的工具。由于WSDL设计特性,XMLDecoder的反序列化可以在无需登录的情况下被利用。

2. 漏洞原理

2.1 核心组件

漏洞利用的核心类是weblogic.wsee.workarea.WorkContextXmlInputAdapter,主要存在于以下两个包中:

  • bea_wls9_async_response.war
  • wls-wsat.war

2.2 黑名单机制

在CVE-2019-2725补丁后,Weblogic实施了以下标签限制:

完全禁止的标签

  • <object>
  • <class>
  • <new>
  • <method>

受限标签

  • <void>:只能包含index属性
  • <array>
    • class属性只能是byte
    • length属性有大小检查

3. XMLDecoder解析机制

3.1 解析流程

XMLDecoder使用SAXParser解析XML,主要处理流程:

  1. ObjectHandler处理:

    • startElement:根据标签信息生成MutableExpression对象
    • endElement:执行Expression#getValue计算结果
  2. MutableExpression结构

    • 包含四个关键属性:targetmethodNameargsvalue
    • 通过getValue触发反射调用
  3. 反射调用路径

    MutableExpression.getValue() 
    → Expression.getValue() 
    → Statement.invokeInternal()
    

3.2 标签处理逻辑

ObjectHandler#startElement中的关键处理:

if (name == "string") {
    e.setTarget(String.class);
    e.setMethodName("new");
} else if (name == "class") {
    e.setTarget(Class.class);
    e.setMethodName("forName");
} else if (name == "null") {
    e.setTarget(Object.class);
    e.setMethodName("getSuperclass");
} else if (name == "void") {
    if (e.getTarget() == null) {
        e.setTarget(this.eval());
    }
} else if (name == "array") {
    // 处理array标签
} else if (name == "java") {
    e.setValue(this.is);
}

4. 绕过思路分析

4.1 初始限制

补丁后可用标签:

  • 基础类型标签:boolean, byte, char, short, int, long, float, double
  • String
  • null
  • java

但存在以下限制:

  • javanull标签已被setValue操作,无法触发反射
  • 基础类型和String标签会覆盖targetmethodName

4.2 关键突破点

4.2.1 array标签特性

虽然array标签有以下限制:

  • class属性只能是byte
  • length属性有大小检查

未检查method属性,可利用此特性指定任意方法。

4.2.2 JDK 1.6的容错机制

Statement#invokeInternal中,当无法找到方法时会尝试从Class.class获取方法:

if (m == null && !target.equals(Class.class)) {
    m = Class.class.getMethod(methodName, ...);
    target = Class.class;
}

5. 漏洞利用构造

5.1 利用链构造

  1. 使用<array>标签并指定method属性
  2. 利用容错机制触发Class.forName
  3. 加载恶意类执行代码

5.2 示例Payload

<array method="forName">
    <string>恶意类全限定名</string>
    <void method="newInstance"/>
</array>

5.3 利用步骤详解

  1. 指定任意方法

    <array method="forName">
    
  2. 加载恶意类

    <string>com.example.EvilClass</string>
    
  3. 实例化对象

    <void method="newInstance"/>
    

6. 漏洞防御建议

  1. 升级补丁:及时应用Oracle官方发布的最新补丁
  2. 输入验证:严格验证SOAP消息中的XML结构
  3. 黑名单增强
    • 增加对array标签method属性的检查
    • 限制反射调用的类和方法范围
  4. 使用白名单:替代黑名单机制,只允许已知安全的标签和属性

7. 技术总结

该漏洞利用的核心在于:

  1. array标签的method属性未被检查
  2. JDK 1.6的容错机制允许回退到Class.forName
  3. XMLDecoder的设计缺陷导致可以绕过黑名单限制

此案例展示了即使有严格的黑名单机制,由于解析逻辑的复杂性,仍可能存在绕过途径,强调了防御措施需要多层次、多角度的考虑。

CVE-2019-2729漏洞分析与利用教学文档 1. 漏洞背景 Weblogic在处理WSDL中的SOAP消息体时依赖XMLDecoder进行数据转换。XMLDecoder是JDK内置的将XML描述转换为Java对象的工具。由于WSDL设计特性,XMLDecoder的反序列化可以在无需登录的情况下被利用。 2. 漏洞原理 2.1 核心组件 漏洞利用的核心类是 weblogic.wsee.workarea.WorkContextXmlInputAdapter ,主要存在于以下两个包中: bea_ wls9_ async_ response.war wls-wsat.war 2.2 黑名单机制 在CVE-2019-2725补丁后,Weblogic实施了以下标签限制: 完全禁止的标签 : <object> <class> <new> <method> 受限标签 : <void> :只能包含 index 属性 <array> : class 属性只能是 byte length 属性有大小检查 3. XMLDecoder解析机制 3.1 解析流程 XMLDecoder使用SAXParser解析XML,主要处理流程: ObjectHandler 处理: startElement :根据标签信息生成 MutableExpression 对象 endElement :执行 Expression#getValue 计算结果 MutableExpression结构 : 包含四个关键属性: target 、 methodName 、 args 、 value 通过 getValue 触发反射调用 反射调用路径 : 3.2 标签处理逻辑 ObjectHandler#startElement 中的关键处理: 4. 绕过思路分析 4.1 初始限制 补丁后可用标签: 基础类型标签: boolean , byte , char , short , int , long , float , double String null java 但存在以下限制: java 和 null 标签已被 setValue 操作,无法触发反射 基础类型和 String 标签会覆盖 target 和 methodName 4.2 关键突破点 4.2.1 array 标签特性 虽然 array 标签有以下限制: class 属性只能是 byte length 属性有大小检查 但 未检查 method 属性 ,可利用此特性指定任意方法。 4.2.2 JDK 1.6的容错机制 在 Statement#invokeInternal 中,当无法找到方法时会尝试从 Class.class 获取方法: 5. 漏洞利用构造 5.1 利用链构造 使用 <array> 标签并指定 method 属性 利用容错机制触发 Class.forName 加载恶意类执行代码 5.2 示例Payload 5.3 利用步骤详解 指定任意方法 : 加载恶意类 : 实例化对象 : 6. 漏洞防御建议 升级补丁 :及时应用Oracle官方发布的最新补丁 输入验证 :严格验证SOAP消息中的XML结构 黑名单增强 : 增加对 array 标签 method 属性的检查 限制反射调用的类和方法范围 使用白名单 :替代黑名单机制,只允许已知安全的标签和属性 7. 技术总结 该漏洞利用的核心在于: array 标签的 method 属性未被检查 JDK 1.6的容错机制允许回退到 Class.forName XMLDecoder的设计缺陷导致可以绕过黑名单限制 此案例展示了即使有严格的黑名单机制,由于解析逻辑的复杂性,仍可能存在绕过途径,强调了防御措施需要多层次、多角度的考虑。