关注公众号回复“漏洞”获取研究环境
Spring Cloud Function是基于SpringBoot的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。
近日Spring Cloud Function Github发布了一个漏洞更新信息GH-835:
从描述来看,这是一个SPEL表达式注入漏洞,影响版本为`3.x<=v3.2.2`。
利用idea新建一个SpringBoot项目(JDK17),在`pom.xml`中引入Spring Cloud Function依赖项:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-function-context -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-context</artifactId>
<version>3.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-function-webflux -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-function-webflux</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-function-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-dependencies</artifactId>
<version>3.2.2</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-function-web -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-web</artifactId>
<version>3.2.2</version>
</dependency>
修改主要位于`RoutingFunction`类:
类中新定义`SimpleEvaluationContext`对象`headerEvalContext`,函数`functionFromExpression`增加了一个bool类型参数`isViaHeader`,当`isViaHeader`为`True`时,将用`SimpleEvaluationContext`代替`StandardEvaluationContext`,从而修复了SPEL表达式注入漏洞。
`RoutingFunction`继承于`Function`:
查看官方文档:
为了能够顺利进入`RoutingFunction`,在SpringBoot项目的`application.properties`中添加配置:
spring.cloud.function.definition:functionRouter
全文搜索`RoutingFunction`,排除全部Test对象,定位`FunctionWebRequestProcessingHelper`:
进入`FunctionWebRequestProcessingHelper.processRequest`:
搜索`FunctionWebRequestProcessingHelper.processRequest`调用情况,发现在`FunctionController`接口处理POST请求时存在调用关系:
借助idea actuator的mapping功能查看Controller:
构造如下测试请求:
POST /test HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 4
test
触发断点:
往下走:
当`function`为`RoutingFunction`类型时,`function.apply`将进入`RoutingFunction#apply`:
进入`route`函数:
尝试从Header中提取`spring.cloud.function.routing-expression`,然后调用`functionFromExpression`函数。修改请求:
进入`functionFromExpression`函数:
触发SPEL表达式解析。
换成SPEL表达式漏洞payload,触发RCE:
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
关注公众号回复“漏洞”获取研究环境
原文始发于微信公众号(且听安全):【最新漏洞预警】Spring Cloud Function SPEL表达式注入漏洞分析与复现