Java安全学习05-反序列化漏洞-动态代理-CC6链-入门
2022-9-22 15:7:44 Author: NOVASEC(查看原文) 阅读量:15 收藏

词不达意,言不由衷

△△△点击上方“蓝字”关注我们了解更多精彩
0x00 免责声明

在学习本文技术或工具使用前,请您务必审慎阅读、充分理解各条款内容。

1、本团队分享的任何类型技术、工具文章等文章仅面向合法授权的企业安全建设行为与个人学习行为,严禁任何组织或个人使用本团队技术或工具进行非法活动。

2、在使用本文相关工具及技术进行测试时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。如您仅需要测试技术或工具的可行性,建议请自行搭建靶机环境,请勿对非授权目标进行扫描。

3、如您在使用本工具的过程中存在任何非法行为,您需自行承担相应后果,我们将不承担任何法律及连带责任。

4、本团队目前未发起任何对外公开培训项目和其他对外收费项目,严禁任何组织或个人使用本团队名义进行非法盈利。

5、本团队所有分享工具及技术文章,严禁不经过授权的公开分享。

如果发现上述禁止行为,我们将保留追究您法律责任的权利,并由您自身承担由禁止行为造成的任何后果。

0x00 Preface

CC1的链,在JDK版本更新后(高于8u65),就不能用了,因为AnnotationInvocationHandler变了,需要寻找一个不受JDK版本限制的链,即CC6

0x01 不变之处

CC6和CC1后半部分是没有变化的

ysoserial中的CC6

0x02 HashMap

在urldns链的时候,就知道HashMap可以反序列化,这里在反序列化的时候,传入一个类对象o于key位置,HashMap对这个key进行hash,然后key调用hashCode方法,这个类对象o中需要有一个get的方法,这样类对象o中就可以传入一个LazyMap,这样就是LazyMap.get(),最后链接上后半部分没有变化的CC链

先写一个HashMap和一个LazyMap备用

0x03 TiedMapEntry

漏洞发现者找到了TiedMapEntry进行漏洞利用

TiedMapEntry的构造方法,需要传入一个Map数组,和一个key,可以不用管后面这个,因为只是需要能实例化一个TiedMapEntry对象,这个对象里面能传入LazyMap数组就行,后面的key不重要

实例化一个TiedMapEntry对象,传入LazyMap数组


0x04 联合调用

再实例化一个HashMap数组,传入TiedMapEntry对象

这里先不进行反序列化,在序列化的时候,就触发命令执行了

这个情况,在urldns链的时候,就知道原因了,是因为put的时候触发了。put方法,也会调用hash,然后变成TiedMapEntry.hashCode,然后TiedMapEntry.hashCode里面调用getValue(当前类),然后调用get方法,最终变成LazyMap.get

而需要的是在反序列化的时候触发,不是在put的时候触发


0x05 问题解决

在urldns链的时候,经过反射修改,从而避免在put的时候,触发命令执行,这里也可以如此进行,而且这里进行了多重套娃,可以修改多处,比如修改LazyMap,在实例化对象的时候,先不传入chainedTransformer,这样就必定不会触发执行,但是最后put后,通过反射,给它改回去

这里需要注意一下,LazyMap对象传入其它数组中时,传入的是LazyMap对象的索引,所以最后LazyMap对象被修改成什么,其它数组里面的LazyMap对象就是什么

此时序列化不会执行命令

但是这个时候,反序列化,也没有执行命令

跟进put查看

此时,TiedMapEntry的key为aaa

put调用hash方法,key为aaa,value为bbb

aaa是TiedMapEntry里面的,继续往下走,则是调用了TiedMapEntry里面的hashCode,此时key还是aaa


TiedMapEntry里面的hashCode调用了getValue方法


getValue方法中key还是aaa,map则是LazyMap对象

跟进get方法,此时是进入LazyMap的get方法,此时传入的key为aaa,是TiedMapEntry对象的

进行了判断,判断LazyMap中有没有名为aaa的key,如果key存在,则返回key,这样就走不到transform方法中,如果没有key,就会将进行transform,然后将key和transform返回的值作为一对键值对传入LazyMap中。

仔细看上面的截图,是有问题,上面是在put方法时进行的调试,所以它应该会走到if里面,然后完成对LazyMap的键值对赋值(这里后续了解到是因为idea的设置问题,当执行时下面报了一个黄色的告警,说idea自动完成了一些赋值操作,这个是为了显示debug时下面那些值的展示,所以idea会先赋值)

打印查看上面的结论,在前面实例化LazyMap对象时,是空的,所以LazyMap按理说是必定走到这里面的,但是在没put之前,不知道哪里,已经完成了LazyMap的键值对赋值,但是,在测试中,又只有put之后,才完成赋值

因此,反序列化不能触发命令执行的原因是put的时候,给LazyMap对象设置了key,因此在put之后,需要将这个key清除,成功执行


此时jdk修改为其它版本,也可以触发漏洞


0x06 Summary 
祝好好学习,天天向上,万事如意

END

如您有任何投稿、问题、建议、需求、合作、后台留言NOVASEC公众号!

或添加NOVASEC-余生 以便于及时回复。

感谢大哥们的对NOVASEC的支持点赞和关注

加入我们与萌新一起成长吧!

本团队任何技术及文件仅用于学习分享,请勿用于任何违法活动,感谢大家的支持!


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzODU3ODA0MA==&mid=2247488216&idx=1&sn=c252c4101d38509ddb26083b07f303f3&chksm=fad4cfcfcda346d9ee1960077c9314e0648fd26840e5cc0499f7085e74676bdc631e44ae99e3#rd
如有侵权请联系:admin#unsafe.sh