Skip to content

Latest commit

 

History

History
51 lines (41 loc) · 3.42 KB

File metadata and controls

51 lines (41 loc) · 3.42 KB

Groovy反序列化链1(Groovy2)

  • 类别:javanative 别名:— 优先级:—
  • 作者:frohoff
  • 依赖org.codehaus.groovy:groovy:2.4.3

作用

Groovy Closure 的另一种触发方式:把一个仅实现 Comparable 接口、内部由 ConvertedClosure 支撑的动态代理放入 PriorityQueue。反序列化时 PriorityQueue.readObject 会对元素排序而调用 compareTo,从而进入代理 → Closure.calltags=XStreamPayload 表明本变体主要面向 XStream 场景。是 frohoff 原始 Groovy1 的 compareTo 入口版本。

链接标签

  • 入口 tagsXStreamPayload —— 承接 XStream 反序列化入口(而非纯 Java 原生入口)。
  • 衔接 nextTagsClosureWithJNDIChain —— 下游提供走 JNDI 落地的 Groovy Closure
  • excludes:无。

源码剖析

整个逻辑集中在 getObject,无额外 @Param

public Object getObject(Object obj) throws Exception {
    ConvertedClosure closure = new ConvertedClosure((Closure) obj, "compareTo");   // 绑定 compareTo
    Object map = Proxy.newProxyInstance(
        Groovy2.class.getClassLoader(), new Class[]{Comparable.class},             // 代理 Comparable
        (InvocationHandler) closure);
    return PayloadHelper.makePriorityQueue(map, false);                            // 放入 PriorityQueue
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    return this.getObject(chain.doCreate(context));   // obj = 下游产出的 Closure
}

逐段解释:

  1. new ConvertedClosure((Closure) obj, "compareTo")ConvertedClosure 实现 InvocationHandler,绑定方法名 compareTo;当被代理对象上调用同名方法 compareTo 时,把调用委派给内部 Closure.call(...)
  2. Proxy.newProxyInstance(..., new Class[]{Comparable.class}, closure):生成一个 Comparable 代理对象。任何对它 compareTo(other) 的调用都会落到 ConvertedClosure
  3. PayloadHelper.makePriorityQueue(map, false):构造一个含两个元素的 PriorityQueue 并把该代理作为待比较元素。PriorityQueue.readObject 在重建堆时执行 siftDown/siftUp,对元素调用 Comparable.compareTo → 命中代理 → Closure.call

触发链PriorityQueue.readObject → heapify → siftDown → ((Comparable)proxy).compareTo → ConvertedClosure.invoke → Closure.call。相比 GroovyAnnotationInvocationHandler+entrySet,本变体改用 PriorityQueue+compareTo,在被 XStream 等序列化框架处理时更适用。

参数(@Param)

本类无 @Param。触发入口固定为 compareTo/PriorityQueue,内层 Closure 由下游注入。

适用版本与原理要点

  • 依赖 groovy 2.4.3ConvertedClosureClosure 调用语义;2.4.4+ 修复)。
  • tags=XStreamPayload:设计上服务 XStream 载体;PriorityQueue + Comparable 代理是 XStream 环境下常见的可被还原并触发比较的结构。
  • 无回显;最终动作取决于下游 Closure(本变体 nextTags 仅给出 JNDI 落地)。

所属预设链

  • 自由构件,未直接出现在预设链。

关联

  • 下游(nextTags):ClosureWithJNDI(Sandboxed) —— 提供最终执行的 Groovy Closure
  • 同族:GroovyAnnotationInvocationHandler/entrySet 入口,Java 原生)、Groovy2GString(GString 入口)。