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属性只能是bytelength属性有大小检查
3. XMLDecoder解析机制
3.1 解析流程
XMLDecoder使用SAXParser解析XML,主要处理流程:
-
ObjectHandler处理:
startElement:根据标签信息生成MutableExpression对象endElement:执行Expression#getValue计算结果
-
MutableExpression结构:
- 包含四个关键属性:
target、methodName、args、value - 通过
getValue触发反射调用
- 包含四个关键属性:
-
反射调用路径:
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 Stringnulljava
但存在以下限制:
java和null标签已被setValue操作,无法触发反射- 基础类型和
String标签会覆盖target和methodName
4.2 关键突破点
4.2.1 array标签特性
虽然array标签有以下限制:
class属性只能是bytelength属性有大小检查
但未检查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 利用链构造
- 使用
<array>标签并指定method属性 - 利用容错机制触发
Class.forName - 加载恶意类执行代码
5.2 示例Payload
<array method="forName">
<string>恶意类全限定名</string>
<void method="newInstance"/>
</array>
5.3 利用步骤详解
-
指定任意方法:
<array method="forName"> -
加载恶意类:
<string>com.example.EvilClass</string> -
实例化对象:
<void method="newInstance"/>
6. 漏洞防御建议
- 升级补丁:及时应用Oracle官方发布的最新补丁
- 输入验证:严格验证SOAP消息中的XML结构
- 黑名单增强:
- 增加对
array标签method属性的检查 - 限制反射调用的类和方法范围
- 增加对
- 使用白名单:替代黑名单机制,只允许已知安全的标签和属性
7. 技术总结
该漏洞利用的核心在于:
array标签的method属性未被检查- JDK 1.6的容错机制允许回退到
Class.forName - XMLDecoder的设计缺陷导致可以绕过黑名单限制
此案例展示了即使有严格的黑名单机制,由于解析逻辑的复杂性,仍可能存在绕过途径,强调了防御措施需要多层次、多角度的考虑。