0x00 前言

本文比较简短,目的是补充cc1链的知识。

本文给出的cc1链是最先被定义为cc1的链子,但不必过多纠结,全学不就是了。

本文不完全按照寻找链子的思路,而要求读者具有一定的cc1链知识储备,可以先看本人前一篇博客,但是更推荐白日梦组长的视频。

0x01 尾部

尾部仍然是InvokeTransform类的transfom方法,给出当前的poc:

image-20241201165550146

有一点需要注意一下,Transformer数组的第一个元素仍然在后面发挥了不可替代的作用。

现在需要一个方法调用transform方法,查找用法即可。

0x02 中间

LazyMap.get()

LazyMap.get方法:

image-20241201170004942

追溯factory成员参数:

image-20241201170122135

factory可控,给出目前的poc:

image-20241201170432495

AnnotationInvocationHandler.invoke()

AnnotationInvocationHandler.invoke方法的调用点:

image-20241201170647256

invoke方法需要注意一下这里:

image-20241201170823318

成员参数member是String类型是一个坑点。我最开始希望member是一个Object类型,这样可以直接传Runtime.getRuntime() => Runtime实例。但是我想的不仅不对并且还更麻烦了,上文提到的Transform数组第一个元素就是用在这里。

想要触发invoke方法,结合该类是一个动态代理类(对行为的完全控制),不难想到通过触发代理对象的代理行为从而触发invoke方法。

给出目前的poc:

image-20241201173558818

0x03 头部

头部方法当然是readObject方法。

幸运的是,AnnotationInvocationHandler类有readObject方法:

image-20241201172741513

memberValues成员参数即是代理对象,这里不赘叙。

给出完整poc:

image-20241201173500002

0x04 小结

多学自然有益。

参考教程:Java反序列化Commons-Collections篇02-CC1链补充 | Drunkbaby’s Blog