关于CC7的分析与思考

admin 2023年1月4日09:47:38评论77 views字数 1882阅读6分16秒阅读模式
https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections7.java
Gadget chain:
关于CC7的分析与思考
代码执行点:
InvokerTransformer.transform反射调用任意对象的任意方法
关于CC7的分析与思考
ChainedTransformer的transform方法递归调用TransFormers数组中每个元素的transform方法
关于CC7的分析与思考
LazyMap.get调用transform方法
关于CC7的分析与思考
在调用get方法的方法中选择了继承了AbstractMap的HashMap以及继承了AbstractMapDecorator的LazyMap的equal方法
在反序列化过程中首先调用的是LazyMap的equal方法,LazyMap没有重写equal,所以调用父类AbstractMapDecorator的equal
关于CC7的分析与思考
在AbstractMapDecorator的equal方法中又会调用map.equal方法,而此时的map是一个HashMap,HashMap同样没有重写equal方法,又会去调用他的父类AbstractMap的equal方法,随后调用LazyMap的get方法
关于CC7的分析与思考
回到利用链的反推上。
Hashtable.reconstitutionPut方法调用了equal方法
关于CC7的分析与思考 
Hashtable.readObject又调用了reconstitutionPut方法,利用链闭环。
关于CC7的分析与思考
整条链完成,其中的坑点比较多,比如java/util/Hashtable.java:1221此处的if ((e.hash == hash) && e.key.equals(key)) 涉及到的Hash碰撞, 在调用LazyMap.decorate时第一个参数为什么选择HashMap,在调试整条链的过程中,HashTable中套了两个LazyMap,而每个LazyMap中又套了HashMap,在整个过程中,每个map的值又会有怎样的变化等等。
关于CC7的分析,网上的文章很多,所以这里简单过一下即可,而在我分析的过程中发现了一个问题,关于这个问题在网上也没找到大佬们的分析文章,就是在这条链里的两个equal方法能不能只用一个完成,
关于CC7的分析与思考
在测试过程中,发现是可以的,只需要在原先的链上做一小部分改动即可,将
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方法。
关于CC7的分析与思考
这样在反序列化中调用少了一步,虽然没什么大用

原文始发于微信公众号(仙友道):关于CC7的分析与思考

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月4日09:47:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于CC7的分析与思考https://cn-sec.com/archives/1497317.html

发表评论

匿名网友 填写信息