详解Remote Code Execute 漏洞&SpEL Code Injection 漏洞

2024-07-18 191 0

1 什么是Spring Cloud Gateway?

Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令。

1.1网管

单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务:

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图

1.2 网关的作用:

Spring Cloud Gateway是Spring Cloud生态系统中的一员,它被设计用于处理所有微服务的入口流量。作为一个反向代理,它不仅提供了负载均衡和路由功能,还支持灵活的过滤器机制,过滤器可以在请求进入网关和离开网关时执行,用于处理各种逻辑,如身份验证、日志记录和性能监测,使得开发者能够定制和扩展其功能。详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图1

网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上。

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图2

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启动靶场:

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图3

3.2 添加过滤器

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图4

3.3 刷新路由

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图5

3.4 访问路由

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图6

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类来实现这个功能。

  1. T(org.springframework.util.StreamUtils).copyToByteArray():这是Spring框架中的一个方法,用于将输入流的内容复制到字节数组中。在这里,它将执行whoami命令后的输出流转换为字节数组。

  2. T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}):这是Java中的一个方法,用于执行指定的系统命令。在这里,它执行了whoami命令,该命令通常用于获取当前用户的用户名。

  3. .getInputStream():这个方法用于获取执行命令后的输出流,即命令的输出结果。

4.3 源码

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图7

构建好直接运行即可。

我们要找到一个ConfigurationService.java

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图8

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图9

处理参数

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图10

处理参数的时候调用normailze.

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图11

这是个接口,看看这个接口是怎么实现的:

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图12

在ShortcutType的枚举类中实现的。调用了一个getValue方法

详解Remote Code Execute 漏洞&SpEL Code Injection  漏洞插图13

Expression会对Spring表达式进行处理。

以下是对代码的解释:

  1. 首先,对输入的字符串entryValue进行去除首尾空格的处理。
  2. 判断处理后的字符串是否以"#{"开头并以"}"结尾,如果是,则认为它是一个Spring表达式语言(SpEL)表达式。
  3. 如果满足上述条件,创建一个StandardEvaluationContext对象,并设置其BeanResolver为一个新的BeanFactoryResolver对象,该对象使用传入的beanFactory作为参数。
  4. 使用传入的parser对象解析entryValue字符串,得到一个Expression对象。
  5. 使用得到的Expression对象和创建的context对象计算表达式的值,并将结果赋值给value变量。
  6. 如果entryValue不满足上述条件,直接将entryValue赋值给value变量。
  7. 返回value变量的值。

5批量搜索

fofa语法:app="vmware-springBoot-framework"

链接:https://pan.baidu.com/s/1ergzQ83wCN5blOciB0d3VQ?pwd=lcbj 
提取码:lcbj


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

苹果试图保护你的隐私,OpenAI可能做不到
Shuffle:一款完全自动化的安全栈增强平台
如何使用CODASM编码Payload并降低熵值
SessionExec:一款针对会话安全的安全命令测试工具
Arkime:一款大规模数据包捕获和索引数据库系统
从蓝队流量角度分析Shiro-550反序列化漏洞

发布评论