- 类别:fastjson 别名:— 优先级:—
- 作者:—
- 依赖:
ch.qos:logback、com.h2database:h2、fastjson <= 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,属于历史/兼容构件。
- 入口
tags:FastjsonPayload—— 承接 Fastjson 反序列化入口(本 gadget 产出的是要交给 Fastjson 解析的 JSON 文本)。 - 衔接
nextTags:H2JdbcUrl—— 其内层必须接一个「产出 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.58 的 JSON.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,params 为空。唯一的可变量是内层 URL,由下游 H2JdbcUrl gadget 通过 chain.doCreate 注入,本类不直接暴露配置项。
- Fastjson
<= 1.2.58:依赖旧版 autotype 行为,高版本黑名单/开关会拦截@type指定的DriverManagerConnectionSource。 - logback:需类路径存在
ch.qos.logback.core.db.DriverManagerConnectionSource(该 JavaBean 提供urlsetter)。 - H2 驱动:最终 RCE 由 H2 JDBC URL 特性达成,故需
com.h2database:h2在目标类路径。 - 该类被标注
@Deprecated,说明官方视其为过时/被更通用链取代的构件;使用时优先考虑现役 Fastjson→JDBC 链。 gadgets.json中该条目description为null,priority为null,以上要点从注解依赖与源码逻辑提炼。
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 桥):FastjsonH2Jdbc、FastjsonC3p0、FastjsonBasicDataSource等——均是「Fastjson@type→ 某 DataSource/连接源 → JDBC 攻击」的不同载体,本类以 logbackDriverManagerConnectionSource为载体。