代码审计中,CC3链实例化与反序列化,InvokerTransformer与InstantiateTransformer有何区别?
摘要:代码审计 | CC3链 —— 实例化 vs 反序列化 InvokerTransformer vs InstantiateTransformer 目录 环境说明 CC3的设计思路 前置知识:实例化触发 vs 反序列化触发 readObject
代码审计 | CC3链 —— 实例化 vs 反序列化 InvokerTransformer vs InstantiateTransformer
目录
环境说明
CC3的设计思路
前置知识:实例化触发 vs 反序列化触发
readObject 触发实验
newInstance 触发实验
反射补充:clazz.newInstance() 的限制
构造恶意 Class:EvilClass
触发入口:TemplatesImpl.newTransformer()
为什么需要继承 AbstractTranslet
传参:反射修改私有字段
为什么需要 _tfactory
直接调用测试
桥梁:TrAXFilter 构造方法
串联:ChainedTransformer + InstantiateTransformer
完整 Payload
CC3TransformedMap 版本
CC3LazyMap 版本
补充:InvokerTransformer vs InstantiateTransformer
环境说明
和之前一样:
Commons Collections 3.2.1
CC3的设计思路
CC3 是建立在两条已有链的基础上拼出来的:
CC1 LazyMap 版的触发链:AnnotationInvocationHandler → LazyMap.get() → ChainedTransformer
TemplatesImpl 加载字节码(fastjson里学过)的流程:_bytecodes → defineClass → newTransformer()
CC3 就是把这两条链拼在一起,中间加一个 TrAXFilter 作为桥梁。
最终目标是让目标服务器执行我们写的任意 Java 代码。
