首页 > 其他分享 >一文详解SpEL表达式注入漏洞

一文详解SpEL表达式注入漏洞

时间:2023-02-21 16:06:09浏览次数:52  
标签:Spring 漏洞 SpEL 详解 2022 CVE 表达式

摘要:本文介绍了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表达式注入漏洞_Data

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

一文详解SpEL表达式注入漏洞_spring_02

图 1 常见的SpEL注入攻击流程

3 漏洞实例

3.1 CVE-2022-22963 Spring Cloud Function SpEL注入漏洞

3.1.1 基本信息

一文详解SpEL表达式注入漏洞_SpEL表达式_03

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.definitinotallow=functionRouter从而将默认路由绑定具体函数由用户进行控制。

攻击者调用/functionRouter接口,并在请求头的spring.cloud.function.routing-expression中使用攻击性的SpEL语句,服务端就会解析SpEL并执行。

漏洞攻击图示如图 2所示。

一文详解SpEL表达式注入漏洞_spring_04

图 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所示。

一文详解SpEL表达式注入漏洞_注入漏洞_05

图 3 CVE-2022-22963漏洞修复

3.2 CVE-2022-22980 Spring Data MongoDB SpEL 表达式注入漏洞

3.2.1 基本信息

一文详解SpEL表达式注入漏洞_注入漏洞_06

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漏洞攻击路径

一文详解SpEL表达式注入漏洞_spring_07

一文详解SpEL表达式注入漏洞_Data_08

图 4 CVE-2022-22980漏洞攻击路径

3.2.4 CVE-2022-22980复现

1)实验代码:learnjavabug

2)运行服务,com.threedr3am.bug.spring.data.mongodb.Application#main

3)Postman发送请求,如图 5所示

一文详解SpEL表达式注入漏洞_lua_09

图 5 Postman填写参数示例

4)现象:计算器程序被执行

3.2.5 CVE-2022-22980修复方式

Spring Data for MongoDB在修复此漏洞时,重新实现evaluator,指定EvaluationContext类型,如图 6所示。

一文详解SpEL表达式注入漏洞_spring_10

图 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​​​​​


点击关注,第一时间了解华为云新鲜技术~

标签:Spring,漏洞,SpEL,详解,2022,CVE,表达式
From: https://blog.51cto.com/u_15214399/6076647

相关文章

  • 华为HCIA认证R&S路由与交换综合实验案例详解
    HCIA-R&S综合实验一这篇文章主要介绍了华为HCIA认证R&S路由与交换综合实验,结合具体实验案例形式详细分析了华为HCIA认证路由与交换子网划分、路由配置相关原理、操作技巧与......
  • 使用java.util.Timer实现定时任务,详解Thread.sleep() in a loop, probably busy-waiti
    很多时候,我们需要定时任务实现一些诸如刷新,心跳,保活等功能。这些定时任务往往逻辑很简单,使用定时任务的框架(例如springboot@Scheduled)往往大材小用。下面是一个定时任......
  • 一文详解SpEL表达式注入漏洞
    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。本文分享自华为云社区《SpEL表达式注入漏洞分析、检查与防......
  • 一、全国医保接口开发详解(整体介绍)
    一、开发过程1、需求分析第一、首先肯定要仔细阅读接口文档,设计接口系统整体架构,也就是接口系统、HIS系统、医保系统各自的职责。搞清楚文档接口要实现的技术,是调用程......
  • bert 的输出格式详解
    输出是一个元组类型的数据,包含四部分,lasthiddenstateshape是(batch_size,sequence_length,hidden_size),hidden_size=768,它是模型最后一层的隐藏状态pooler_output......
  • Power Automate 常用表达式函数
     表达式函数的参考指南-AzureLogicApps|MicrosoftLearn日期和时间函数若要使用日期和时间,可以使用这些日期和时间函数。有关每个函数的完整参考,请参阅按字......
  • 定时任务 cron表达式
     cron有2种表达形式 6个时间刻度的话 ******  分别对应 秒分时日月星期;7个时间刻度的话 *******  分别对应 秒分时日月星期年;......
  • K8SYaml文件详解(云原生)
    一、K8S支持的文件格式kubernetes支持YAML和JSON文件格式管理资源对象。JSON格式:主要用于api接口之间消息的传递YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内......
  • elasticsearch之使用正则表达式自定义分词逻辑
    一、PatternAnalyzer简介elasticsearch在索引和搜索之前都需要对输入的文本进行分词,elasticsearch提供的patternanalyzer使得我们可以通过正则表达式的简单方式来定义分......
  • Java的Lambda表达式到底是啥?
    Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。实际上可以想象就是连创造匿名内......