Skip to content

Latest commit

 

History

History
62 lines (51 loc) · 4.13 KB

File metadata and controls

62 lines (51 loc) · 4.13 KB

C3p0DataSource JDBC URL Attack(C3p0DataSource4)

  • 类别:javanative 别名:— 优先级:—
  • 作者:Unam4、Springkill
  • 依赖c3p0com.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 原生序列化承载。
  • 衔接 nextTagsJdbcUrlChains —— 之后接消费 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);
    }
}

逐段解释:

  • invokechain.doCreate(context) 取到下游 JdbcUrlChains gadget 产出的恶意 JDBC URL 字符串并强转 (String)
  • 随后注入三个上下文键,指导上游触发方如何命中本对象:SUPER_CLASS_NAME_KEY=DataSource.class(以 javax.sql.DataSource 类型识别)、SPECIAL_METHOD_NAME_KEY="getConnection"(触发方法名)、GETTER_PARAM_NAME_KEY="connection"(属性名,供按属性触发 getter 的上游如 BeanComparator 使用)。
  • getObjectnew ConstructionLoggingComboPooledDataSource()setJdbcUrl(jdbcUrl)。该类是 c3p0 调试包下另一个 ComboPooledDataSource 子类,序列化后其 getConnection() 被调用即用 jdbcUrl 建连。
  • 头部 Could not load ... ConstructionLoggingComboPooledDataSource 注释属正常缺依赖现象。

本类与 C3p0DataSource3 属互为备选的孪生构件:CloseLoggingComboPooledDataSourceConstructionLoggingComboPooledDataSource 均继承自 ComboPooledDataSource,触发路径一致,择一即可。

参数(@Param)

本类无 @ParamjdbcUrl 来自下游 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):H2JavaJdbc1H2JavaExecJdbc1 等 JDBC URL 利用构件。
  • 同族:C3p0DataSource3(仅数据源子类不同)、C3p0_C3p0Jndi / C3p0_C3p0Jndi2(走 JNDI)。