potatosafe
- 关注

前言
过年前最后一篇文章,CC7和CC6其实差不多,只不过这里的触发用到了Hashtable类。废话不多说,直接开始。
一、利用链流程
老规矩,画了一张流程图,供大家参考。如图所示,这里我就不说LazyMap后面的流程了,在最后断点调试的时候说一嘴,我们这条链重点说一下Hashtable类。
二、Hashtable类
首先我们跟到Hashtable类里面的readObject方法看一下,这里的代码的意思通过reconstitutionPut方法将反序列化流中的元素重新放入table数组中。我们跟到reconstitutionPut这个关键的方法。
这里我们可以看到在判断重复元素的时候了查看两个hash值是否一样,如果一样的话就会调用e.key.equals(key),而这里的key是我们可控的元素(这里需要注意一下,如果Hashtable中只有一个元素的话是不会走入判断的调用equals方法的),我们就可以通过Hashtable添加两个元素,第二个元素的我们传入一个我们构造的LazyMap对象。我们先继续跟进流程,按照我们现在的思路我们此时的key是LazyMap。找到LazyMap。
我们的LazyMap是没有equals方法的,我们继续向上找到它的父类AbstractMapDecorator
通过父类AbstractMapDecorator的equals方法我们可以它执行了map.equals,这里我们的map由于我们利益链LazyMap传入的是HashMap所以会跳到HashMap寻找equals方法,而HashMap是没有equals方法的,所以我们跟到它的父类AbstractMap。
AbstractMap.equals()中,走过判断对象、判断类型、判断个数后,最终执行了m.get(key),而我们这里的m为我们构造好的LazyMap。到这里其实我们就已经把链子的前半部分走完了,而Lazymap.get()的后半部分和CC6链后半部分一模一样,不清楚的小伙伴可以去看看CC6链或者其他链,都一样的。
三、Hashtable类注意点
这上述流程中,我们有两个步骤需要我们去注意一下,也是这条链子的关键点。一个是我们在最开始Hashtable.reconstitutionPut()方法中的必须hash相同,也就是hash碰撞问题。另一个是我们AbstractMap.equals()中个数需要相同。
Hashtable.reconstitutionPut()哈希碰撞问题
我们首先说一下Hashtable.reconstitutionPut()方法中hash相同的问题,我们先跟到方法,查看代码
我们可以看到这里我们是通过hashCode()去获取hash的,我们跟到这个方法。这里我们的key为LazyMap,而LazyMap没有hashcode()方法,所以我们跟到了父类AbstractMapDecorator.hashcode()。此时的map是我们LazyMap传入的HashMap,而HashMap是没有hashcode()的,所以我们跟到它的父类AbstractMap.hashcode()
找到AbstractMap.hashcode(),我们打个断点看一下之后走到了哪里,Node类?我们跟进去看看。
我们可以看到Node类调用了Objects.hashcode(),我们继续跟进。
走到Objects.hashcode(),而我们传入的o为string类,所以我们继续走到了String类的hashcode()
在这里我们就看到了它的计算规则,通过字符ascii码值进行计算。
这里yso链子里面给的是yy和zZ,其实我们拿计算器是看hash值也确实是一样的。小伙伴们也可以去算一算,碰撞一样的hash值应该很多。
AbstractMap.equals()个数问题
我们在构建利用链的时候需要通过Hashtable.put进行添加数据,而在添加过程中其实会出现一些问题,我们跟到该方法进行查看。
而我们在之前的流程可以知道AbstractMap.equals()会对个数进行校验,所以我们在第二次添加之后需要将第一次的元素remove一下。
四、断点调试利用链
我们在Hashtable.readObject().reconstitutionPut()打上断点。
跳入reconstitutionPut()方法。循环数组后我们走到了AbstractMapDecorator.equals方法
继续向下,走到了AbstractMap.equals(),此时m为我们传入的LazyMap,继续跟进
走到了LazyMap.get()方法,向下走到了我们的触发点transform方法
最终触发链式调用,成功执行。
可爱小尾巴~~~
我只是个基础很差 技术很菜 脚本小子里面的小菜鸡,文章里面有什么写的不对的地方,望师傅们多加指正,我肯定狂奔加小跑的学。今天是除夕夜,过年了,给大家拜个早年。之后反序列化的CC链可能就偶尔更新了,下次更新CC链我准备走一下CC8或者CC11。之后的文章准备写一些实战或者框架的漏洞。个人22年学习重点主要是应急和体系再加个被动攻击,路漫漫其修远兮,多学点是点。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
