关于CC7的分析与思考
2023-1-3 21:35:56 Author: 仙友道(查看原文) 阅读量:12 收藏

https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections7.java
Gadget chain:
代码执行点:
InvokerTransformer.transform反射调用任意对象的任意方法
ChainedTransformer的transform方法递归调用TransFormers数组中每个元素的transform方法
LazyMap.get调用transform方法
在调用get方法的方法中选择了继承了AbstractMap的HashMap以及继承了AbstractMapDecorator的LazyMap的equal方法
在反序列化过程中首先调用的是LazyMap的equal方法,LazyMap没有重写equal,所以调用父类AbstractMapDecorator的equal
在AbstractMapDecorator的equal方法中又会调用map.equal方法,而此时的map是一个HashMap,HashMap同样没有重写equal方法,又会去调用他的父类AbstractMap的equal方法,随后调用LazyMap的get方法
回到利用链的反推上。
Hashtable.reconstitutionPut方法调用了equal方法
 
Hashtable.readObject又调用了reconstitutionPut方法,利用链闭环。
整条链完成,其中的坑点比较多,比如java/util/Hashtable.java:1221此处的if ((e.hash == hash) && e.key.equals(key)) 涉及到的Hash碰撞, 在调用LazyMap.decorate时第一个参数为什么选择HashMap,在调试整条链的过程中,HashTable中套了两个LazyMap,而每个LazyMap中又套了HashMap,在整个过程中,每个map的值又会有怎样的变化等等。
关于CC7的分析,网上的文章很多,所以这里简单过一下即可,而在我分析的过程中发现了一个问题,关于这个问题在网上也没找到大佬们的分析文章,就是在这条链里的两个equal方法能不能只用一个完成,
在测试过程中,发现是可以的,只需要在原先的链上做一小部分改动即可,将
Map innerMap1 = new HashMap();Map innerMap2 = new HashMap();
Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);lazyMap1.put("yy", 1);

Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);lazyMap2.put("zZ", 1);Hashtable hashtable = new Hashtable();hashtable.put(lazyMap1, 1);hashtable.put(lazyMap2, 2);
改为
Map map1 = new HashMap();Map map2 = new HashMap();map1.put("yy", 1);map2.put("zZ", 1);
Map lazyMap1 = LazyMap.decorate(map1, transformerChain);
Hashtable hashtable = new Hashtable();hashtable.put(map2, 1);hashtable.put(lazyMap1, 2);
这里要注意的是在往HashTable中put值时要先put第二个HashMap,即没有往LazyMap中写的那个Map,因为在readObject的循环调用reconstitutionPut时,第一次循环table还是空的,循环最后才会往table中写入HashMap,如果先put LazyMap的话,调用的就是LazyMap.equal即AbstractMapDecorator.equal方法,而在AbstractMapDecorator.equal中,又会调用HashMap的equal方法,这样又回到了原本的CC7中。
这里先put第二个HashMap的话,会直接调用HashMap的equal方法即AbstractMap的equal方法,随后调用LazyMap的get方法。
这样在反序列化中调用少了一步,虽然没什么大用

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg3NjYwNDgzMQ==&mid=2247485740&idx=1&sn=7c958d8e2b2805884322e4c00ae67252&chksm=cf2ef5dcf8597cca4660f75132f8ed97b878dd5c7131cb24b81538e6e17ecca62b86219818d4#rd
如有侵权请联系:admin#unsafe.sh