CVE-2022-22947 Spring Cloud Gateway
远程代码执行(Remote Code Execute)漏洞\命令注入(SpEL Code Injection)漏洞
- SpEL表达式语言
能够在运行时动态赋值,且可使用Java类和方法。T(类的全路径)即可使用Java类
Spring Cloud Gateway
spring boot的网关组件,为微服务架构提供一种简单有效的统一的 API 路由管理方式
API网关是一个服务器,是系统的唯一入口。所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。
- Filter(过滤器): 是GatewayFilter的一个实例,过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容
- Predicate(断言):路由转发的判断条件,使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数
- Route(路由):网关配置的基本组成模块。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问
- 处理流程
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。Handler通过指定的过滤器链将请求发送到服务并执行业务逻辑,然后返回。过滤器可能会在发送代理请求之前或之后执行业务逻辑。
Spring Boot Actuator
spring boot的监控组件,提供安全端点,用于监视和管理Spring Boot应用程序
Spring Boot Actuator端点
端点 | 用法 |
---|---|
/env | 查看应用程序中使用的环境变量列表 |
/info | 查看有关Spring Boot应用程序的信息 |
/beans | 查看Spring bean及其类型,范围和依赖关系 |
/health | 查看应用程序运行状况 |
/trace | 查看Rest端点的跟踪列表 |
/metrics | 查看应用程序指标 |
Gateway和Actuator集成
/gateway执行器端允许监视Spring Cloud Gateway应用程序并与之交互。要进行远程访问,必须在应用程序属性中通过HTTP或JMX启用和公开端
management.endpoint.gateway.enabled=true
management.endpoints.web.exposure.include=gateway
Actuator操作Gateway接口列表
http://host:port/actuator/gateway/id
id | 描述 |
---|---|
globalfilters | GET方法,返回全局Filter列表 |
routefilters | GET方法,每个路由的filter |
routes | GET方法,路由列表 |
routes/{路由} | GET方法,指定路由的信息 |
routes/{路由} | POST方法,创建路由 |
refresh | POST方法,刷新路由缓存 |
routes/{路由} | DELETE方法,删除路由 |
漏洞复现
启动Spring Cloud Gateway本地服务
服务端口配置为9000
访问成功,服务已启动
使用bp创建路由并添加恶意过滤器规则
响应成功创建
刷新路由缓存使其生效
浏览器查看刚才创建的路由信息,Result的值成功执行了whoami命令
删除路由后刷新路由清除缓存
也可使用Python自动化脚本执行任意命令
payload分析
#{new String(
T(org.springframework.util.StreamUtils).copyToByteArray(
T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"})
.getInputStream()))}
- new String[]{“whoami”}
创建字符串,内容为要执行的命令 - T(java.lang.Runtime).getRuntime().exec()
Java中执行操作系统命令 - .getInputStream()
获得执行结果 - T(org.springframework.util.StreamUtils).copyToByteArray()
spring工具类的方法将执行结果转换为字节数组 - new String()
将结果转换为字符串 - #{
SpEL表达式的必要格式,利用SpEL表达式特性执行恶意代码
漏洞发生条件
- Spring Cloud Gateway < 3.1.1
- Spring Cloud Gateway < 3.0.7
- Spring Cloud Gateway集成了Actuator
漏洞修复
- 更新升级Spring Cloud Gateway到安全版本
- 在不考虑影响业务的情况下禁用Actuator端点
management.endpoint.gateway.enable: false