Java反序列化Commons-Collections篇02-CC1链补充
0x00 前言
本文比较简短,目的是补充cc1链的知识。
本文给出的cc1链是最先被定义为cc1的链子,但不必过多纠结,全学不就是了。
本文不完全按照寻找链子的思路,而要求读者具有一定的cc1链知识储备,可以先看本人前一篇博客,但是更推荐白日梦组长的视频。
0x01 尾部
尾部仍然是InvokeTransform类的transfom方法,给出当前的poc:
有一点需要注意一下,Transformer数组的第一个元素仍然在后面发挥了不可替代的作用。
现在需要一个方法调用transform方法,查找用法即可。
0x02 中间
LazyMap.get()
LazyMap.get方法:
追溯factory成员参数:
factory可控,给出目前的poc:
AnnotationInvocationHandler.invoke()
AnnotationInvocationHandler.invoke方法的调用点:
invoke方法需要注意一下这里:
成员参数member是String类型是一个坑点。我最开始希望member是一个Object类型,这样可以直接传Runtime.getRuntime() => Runtime实例。但是我想的不仅不对并且还更麻烦了,上文提到的Transform数组第一个元素就是用在这里。
想要触发invoke方法,结合该类是一个动态代理类(对行为的完全控制),不难想到通过触发代理对象的代理行为从而触发invoke方法。
给出目前的poc:
0x03 头部
头部方法当然是readObject方法。
幸运的是,AnnotationInvocationHandler类有readObject方法:
memberValues成员参数即是代理对象,这里不赘叙。
给出完整poc:
0x04 小结
多学自然有益。
参考教程:Java反序列化Commons-Collections篇02-CC1链补充 | Drunkbaby’s Blog
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 山 · 水!
评论