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

时间:2023-02-22 11:14:03
摘要:本文介绍了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表达式注入漏洞