Skip to content

Latest commit

 

History

History
58 lines (46 loc) · 4.92 KB

File metadata and controls

58 lines (46 loc) · 4.92 KB

H2Jdbc 1.2.58(FastjsonlogbackH2Jdbc)

  • 类别:fastjson 别名:— 优先级:—
  • 作者:—
  • 依赖ch.qos:logbackcom.h2database:h2fastjson <= 1.2.58

作用

生成一段 Fastjson 反序列化 payload 字符串:借助 logback 的 ch.qos.logback.core.db.DriverManagerConnectionSource 作为 @type 目标类,把下游产出的 H2 JDBC URL 填入其 url 属性。当 Fastjson 解析该 JSON 时会实例化 DriverManagerConnectionSource 并设置 URL,进而触发 H2 数据库连接、走向 H2 JDBC 攻击链(H2JavaJdbc1 等)实现 RCE。该类已标注 @Deprecated,属于历史/兼容构件。

链接标签

  • 入口 tagsFastjsonPayload —— 承接 Fastjson 反序列化入口(本 gadget 产出的是要交给 Fastjson 解析的 JSON 文本)。
  • 衔接 nextTagsH2JdbcUrl —— 其内层必须接一个「产出 H2 JDBC 连接 URL」的 gadget(如 H2JavaJdbc1),由下游返回的字符串被格式化进 url 字段。
  • excludes:无。

源码剖析

整个类极其精简,核心是一个字符串模板 + 一次 String.format

@GadgetTags(tags={"FastjsonPayload"}, nextTags={"H2JdbcUrl"})
@GadgetAnnotation(name="H2Jdbc 1.2.58", dependencies={"ch.qos:logback", "com.h2database:h2", "fastjson <= 1.2.58"})
@Deprecated
public class FastjsonlogbackH2Jdbc implements Gadget {
    public static String template =
        "{\"@type\":\"ch.qos.logback.core.db.DriverManagerConnectionSource\", \"url\":\"%s\"}";

    public Object getObject(String h2JdbcUrl) {
        return String.format(template, h2JdbcUrl);
    }

    @Override
    public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        return this.getObject((String) chain.doCreate(context));
    }
}
  • template:固定的 Fastjson JSON 片段。@type 指定反序列化目标类为 logback 的 DriverManagerConnectionSource——它是一个 JavaBean,暴露 setUrl(String) setter,Fastjson 在解析 "url":"..." 时会调用该 setter。
  • invoke:先 chain.doCreate(context) 取得内层对象(这里期望是一个 H2 JDBC URL 字符串,由 nextTags=H2JdbcUrl 的下游 gadget 产出),强转为 String 后交给 getObject
  • getObject:用 String.format 把下游 URL 填入 %s,返回完整 JSON 字符串。该字符串即最终 payload 文本,交给上层 Fastjson Payload 入口做序列化/投递。

触发机理:目标应用用 fastjson <= 1.2.58JSON.parse/parseObject 解析这段 JSON 时,@type 触发 DriverManagerConnectionSource 实例化并 setUrl(h2JdbcUrl)DriverManagerConnectionSource 在被使用(如 logback 尝试取连接,或 getter 被链式触发)时会以该 URL 建立 JDBC 连接。若 URL 指向 H2(jdbc:h2:...),配合 H2 的 INIT/CREATE ALIAS 等特性即可执行任意 Java/命令,完成 RCE。因此本 gadget 只是「Fastjson → logback DataSource」这一跳的封装,真正的攻击载荷在下游 H2 JDBC gadget 里构造。

版本约束来源@type 自动类型能生效要求 Fastjson 处于 autotype 相对宽松的旧版本(<= 1.2.58);DriverManagerConnectionSource 来自 logback;H2 驱动提供实际执行面。三者缺一不可,故 dependencies 同时列出三项。

参数(@Param)

本类无 @Paramparams 为空。唯一的可变量是内层 URL,由下游 H2JdbcUrl gadget 通过 chain.doCreate 注入,本类不直接暴露配置项。

适用版本与原理要点

  • Fastjson <= 1.2.58:依赖旧版 autotype 行为,高版本黑名单/开关会拦截 @type 指定的 DriverManagerConnectionSource
  • logback:需类路径存在 ch.qos.logback.core.db.DriverManagerConnectionSource(该 JavaBean 提供 url setter)。
  • H2 驱动:最终 RCE 由 H2 JDBC URL 特性达成,故需 com.h2database:h2 在目标类路径。
  • 该类被标注 @Deprecated,说明官方视其为过时/被更通用链取代的构件;使用时优先考虑现役 Fastjson→JDBC 链。
  • gadgets.json 中该条目 descriptionnullprioritynull,以上要点从注解依赖与源码逻辑提炼。

所属预设链

usedInChains 为空——自由构件,未直接出现在 51 条预设链中。可手工组合为 [FastjsonlogbackH2Jdbc, H2JavaJdbc1, BytecodeConvert, Exec] 之类的链路(参照预设链 15「Fastjson C3p0 Jdbc h2链」的 H2 段思路)。

关联

  • 下游(nextTags=H2JdbcUrl):H2JavaJdbc1 及其他 H2 JDBC URL 产出型 gadget,负责给出真正带 INIT 执行语义的 jdbc:h2:... URL。
  • 同族(tags=FastjsonPayload 的其它 Fastjson JDBC 桥):FastjsonH2JdbcFastjsonC3p0FastjsonBasicDataSource 等——均是「Fastjson @type → 某 DataSource/连接源 → JDBC 攻击」的不同载体,本类以 logback DriverManagerConnectionSource 为载体。