SpringCloud Function SpEL注入漏洞分析及环境搭建


Posted in Java/Android onApril 08, 2022

SpringCloud Function 介绍

SpringCloud 是一套分布式系统的解决方案,常见的还有阿里巴巴的Dubbo,Fass(Function As A Service )的底层实现就是函数式编程,在视频转码、音视频转换、数据仓库ETL等与状态相关度低的领域运用的比较多。开发者无需关注服务器环境运维等问题上,专注于自身业务逻辑实现即可。

SpringCloud Function 就是Spring提供的分布式函数式编程组件。

SpringCloud Function SpEL注入漏洞分析及环境搭建

漏洞环境搭建

通过idea新建一个Spring项目,pom中引入spring-boot-starter-webspring-cloud-function-web,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringCloudDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloudDemo</name>
    <description>SpringCloudDemo</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-function-web</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

SpringCloud Function SpEL注入漏洞分析及环境搭建

其中spring-cloud-function-web的依赖如上图,核心实现为spring-cloud-function-core包。

先在main函数中新建两个方法(uppercase将字符串变为大写,reverse字符串反转):

SpringCloud Function SpEL注入漏洞分析及环境搭建

当在pom中引入spring-cloud-function-web后,函数会自动添加为HTTP端点。

然后漏洞关键是在application.properties 或者yaml配置文件中新增一行:

spring.cloud.function.definition=functionRouter

这里的属性spring.cloud.function.definition 表示声明式函数组合,这个功能允许在提供属性时使用|(管道),;(过滤)分隔符以声明的方式提供组合指令。例如

--spring.cloud.function.definition=uppercase|reverse

举例:

当配置该属性为uppercase时,访问根路径提交的参数会自动被uppercase函数接受转化为大写:

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

反之若配置为reverse则默认路径函数功能为反转字符串:

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

通俗来讲这个属性就是一个默认路由, 可以手动指定相关函数,也可以使用functionRouter ,指定的方式可以是配置文件、环境变量或者启动参数等。

functionRouter

如果设置为functionRouter则默认路由绑定的具体函数交由用户进行控制,在 Spring Cloud Function Web里面,可以通过设置http头的方式来控制,使用spring.cloud.function.definitionspring.cloud.function.routing-expression 都可以,区别是后者允许使用Spring表达式语言(SpEL)。

举例:

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

因为spring.cloud.function.routing-expression 允许使用SpEL表达式,所以就可能存在SpEL注入。

SpEL注入

这里简单介绍下SpEL,Spring Expression Language 是Spring提供的具有方法调用和基本的字符串模版功能的套件。类似OGNL、MVEL、JBoss EL。

SpEL可以字符串之间进行嵌套也可以单独使用,嵌套时使用#{}(实现ParserContext接口)。

举例:

SpringCloud Function SpEL注入漏洞分析及环境搭建

但因为Spel支持方法调用,所以如果使用的是StandardEvaluationContext 进行解析(默认),则可能会被滥用,如使用new ProcessBuilder('/System/Applications/Calculator.app/Contents/MacOS/Calculator').start()可触发命令执行:

SpringCloud Function SpEL注入漏洞分析及环境搭建

漏洞复现

既然SpringCloud Function 中的functionRouter支持SpEL那是不是存在SpEL注入呢,我们在HTTP头中插入上面调起计算器的SpEL表达式

Payload: spring.cloud.function.routing-expression: new ProcessBuilder('/System/Applications/Calculator.app/Contents/MacOS/Calculator').start()

非常简单粗暴,漏洞复现成功:

SpringCloud Function SpEL注入漏洞分析及环境搭建

原理分析

在命令执行出下断点,看下程序执行流程。

SpringCloud Function之所以能自动将函数建立http端点,是因为在包mvc.FunctionController中使用/** 监听了get/post类型的所有端点。

SpringCloud Function SpEL注入漏洞分析及环境搭建

1.当一个请求进入时,程序首先基于Springboot的自动配置,将配置文件注入到functionProperties,随后将以“WebRequestConstants.handler”为key,function为值添加到request数组里面。

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

2.请求正式进入Controller节点,Controller首先会将请求使用wrapper进行包装,wrapper就是将request转成FunctionInvocationWrapper 格式。

SpringCloud Function SpEL注入漏洞分析及环境搭建

3.随后进入processRequest 对request进行处理,执行function的apply方法,跳转到doApply()时会对function进行判断,判断是不是functionRouter方法,根据咱们的配置文件此时的function为RoutingFunction.FUNCTION_NAMEfunctionRouter所以会,一路跳转到RoutingFunction.route

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

5.随后进入else if 分支,http头spring.cloud.function.routing-expression 不为空,则传入其值到functionFromExpression方法。

SpringCloud Function SpEL注入漏洞分析及环境搭建

6.使用标准的StandardEvaluationContext 对header的值进行SpEL表达式解析:

SpringCloud Function SpEL注入漏洞分析及环境搭建

SpringCloud Function SpEL注入漏洞分析及环境搭建

后续就不用再跟下去了,至此可以发现,只要通过环境变量、配置文件或者参数等方式配置为spring.cloud.function.definition=functionRouter 即可触发SpEL注入。

补丁分析

SpringCloud官方已经修复了此问题(https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f)

和其他SpEL注入修复方式一样,使用了SimpleEvaluationContext替换StandardEvaluationContext,那这个漏洞基本就算修复完成了。但因为这个commit还没有纳入版本,所以目前springcloud Function3.0以上版本仍然暴露在风险之中。

SpringCloud Function SpEL注入漏洞分析及环境搭建

引用

https://spring.io/projects/spring-cloud-function#overview
https://cloud.spring.io/spring-cloud-function/reference/html/spring-cloud-function.html#_function_catalog_and_flexible_function_signatures
https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f
http://itmyhome.com/spring/expressions.html

到此这篇关于SpringCloud Function SpEL注入漏洞分析的文章就介绍到这了,更多相关SpringCloud Function SpEL注入漏洞分析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
Java框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
HashMap实现保存两个key相同的数据
Jun 30 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
idea以任意顺序debug多线程程序的具体用法
Aug 30 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
解析mybatis-plus中的resultMap简单使用
Nov 23 Java/Android
Java 超详细讲解设计模式之中的抽象工厂模式
Mar 25 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
详解Spring Bean的配置方式与实例化
Jun 10 Java/Android
java实现自定义时钟并实现走时功能
Jun 21 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 #Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
Java 垃圾回收超详细讲解记忆集和卡表
Java 常见的限流算法详细分析并实现
Java 超详细讲解ThreadLocal类的使用
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Java详细解析==和equals的区别
Apr 07 #Java/Android
You might like
基于mysql的论坛(6)
2006/10/09 PHP
php防止用户重复提交表单
2015/11/02 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
Python简单I/O操作示例
2019/03/18 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
Python datetime模块使用方法小结
2020/06/18 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
计算机求职信
2013/12/01 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
发票退票证明
2015/06/24 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
高二数学教学反思
2016/02/18 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫