Skip to content

Latest commit

 

History

History
54 lines (44 loc) · 3.38 KB

File metadata and controls

54 lines (44 loc) · 3.38 KB

C3p0DataSource JDBC URL Attack(C3p0DataSource2)

  • 类别:javanative 别名:— 优先级:—
  • 作者:Unam4、Springkill
  • 依赖c3p0(com.mchange.v2.c3p0)

作用

C3p0DataSource 完全同构的「Getter → JDBC」桥接构件,唯一区别是把 DataSource 载体从 ComboPooledDataSource 换成其子类 com.mchange.v2.c3p0.debug.AfterCloseLoggingComboPooledDataSource。二者行为一致(setJdbcUrl 后经 getConnection() 触发 JDBC URL 利用),换类名主要用于绕过针对 ComboPooledDataSource 类名的黑名单/检测

链接标签

  • 入口 tagsDataSourceChainsGetterSerializable —— 承接会调用 getConnection getter 的上一环;自身可序列化。
  • 衔接 nextTagsJdbcUrlChains —— 之后接构造恶意 JDBC URL 的 gadget,见 H2JavaJdbc1 等。
  • excludes:无。

源码剖析

private final String getterMethodName = "getConnection";
private final String getterPropertyName = "connection";

public Object getObject(String jdbcUrl) {
    AfterCloseLoggingComboPooledDataSource dataSource =
        new AfterCloseLoggingComboPooledDataSource();   // ← 唯一差异:子类载体
    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);
}
  • AfterCloseLoggingComboPooledDataSource 继承自 ComboPooledDataSource,同样实现 DataSource 并暴露 getConnection()setJdbcUrl / getConnection 语义与父类一致,故利用路径完全相同。
  • invoke 同样向 context 注入 SUPER_CLASS_NAME_KEY=DataSourceSPECIAL_METHOD_NAME_KEY="getConnection"GETTER_PARAM_NAME_KEY="connection",供上游 getter 型 gadget 定位触发方式(详见 C3p0DataSource 源码剖析)。
  • 换用位于 com.mchange.v2.c3p0.debug 包的子类,可在防御方仅拉黑 ComboPooledDataSource 全名时提供替代载体。

参数(@Param)

本类无独立 @Param;恶意 JDBC URL 由下游 JdbcUrlChains gadget 经 chain.doCreate 提供。

适用版本与原理要点

  • 依赖 c3p0 且 classpath 存在 com.mchange.v2.c3p0.debug.AfterCloseLoggingComboPooledDataSource(部分精简版 c3p0 可能不含 debug 包,此时应回退到 C3p0DataSource)。
  • 与 C3p0DataSource 一致:需上游能触发 getConnection getter;最终能力取决于所配 JDBC URL(H2 最常用)。
  • 主要价值是黑名单绕过(类名差异)。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。可作为 Fastjson/Jackson C3p0 h2 链中 C3p0DataSource 的替换件。

关联

  • 上游(触发 getConnection getter):CommonsBeanutils1、Fastjson、Jackson。
  • 下游(nextTags=JdbcUrlChains):H2JavaJdbc1MysqlJdbcSqliteRceJdbc 等。
  • 同族:C3p0DataSource(标准 ComboPooledDataSource 载体,已入预设链)。