CVE-2022-22947SpringCloudGatewayRCE漏洞复现Spring Cloud Gateway 简介
Gateway是在Spring⽣态系统之上构建的⽹关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供⼀种简单⽽有效的⽅式来对API进⾏路由,以及提供⼀些强⼤的过滤器功能, 例如:熔断、限流、重试等。
在Spring应⽤⾥⾯启⽤Gateway服务只需要在pom⽂件⾥⾯引⼊关于⽹关的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-server</artifactId>
<version>3.1.0</version>
</dependency>
另外引发此次漏洞还有⼀个关键组件:Spring Boot Actuator (监控组件)
Spring Boot包含许多其他功能,可帮助您在将应⽤程序推送到⽣产环境时监视和管理应⽤程序。您可以选择使⽤HTTP端点或JMX来管理和监视应⽤程序。审核,运⾏状况和指标收集也可以⾃动应⽤于您的应⽤程序。
使⽤⽅法也是在pom⽂件中引⼊依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
攻击者可以访问Actuator API的情况下,将可以利⽤Spring Cloud Gateway漏洞执⾏任意命令。
第⼀步就是使⽤payload为⽬标⽹站添加⼀条过滤器
使⽤burp suite⼯具中的Repeater模块向⽬标⽹站发送⼀个Http请求
第⼆部发送Http请求刷新过滤器
最后可以使⽤GET请求去访问过滤器地址,我的BP反应太慢所以⼿动访问地址查看命令是否执⾏
访问所在地址命令返回了我虚拟机的root⽤户说明代码在服务器中执⾏成功了。
弄明⽩这个漏洞的实现原理需要很好的Java基础,介于⾃⼰Java学的不太好,我看了很多视频还有解析才⼤概明⽩原理。
在前⾯开启的Acutator组件可以控制Gateway,在Acutator在给Gateway创建路由的请求⾥⾯添加恶意命令,组件⾥⾯spEL表达式会将
恶意代码执⾏,使⽤SpEL可以有效缩减代码量,优化代码结构。跟log4j漏洞也有相同的地⽅都是为了赋值所引起的。
在前⾯添加路由的payload⾥⾯执⾏的代码就是利⽤spEL表达式执⾏了代码当中的:
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInp }
new String[]{\"whoami\"} 就是执⾏的恶意代码,通过Java中执⾏系统命令的代码 :
(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()
执⾏刚才的恶意代码
然后通过(T(org.springframework.util.StreamUtils).copyToByteArray获得结果 然后转换成字符串。
这个payload需要很强的Java基础才可以写的出来,我也是看了解析视频才⼤概了解payload是怎么执⾏的。还是要多多学习啊!
关于修护建议:
更新升级 Spring Cloud Gateway 到以下安全版本:cve漏洞库
Spring Cloud Gateway 3.1.1
Spring Cloud Gateway 3.0.7
如果⽹站业务不会使⽤到Actuator组件就可以将它禁⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论