一文详解SpEL表达式注入漏洞
摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。
本文分享自华为云社区《SpEL表达式注入漏洞分析、检查与防御》,作者:华为云软件分析Lab。
在安全角度来看外部来源的数据,均应视为不可信数据,对外部数据,其包含的所有信息都须经过校验或者过滤,再向下游服务进行传递。若无防护手段,攻击者可以通过构造恶意输入,对服务进行攻击。程序中如果使用未经校验的输入构造SpEL语句,就有可能造成SpEL表达式注入漏洞。部分SpEL表达式注入漏洞CVSS3.x 评分极高,nvd认定为高危漏洞,具有高致命性。
1 SpEL表达式介绍
Spring表达式语言(Spring Expression Language,SpEL)是 Spring Framework的核心技术之一,其支持在运行时查询和操作对象图。SpEL语法类似于Unified Expression Language,但提供了更加丰富的功能,最特别的是方法调用与字符串模板功能。SpEL主要支持以下功能:
- 文字表达式
- 布尔和关系运算符
- 正则表达式
- 类表达式
- 访问 properties, arrays, lists, maps
- 方法调用
- 关系运算符
- 参数
- 调用构造函数
- Bean引用
- 构造Array
- 内嵌lists
- 内嵌maps
- 三元运算符
- 变量
- 用户定义的函数
- 集合投影
- 集合筛选
- 模板表达式
SpEL功能强大,可以操作类和方法。
- 引用方法:dog.run()
- 引用静态方法:T(java.lang.Math).PI
- 类实例化:使用new实例化对象,类名必须是全限定名,java.lang包内的除外如Integer、String等
- 变量定义及赋值引用
在解析SpEL之后,获取表达式结果时,可以指定表达式的上下文对象:EvaluationContext
- (默认)StandardEvaluationContext:支持全套SpEL语言和功能配置选项,功能强大但存在隐患
- SimpleEvaluationContext:仅支持SpEL语法的子集,不包括Java类型引用,构造函数和bean引用,功能相对简单但是安全
2 SpEL表达式注入漏洞
历史报告的大部分SpEL漏洞大多涉及不受信任的用户输入的情况,恶意攻击者可能利用SpEL实现任意代码执行、拒绝服务等攻击,与SpEL相关的部分CVE漏洞见表 1。
表 1 部分SpEL注入CVE漏洞

常见的SpEL注入攻击流程如图 1所示,漏洞的基本条件有: 使用StandardEvaluationContext,2. 未对输入的SpEL进行校验,3. 对表达式调用了getValue()或setValue()方法。当满足上述条件时,就给了攻击者可乘之机。

图 1 常见的SpEL注入攻击流程
3 漏洞实例
3.1 CVE-2022-22963 Spring Cloud Function SpEL注入漏洞
3.1.1 基本信息

3.1.2 Spring Cloud Function 介绍
Spring Cloud Function 是基于 Spring Boot 的函数计算框架。它提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像 Amazon AWS Lambda 这样的 FaaS(函数即服务,function as a service)平台。该项目致力于促进函数为主的开发单元,它抽象出所有传输细节和基础架构,并提供一个通用的模型,用于在各种平台上部署基于函数的软件。
3.1.3 CVE-2022-22963漏洞攻击路径
使用spring-cloud-function-web的Spring boot 应用,通过设置Message Headers来传达路由指令,也可以在请求头中指定spring.cloud.function.definition 或spring.cloud.function.routing-expression作为应用程序属性,允许使用 Spring 表达式语言。
当在application.properties中设置spring.cloud.function.definition=functionRouter从而将默认路由绑定具体函数由用户进行控制。
攻击者调用/functionRouter接口,并在请求头的spring.cloud.function.routing-expression中使用攻击性的SpEL语句,服务端就会解析SpEL并执行。
漏洞攻击图示如图 2所示。

图 2 CVE-2022-22963漏洞攻击路径
3.1.4 CVE-2022-22963漏洞修复方式
该漏洞主要从四处进行了修复,(1)声明一个SimpleEvaluationContext,专用作来自header的SpEL的解析 ;(2)新增一个布尔变量isViaHeader,用于标记当前Expression是否来自Header;(3)如果是从Header中获取的spring.cloud.function.routing-expression表达式,isViaHeader为true ;(4)isViaHeader为true时,expression.getValue指定使用headerEvalContext。如图 3所示。

图 3 CVE-2022-22963漏洞修复
3.2 CVE-2022-22980 Spring Data MongoDB SpEL 表达式注入漏洞
3.2.1 基本信息

3.2.2 Spring Data for MongoDB 介绍
Spring Data for MongoDB是Spring Data的一个子模块。 目标是为MongoDB提供一个相近的一致的基于Spring的编程模型。其核心功能是映射POJO到Mongo的DBCollection中的文档,并且提供Repository 风格数据访问层。主要特性有:
• Spring 配置支持:使用基于 Java 的 @Configuration 类或基于 XML 命名空间的配置来驱动 Mongo 实例和副本
• MongoTemplate 辅助类:可提高执行常见 Mongo 操作的效率,包括文档和 POJO 之间的集成对象映射
• 异常处理:异常转换为 Spring 的可移植的数据访问异常层次结构
• 功能丰富的对象映射与 Spring 的转换服务集成
• 基于注释的映射元数据、并且可扩展以支持其他元数据格式
• 持久化和映射生命周期事件
• 使用 MongoReader/MongoWriter 抽象的低级映射
• 基于 Java 的查询、条件和更新 DSL
• Repository 接口的自动实现,包括对自定义查询方法的支持
• QueryDSL 集成以支持类型安全的查询,以及地理空间整合
• Map-Reduce 集成
• JMX 管理和监控
• 对存储库的 CDI 支持
• GridFS 支持
3.2.3 CVE-2022-22980漏洞攻击路径


图 4 CVE-2022-22980漏洞攻击路径
3.2.4 CVE-2022-22980复现
1)实验代码:learnjavabug
2)运行服务,com.threedr3am.bug.spring.data.mongodb.Application#main
3)Postman发送请求,如图 5所示

图 5 Postman填写参数示例
4)现象:计算器程序被执行
3.2.5 CVE-2022-22980修复方式
Spring Data for MongoDB在修复此漏洞时,重新实现evaluator,指定EvaluationContext类型,如图 6所示。

图 6 CVE-2022-22980修复方式
4 检测与防御手段
(1)对于SpEL表达式注入漏洞漏洞,可以使用静态分析工具进行代码检查,可以有效规避部分问题。
(2)在此类场景中,对于用户输入,应当仔细校验,检查用户输入的合法性,保障其内容为正常数据。且在端侧与服务侧均应对用户数据进行校验,对非受信用户输入数据进行净化,避免用户输入任意内容。
(3)及时更新Spring Framework版本,避免因版本老旧而被利用的问题发生。
(4)使用源码静态分析工具进行白盒自动化检测,在代码合入阶段、静态分析监控阶段及时发现相关问题。
文章来自:PaaS技术创新Lab,PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。
PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html
一文详解SpEL表达式注入漏洞的更多相关文章
- SpEL表达式注入漏洞学习和回显poc研究
目录 前言 环境 基础学习和回显实验 语法基础 回显实验 BufferedReader Scanner SpEL漏洞复现 低版本SpringBoot中IllegalStateException CVE ...
- SpringBoot SpEL表达式注入漏洞-分析与复现
目录 0x00前言 0x01触发原因 0x02调试分析 0x03补丁分析 0x04参考文章 影响版本: 1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升至1.3.1或以上版本 ...
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
前言 这是2016年的一个洞,利用条件是至少知道一个触发 springboot 默认错误页面的接口及参数名. 影响版本:1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升级版本 ...
- 一文详解Hexo+Github小白建站
作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...
- 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)
一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop) 概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...
- JAVAEE——spring01:介绍、搭建、概念、配置详解、属性注入和应用到项目
一.spring介绍 1.三层架构中spring位置 2.spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还 ...
- 第六天实验详解——dedecms通过xss漏洞写马
第六天实验详解 **XSS跨站攻击的分类** XSS漏洞类型主要分为持久型和非持久型两种: 1. 非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞. 2. 持久型X ...
- Cron表达式详解和表达式的验证
本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...
- 一文详解 OpenGL ES 3.x 渲染管线
OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...
- 一文详解 WebSocket 网络协议
WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...
随机推荐
- linux系统安装nginx中的subs-filter模块
debain系 nginx源里面一般都包含 nginx的第三方模块 所以对应已经安装了nginx 的系统可以直接安装第三方模块 sudo apt install libnginx-mod-http-s ...
- HashMap为何线程不安全?HashMap,HashTable,ConcurrentHashMap对比
这两天写爬虫帮组里收集网上数据做训练,需要进一步对收集到的json数据做数据清洗,结果就用到了多线程下的哈希表数据结构,猛地回想起自己看<Java并发编程的艺术>框架篇的时候,在Concu ...
- Zabbix技术分享——docker组件编译使用教程
docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源,它可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器上,还可以实现 ...
- 为什么推荐Kestrel作为网络开发框架
为什么推荐Kestrel 网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestr ...
- 数据结构学习——BST删除特定节点
BST删除特定节点 前言 一个平常的星期三晚上,一节通选课中,在老师放的视频和极寒空调的折磨之下,想着做点别的什么的我,打开了博客园.想起来做题下午数据结构课中老师最后在讲BST删除节点的操作,并且以 ...
- 【数据结构与算法】希尔排序 python和c++实现
算法思路 每一次:固定间隔把数据分组,每一组进行排序 每次比上次选取更小的间隔分组,再每组排序,直到间隔为1 代码 c++:(越看越不明白了,后看) int gap = length;//length ...
- python 水仙花数、菱形、99乘法表、直角三角形
空心菱形 i = 1 while i <= 3: # 控制行数 j = 1 k = 1 while j <= 3-i: # 控制空格数量 print(" ", end= ...
- 开源库libcli的安装与使用
源码:https://github.com/dparrish/libcli 环境 Ubuntu 20.04.2 LTS 编译libcli 参考:README.md 按照libcli中的 README ...
- dfs学习笔记
题目链接 可以通过参考一道例题来加深对dfs的认知和学习 题意描述 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数 字序列中不允许出现重复的数字. 输出格式 ...
- java进阶篇——Stream流编程
Stream流 函数式接口 1.消费型接口--Consumer @FunctionalInterface public interface Consumer<T> { /** * 对给定的 ...