1 什么是Spring Cloud Gateway?
Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令。
1.1网管
单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务:
1.2 网关的作用:
Spring Cloud Gateway是Spring Cloud生态系统中的一员,它被设计用于处理所有微服务的入口流量。作为一个反向代理,它不仅提供了负载均衡和路由功能,还支持灵活的过滤器机制,过滤器可以在请求进入网关和离开网关时执行,用于处理各种逻辑,如身份验证、日志记录和性能监测,使得开发者能够定制和扩展其功能。
网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上。
1.3 网关的技术实现
在SpringCloud中网关的实现包括两种:
gateway
zuul
Zuul 是基于Servlet的实现,在1.x版本属于阻塞式编程,在2.x后是基于netty,是非阻塞的。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。
目前一般都选用SpringCloudGateway,毕竟都是Spring家族一员,支持性更好。
2.了解漏洞需要认识下actuator
Spring Cloud Gateway添加Spring Boot Actuator( spring-boot-starter-actuator
)的依赖,并将 gateway
端点暴露,即可获得若干监控端点,监控 & 操作Spring Cloud Gateway的方方面面。
/gateway
为默认端点,您可以监视和交互Spring Cloud Gateway应用。为了可远程访问,必须在应用程序属性中通过HTTP或JMX启用和公开端点。以下清单显示了如何执行此操作:
所有网关相关监控端点列表如下:
以下所有端点都挂在/actuator/gateway/
下面。
例如:routes
的全路径是 /actuator/gateway/routes
,以此类推。
3.漏洞复现
3.1通过vulfocus启动Spring Cloud Gateway服务
通过浏览器搜索vulfocus,注册搜索CVE-2022-22947启动靶场:
3.2 添加过滤器
3.3 刷新路由
3.4 访问路由
4.0 原理分析
4.1流程
1、开启Acutator,可以通过接口列出路由(包括过滤器),如:/actuator/gateway/routes
2、可以通过/gateway/routes/{id_route_to_create}创建路由
3、通过/actuator/gateway/refresh刷新路由
4、当路由带有恶意的Filter,里面的spEL表达式会被执行
4.2 payload分析
#{new
String(T(org.springframework.util.StreamUtils).co
pyToByteArray(T(java.lang.Runtime).getRuntime().
exec(new String[]{\"whoami\"}).getInputStream()))}
这段代码是使用Java编写的,它的目的是执行一个系统命令(在这个例子中是whoami
),并将命令的输出转换为字符串。具体来说,它使用了Spring框架中的StreamUtils
类和Java的Runtime
类来实现这个功能。
-
T(org.springframework.util.StreamUtils).copyToByteArray()
:这是Spring框架中的一个方法,用于将输入流的内容复制到字节数组中。在这里,它将执行whoami
命令后的输出流转换为字节数组。 -
T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"})
:这是Java中的一个方法,用于执行指定的系统命令。在这里,它执行了whoami
命令,该命令通常用于获取当前用户的用户名。 -
.getInputStream()
:这个方法用于获取执行命令后的输出流,即命令的输出结果。
4.3 源码
构建好直接运行即可。
我们要找到一个ConfigurationService.java
处理参数
处理参数的时候调用normailze.
这是个接口,看看这个接口是怎么实现的:
在ShortcutType的枚举类中实现的。调用了一个getValue方法
Expression会对Spring表达式进行处理。
以下是对代码的解释:
- 首先,对输入的字符串entryValue进行去除首尾空格的处理。
- 判断处理后的字符串是否以"#{"开头并以"}"结尾,如果是,则认为它是一个Spring表达式语言(SpEL)表达式。
- 如果满足上述条件,创建一个StandardEvaluationContext对象,并设置其BeanResolver为一个新的BeanFactoryResolver对象,该对象使用传入的beanFactory作为参数。
- 使用传入的parser对象解析entryValue字符串,得到一个Expression对象。
- 使用得到的Expression对象和创建的context对象计算表达式的值,并将结果赋值给value变量。
- 如果entryValue不满足上述条件,直接将entryValue赋值给value变量。
- 返回value变量的值。
5批量搜索
fofa语法:app="vmware-springBoot-framework"
链接:https://pan.baidu.com/s/1ergzQ83wCN5blOciB0d3VQ?pwd=lcbj
提取码:lcbj
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)