- 类别:javanative 别名:— 优先级:—
- 作者:Unam4、Springkill
- 依赖:
c3p0(com.mchange.v2.c3p0.debug.ConstructionLoggingComboPooledDataSource)
构造一个 ConstructionLoggingComboPooledDataSource(c3p0 的 ComboPooledDataSource 子类),预置任意 jdbcUrl。上游通过 getConnection getter 触发时,c3p0 依据该 JDBC URL 建连,把「getter 调用」转化为「可控 JDBC URL 利用」。与 C3p0DataSource3 逻辑完全一致,仅所用数据源子类不同,用于适配不同环境下可加载的调试类。
- 入口
tags:DataSourceChains—— 属于 DataSource 触发链一族。Getter—— 通过 getter(getConnection)触发,需上游调用 getter 的 gadget 承接。Serializable—— 产物可被 Java 原生序列化承载。
- 衔接
nextTags:JdbcUrlChains—— 之后接消费 JDBC URL 的 gadget,由其产出被setJdbcUrl装入的恶意 URL。 excludes:无。
public class C3p0DataSource4 implements Gadget {
private final String getterMethodName = "getConnection";
private final String getterPropertyName = "connection";
public Object getObject(String jdbcUrl) {
ConstructionLoggingComboPooledDataSource dataSource = new ConstructionLoggingComboPooledDataSource();
dataSource.setJdbcUrl(jdbcUrl);
return dataSource;
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
String jdbcUrl = (String)chain.doCreate(context);
context.put(ContextTag.SUPER_CLASS_NAME_KEY, DataSource.class);
context.put(ContextTag.SPECIAL_METHOD_NAME_KEY, "getConnection");
context.put(ContextTag.GETTER_PARAM_NAME_KEY, "connection");
return this.getObject(jdbcUrl);
}
}逐段解释:
invoke先chain.doCreate(context)取到下游JdbcUrlChainsgadget 产出的恶意 JDBC URL 字符串并强转(String)。- 随后注入三个上下文键,指导上游触发方如何命中本对象:
SUPER_CLASS_NAME_KEY=DataSource.class(以javax.sql.DataSource类型识别)、SPECIAL_METHOD_NAME_KEY="getConnection"(触发方法名)、GETTER_PARAM_NAME_KEY="connection"(属性名,供按属性触发 getter 的上游如BeanComparator使用)。 getObject中new ConstructionLoggingComboPooledDataSource()后setJdbcUrl(jdbcUrl)。该类是 c3p0 调试包下另一个ComboPooledDataSource子类,序列化后其getConnection()被调用即用jdbcUrl建连。- 头部
Could not load ... ConstructionLoggingComboPooledDataSource注释属正常缺依赖现象。
本类与 C3p0DataSource3 属互为备选的孪生构件:CloseLoggingComboPooledDataSource 与 ConstructionLoggingComboPooledDataSource 均继承自 ComboPooledDataSource,触发路径一致,择一即可。
本类无 @Param;jdbcUrl 来自下游 gadget 产物,getterMethodName/getterPropertyName 为私有常量固定为 getConnection/connection。
- 适用于目标含
c3p0依赖、且能加载com.mchange.v2.c3p0.debug.ConstructionLoggingComboPooledDataSource的环境。 - 核心原理同 C3p0DataSource3:
ComboPooledDataSource.getConnection()用可控jdbcUrl建连,实现「getter → 任意 JDBC URL 利用」,常配 H2 JDBC 执行 JS/字节码达成 RCE。 - 仅作 DataSource→JdbcUrl 的桥接,RCE 依赖下游 JDBC 构件与上游 getter 触发器配合。
自由构件,未直接出现在预设链中(usedInChains 为空)。
- 上游(承接
Getter/getConnection):CommonsBeanutils1、Fastjson 系等触发 getter 的 gadget。 - 下游(
nextTags=JdbcUrlChains):H2JavaJdbc1、H2JavaExecJdbc1等 JDBC URL 利用构件。 - 同族:C3p0DataSource3(仅数据源子类不同)、C3p0_C3p0Jndi / C3p0_C3p0Jndi2(走 JNDI)。