freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

关于我学渗透的那档子事之Java反序列化-CC7链
potatosafe 2022-01-31 02:39:39 158219

前言

过年前最后一篇文章,CC7和CC6其实差不多,只不过这里的触发用到了Hashtable类。废话不多说,直接开始。

一、利用链流程

老规矩,画了一张流程图,供大家参考。如图所示,这里我就不说LazyMap后面的流程了,在最后断点调试的时候说一嘴,我们这条链重点说一下Hashtable类。

二、Hashtable类

首先我们跟到Hashtable类里面的readObject方法看一下,这里的代码的意思通过reconstitutionPut方法将反序列化流中的元素重新放入table数组中。我们跟到reconstitutionPut这个关键的方法。

1643562433_61f6c5c186c46b0251970.png!small?1643562442344

这里我们可以看到在判断重复元素的时候了查看两个hash值是否一样,如果一样的话就会调用e.key.equals(key),而这里的key是我们可控的元素(这里需要注意一下,如果Hashtable中只有一个元素的话是不会走入判断的调用equals方法的),我们就可以通过Hashtable添加两个元素,第二个元素的我们传入一个我们构造的LazyMap对象。我们先继续跟进流程,按照我们现在的思路我们此时的key是LazyMap。找到LazyMap。1643562656_61f6c6a054c9f13773865.png!small?1643562663947

我们的LazyMap是没有equals方法的,我们继续向上找到它的父类AbstractMapDecorator

1643563976_61f6cbc87b2e9a2103fbe.png!small?1643563985780

通过父类AbstractMapDecorator的equals方法我们可以它执行了map.equals,这里我们的map由于我们利益链LazyMap传入的是HashMap所以会跳到HashMap寻找equals方法,而HashMap是没有equals方法的,所以我们跟到它的父类AbstractMap。

1643564022_61f6cbf64a89027f40552.png!small?1643564031978

AbstractMap.equals()中,走过判断对象、判断类型、判断个数后,最终执行了m.get(key),而我们这里的m为我们构造好的LazyMap。到这里其实我们就已经把链子的前半部分走完了,而Lazymap.get()的后半部分和CC6链后半部分一模一样,不清楚的小伙伴可以去看看CC6链或者其他链,都一样的。

1643565248_61f6d0c0871f83e5c6cbe.png!small?1643565257656

三、Hashtable类注意点

这上述流程中,我们有两个步骤需要我们去注意一下,也是这条链子的关键点。一个是我们在最开始Hashtable.reconstitutionPut()方法中的必须hash相同,也就是hash碰撞问题。另一个是我们AbstractMap.equals()中个数需要相同。

Hashtable.reconstitutionPut()哈希碰撞问题

我们首先说一下Hashtable.reconstitutionPut()方法中hash相同的问题,我们先跟到方法,查看代码

1643565337_61f6d119e21f84cf178f3.png!small?1643565346790

我们可以看到这里我们是通过hashCode()去获取hash的,我们跟到这个方法。这里我们的key为LazyMap,而LazyMap没有hashcode()方法,所以我们跟到了父类AbstractMapDecorator.hashcode()。此时的map是我们LazyMap传入的HashMap,而HashMap是没有hashcode()的,所以我们跟到它的父类AbstractMap.hashcode()

1643565430_61f6d17699002a78b90f1.png!small?1643565441758

找到AbstractMap.hashcode(),我们打个断点看一下之后走到了哪里,Node类?我们跟进去看看。

1643565635_61f6d243b6606dc91dc32.png!small?1643565645085

1643565740_61f6d2acc6abc6fa24918.png!small?1643565752521

我们可以看到Node类调用了Objects.hashcode(),我们继续跟进。

1643565775_61f6d2cff41c71f536a7b.png!small?1643565784400

走到Objects.hashcode(),而我们传入的o为string类,所以我们继续走到了String类的hashcode()

1643565864_61f6d3286df7f24b16e7d.png!small?1643565872797

在这里我们就看到了它的计算规则,通过字符ascii码值进行计算。

1643565941_61f6d375a5b7cf363a08c.png!small?1643565949996

1643566026_61f6d3ca66d9c093b3be7.png!small?1643566034214

这里yso链子里面给的是yy和zZ,其实我们拿计算器是看hash值也确实是一样的。小伙伴们也可以去算一算,碰撞一样的hash值应该很多。

1643566126_61f6d42ef0d4772479342.png!small?1643566135600

1643566138_61f6d43ae765baa796f97.png!small?1643566147119

AbstractMap.equals()个数问题

我们在构建利用链的时候需要通过Hashtable.put进行添加数据,而在添加过程中其实会出现一些问题,我们跟到该方法进行查看。

1643566907_61f6d73b5fe8e5f7e92d9.png!small?1643566915266

而我们在之前的流程可以知道AbstractMap.equals()会对个数进行校验,所以我们在第二次添加之后需要将第一次的元素remove一下。

1643566753_61f6d6a102fdf304fe71f.png!small?1643566761829

四、断点调试利用链

我们在Hashtable.readObject().reconstitutionPut()打上断点。

1643567069_61f6d7dd33a8087c9b103.png!small?1643567081027

跳入reconstitutionPut()方法。循环数组后我们走到了AbstractMapDecorator.equals方法

1643567047_61f6d7c7e17e016d6a9aa.png!small?1643567056066

1643567145_61f6d829ec51b2ca47ea9.png!small?1643567155609

继续向下,走到了AbstractMap.equals(),此时m为我们传入的LazyMap,继续跟进

1643567249_61f6d8910219c8047fe78.png!small?1643567260391

走到了LazyMap.get()方法,向下走到了我们的触发点transform方法

1643567290_61f6d8baa0a4760688202.png!small?1643567301353

1643567330_61f6d8e28dd428cdced42.png!small?1643567341344

最终触发链式调用,成功执行。

1643567436_61f6d94c40240420b10ec.png!small?1643567446630

可爱小尾巴~~~

我只是个基础很差 技术很菜 脚本小子里面的小菜鸡,文章里面有什么写的不对的地方,望师傅们多加指正,我肯定狂奔加小跑的学。今天是除夕夜,过年了,给大家拜个早年。之后反序列化的CC链可能就偶尔更新了,下次更新CC链我准备走一下CC8或者CC11。之后的文章准备写一些实战或者框架的漏洞。个人22年学习重点主要是应急和体系再加个被动攻击,路漫漫其修远兮,多学点是点。

# web安全 # 代码审计 # Java代码审计 # 代码审计入门 # JAVA安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 potatosafe 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Java反序列化—利用链篇
potatosafe LV.4
这家伙太懒了,还未填写个人描述!
  • 19 文章数
  • 86 关注者
擅长捉弄的内存马同学:Valve内存马
2022-11-02
名侦探土豆:Fastjson反序列化漏洞-TemplateImpt链
2022-03-13
名侦探土豆:Fastjson反序列化漏洞-JdbcRowSetImpl链
2022-03-13
文章目录