影响范围

  • Spring Cloud Gateway 3.1.x - 3.1.1
  • Spring Cloud Gateway 3.0.x - 3.0.7
  • 旧版本 / 停止维护版本

漏洞类型

SpEL 表达式注入

操作系统限制

配置要求

默认配置

漏洞利用

命令执行,进行反弹 shell,写入内存马(删除路由后还能驻留在内存中)

利用原理

Spring Cloud Gateway 提供了一个管理端点(/actuator/gateway/routes),允许管理员通过 HTTP 请求动态地添加、删除或修改路由配置,该端点暴露且未受保护,攻击者可以发送 POST 请求来定义新的路由,并在 filters 参数注入恶意代码,网关价值配置时候,会调用 ShortcutConfigurable 接口,该接口会将 filters 参数的值传给 SpEL 解析引擎。利用链分两个阶段,第一阶段为存储阶段,攻击者通过 T () 操作符调用 Java 环境敏感类来构造恶意代码,此时恶意代码仅仅作为字符串存在网关内存配置;第二阶段为触发阶段,加载过程网关会解析恶意表达式,解析成功后 Runtime.exec() 被调用,在服务器执行系统命令

漏洞复现

现成的 vulhub 来拉取镜像

1
2
3
4
5
6
#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/spring/CVE-2022-22947
#拉取镜像
docker-compose up -d

1773373437627

用 burosuite 抓取 http://公网: 8080 数据包

1773373497270

发送 Repeater 模块

1773373535216

修改请求方法为 POST,路径修改为/actuator/gateway/routes/自定义名称,内容类型改为 Content-Type: appliaction/json,请求主体注入有害 payload

1773373619156

返回 201

1773373650371

应用刚添加的路由发送以下数据包,触发敏感命令执行,修改路径为/actuator/gateway/refresh,修改内容格式:Content-Type: application/x-www-form-urlencoded,发送

1773373682194

返回 200

1773373718780

修改请求方法为 GET,路径改为/actuator/gateway/routes/自定义名称,发送

1773373749244

返回执行结果

1773373777399

删除添加的路由,修改请求头为 DELETE,发送

1773373810115

发送 200

1773373835197