🗒️SpEL表达式及SpEL表达式注入
2023-3-9
| 2023-4-18
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
 
SpEL 表达式

简介

Spring Expression Language(简称SpEL)是一种功能强大的表达式语言,是spring提供的,该语言类似于JSP当中的EL表达式。但提供了很多额外的功能,最出色的就是函数调用和简单字符串的模板函数。他需要使用spring提供的解析器来解析,但是他不依赖于spring,可以独立使用。 框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系,而SpEl可以方便快捷的对ApplicationContext中的Bean进行属性的装配和提取。

扩展

EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。 写法为 ${表达式内容}

使用SpEL的场景:

1.@Value注解可以通过@Value(“${xxxx}”)的形式来获取application当中的配置,使用@Value(“#{xxxx}”)的形式可以使用SpEL表达式 2.spring cache当中@Cache相关的注解当中的key属性值可以使用SpEL表达式 3.xml当中bean标签下property属性注入,是利用属性set方法注入的,然后使用spel表达式也是#{ }

语法使用

1.类类型表达式:使用 T(Type) 来表示 java.lang.Class 实例,这里 Type 必须是类全限定名(java.lang 包除外,该包下的类可以不指定包名,如 String、Integer); 使用类类型表达式还可以进行访问类静态方法及类静态字段。 2.类实例化:类实例化同样使用 java 关键字 new ,类名必须是全限定名,但 java.lang 包内的类型除外,如 String、Integer 。
3.instanceof 表达式:SpEL 支持 instanceof 运算符,跟 Java 内使用同义,如: ‘haha’ instanceof T(String) 将返回 true 。
4.变量定义以及引用:变量定义通过 EvaluationContext 接口的 setVariable(variableName, value) 方法定义,在表达式中使用"#variableName"引用; 除了引用自定义变量,SpEL 还允许引用根对象及当前上下文对象,使用"#root"引用根对象,使用"#this"引用当前上下文对象。
5.自定义函数:目前只支持类静态方法注册为自定义函数; SpEL 使用 StandardEvaluationContext 的 registerFunction 方法进行注册自定义函数.

漏洞原理

问题就在于使用EvaluationContext接口的StandardEvaluationContext来处理SpEL表达式,StandardEvaluationContext - 公开全套SpEL语言功能和配置选项。您可以使用它来指定默认的根对象并配置每个可用的评估相关策略。 使用EvaluationContext的另一个实现类SimpleEvaluationContext可以防止注入,不进行设置默认使用StandardEvaluationContext. 案列 SpringBoot SpEL表达式注入漏洞 版本:1.1.0-1.1.12 1.2.0-1.2.7,1.3.0 在异常信息中包含SpEL表达式即可注入 用于递归解析模板页面相关数据,导致SpEl表达式注入并执行。 Spring Data Commons远程代码执行漏洞 版本:1.13-1.13.10 2.0-2.0.5 在form表单中传入表达式注入 当用户在开发中利用了Spring-data-commons中的特性对用户的输入参数进行自动匹配时候,会将用户提交的form表单中的参数名作为SpEL执行。

审计

手动查看ExpressionParser类----getValue()方法----EvaluationContext,查看接口是否使用默认的StandardEvaluationContext.

修复

使用SimpleEvaluationContext代替StandardEvaluationContext 对用户传入的参数进行过滤 链接: http://rui0.cn/archives/1043https://blog.csdn.net/weixin_43888891/article/details/127520555Spring
漏洞
  • 漏洞
  • 表达式
  • Spring Cloud Gateway代码注入漏洞smms+PicGo图床使用
    目录