关于CC7的分析与思考
2023-1-3 21:35:56
Author: 仙友道(查看原文)
阅读量:12
收藏
https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections7.javaInvokerTransformer.transform反射调用任意对象的任意方法ChainedTransformer的transform方法递归调用TransFormers数组中每个元素的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