Java反序列化 CC6链
参考链接
https://www.bilibili.com/video/BV1yP4y1p7N7
https://y0n3er.github.io/undefined/29590.html
https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections6.java
环境搭建
jdk_8u71:https://blog.lupf.cn/articles/2022/02/20/1645352101537.html
虚拟机安装以后拷贝出来
然后在project structure里配置Project、Modules、SDKs
注意:调试器的这里关闭这两个选项,不然debug会自动执行一些方法,导致变量值改变!
调用链分析
yoserial的调用链
底层和CC1-LazyMap是一样的,只分析一下LazyMap上面的调用。
- TiedMapEntry#getValue()调用了map.get(key)

- TiedMapEntry#hashCode()调用了TiedMapEntry#getValue()
- HashMap#hash(Object key)调用了key.hashCode()
- HashMap#readObject()调用了HashMap#hash(key)
所以只需要一个HashMap序列化,key指定为TiedMapEntry对象,
再把TiedMapEntry对象的map属性改成LazyMap对象,就会调到它的get了。
编写Exp
lazyMap#get()
先确定lazyMap.get()能触发命令执行,Exp如下:
TiedMapEntry#getvalue()
然后再构造TiedMapEntry的对象,观察是否能调到get()
注意构造函数要把lazyMap传进去,key随便取
TiedMapEntry#hashCode()
hashCode()经常用来和入口类HashMap对接,需要比较敏感。
这里和上一步没差别,加了一层函数调用而已,为的是方便连上后面的入口类:
HashMap#hash()
这个hash()是default的,我们用反射访问,确定链子到这没问题,Exp如下:
HashMap#readObject()
它的反序列化函数会把hashMap这个对象里的key读出来做hash(),即hash(key)
这就需要我们在要序列化的对象里,put一个键值对,把key设成tiedMapEntry对象
Exp如下:
注意:这里实际上在put键值对的时候就调用了链条,弹出了计算器,这显然不对。
最终Exp
到这里,Exp还存在两个问题:
- put的时候会提前调用了链条(老让自己电脑执行命令,不方便利用)
- put调用链子后,再次反序列化不会进transfor()
首先解决HashMap#put()会触发链条的问题,这是因为它也会调HashMap#hash()
这意味着我们的链条会先被执行一次,而我们不想让它在自己电脑弹计算器(不方便),可以做这个修改:
这样一来,即使put调用了链子,也只是返回一个常量,不会弹计算器。
但是,我们在改了链条去绕put之后,在反序列化之前肯定要把链子改回来,尝试编写Exp如下:
实际上虽然put弹了计算器,但后续还是能正常反序列化再弹一个计算器,这里猜测改掉的原因,主要可能是方便后续利用吧。
然后,解决反序列化不进transform()的问题,我们试着调试一下反序列化函数:
发现这里key2已经存在了,导致过不了判断,进不了transform(),这是为什么呢?
原因在于,执行put的时候调用过了一次这条链,在那时LazyMap就把没加载进来的key2给加进来了:
这也是LazyMap类的功能所在,所谓的懒加载,那我们得想办法进到if判断里,来调transform()
这里很容易想到,我们把在序列化之前,再把key2给删了就好,最终Exp如下:
注意事项
调试器的这里关闭这两个选项,不然debug会自动执行一些方法,导致调试HashMap#put()的时候,
走到LazyMap#get()里,会自动给map添加key2,导致无论如何都过不了if,也调不了transform()
总结
CC6这条是不限制jdk版本的链子,比较通用,毕竟没有哪个版本会把HashMap给过滤了。
值得注意的是,CC6这条链给出了在Exp编写中,某个函数提前触发了链条的解决办法。
这条链本身并不难,主要是被IDEA的调试器给制裁了,导致调半天找不出原因。
__EOF__

本文链接:https://www.cnblogs.com/jasper-sec/p/17631171.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!