CVE-2024-21006 Weblogic 远程代码执行挖掘思路
字数 1662 2025-08-05 08:19:13
CVE-2024-21006 WebLogic 远程代码执行漏洞分析与利用
漏洞概述
CVE-2024-21006 是 Oracle WebLogic Server 中的一个远程代码执行漏洞,该漏洞与之前的 CVE-2024-20931 和 CVE-2023-21839 类似,都是通过 IIOP 协议触发 JNDI 注入实现远程代码执行。漏洞评分为高危,影响多个 WebLogic 版本。
漏洞背景
该漏洞的利用方式与 CVE-2024-20931 和 CVE-2023-21839 类似,都是利用 IIOP -> JNDI 链造成远程代码执行。这些漏洞的共同入口点是 weblogic.jndi.internal.BasicNamingNode#lookupSharable 方法,在 resolveObject 中触发 JNDI 注入。
漏洞分析
关键代码路径
-
入口点:
weblogic.jndi.internal.BasicNamingNode#lookupSharable
-
触发条件:
- 当
restOfName长度不为 0 - 且
object类型不为BasicNamingNode时 - 会进入
else分支执行漏洞利用代码
- 当
-
restOfName 赋值逻辑:
- 通过
getRest方法解析name参数 - 当
name的第一个字符是'或",或者包含.和/时,可以解析出rest
- 通过
getRest 方法分析
private String getRest(String name) throws NamingException {
int nameLength = name.length();
if (nameLength == 0) {
return name;
} else {
char firstChar = name.charAt(0);
int i;
if (firstChar == '"') {
i = name.indexOf(34, 1);
this.checkQuoteClose(i, name);
++i;
if (i < nameLength && this.isSeparator(name.charAt(i))) {
++i;
}
return name.substring(i);
} else if (firstChar == '\'') {
i = name.indexOf(39, 1);
this.checkQuoteClose(i, name);
++i;
if (i < nameLength && this.isSeparator(name.charAt(i))) {
++i;
}
return name.substring(i);
} else {
for(i = 0; i < nameLength; ++i) {
char currentChar = name.charAt(i);
switch (currentChar) {
case '"':
case '\'':
throw new InvalidNameException("Unescaped quote in a component");
case '\\':
++i;
if (i == nameLength) {
throw new InvalidNameException("An escape at the end of a name must be escaped");
}
break;
default:
if (this.isSeparator(currentChar)) {
return name.substring(i + 1);
}
}
}
return "";
}
}
}
JNDI 注入流程
- 调用
getContinuationCtx方法 - 首先调用
JNDIUtils.isValidReferenceObject检查引用对象 - 进一步调用
isValidJndiScheme验证协议 - 通过
processURLAddrs方法提取ref对象里的classFactoryLocation属性 - 检查
classFactoryLocation允许的协议 (jndiAllowScheme),默认为空,不允许远程 HTTP 协议
本地 ObjectFactory 利用
由于无法加载远程 class,攻击者需要寻找本地可利用的 ObjectFactory:
- 漏洞利用的关键类是
weblogic.application.naming.MessageDestinationObjectFactory - 其
getObjectInstance方法中,obj参数是lookup的对象 - 调用对象的
lookupMessageDestination方法 jndiName是实例属性,可控,最终导致 JNDI 注入
影响版本
受影响的 WebLogic 版本包括:
- 12.2.1.3.0
- 12.2.1.4.0
- 14.1.1.0.0
漏洞修复
Oracle 已于 2024 年 4 月 16 日发布补丁修复该漏洞。
技术问答
Q: 在高版本 JDK 中是否可以使用此漏洞?
A: 在高版本 JDK 中,虽然攻击目标是本地工厂类,但这个本地工厂类的最终实现仍然是 JNDI,因此在高版本 JDK 中仍然会受到限制。
时间线
- 2024-03-29: 漏洞提交至 Oracle
- 2024-04-16: Oracle 发布补丁通告
防御建议
- 及时应用 Oracle 发布的最新补丁
- 限制 WebLogic 服务器的网络访问,特别是 IIOP 端口
- 监控和限制 JNDI 查找操作
- 升级到最新版本的 JDK 以减少 JNDI 注入的风险
总结
CVE-2024-21006 是 WebLogic 中一个严重的远程代码执行漏洞,攻击者可以通过精心构造的 IIOP 请求触发 JNDI 注入,最终实现远程代码执行。与之前的类似漏洞相比,它利用了不同的代码路径和本地 ObjectFactory 来实现攻击。管理员应尽快应用补丁并采取适当的防御措施。