扈季雅 发表于 2025-6-8 19:15:57

Java代码审计SpEL表达式注入

目录

[*]一、SpEL表达式概念
[*]二、SpEL 的作用和应用场景
[*]三、SpEL支持的功能特性
[*]四、SpEL的执行机制

[*]

[*]ExpressionParser(表达式解析器)
[*]EvaluationContext(表达式上下文)


[*]五、SpEL表达式使用方法

[*]

[*]1、基于注解
[*]2、XML
[*]3、外部传入动态执行


[*]六、SpEL注入示例
[*]七、SpEL利用的前置条件
[*]八、漏洞修复
[*]九、审计方法

一、SpEL表达式概念

Spring Expression Language(SpEL) 是 Spring Framework 提供的一种功能强大的表达式语言,全称为 Spring Expression Language,简称 SpEL。它类似于 Struts2 中的 OGNL 表达式语言,旨在为静态的 Java 语言增加动态执行能力,使开发者可以以一种更简洁、灵活的方式访问对象属性、调用方法、进行逻辑运算和动态赋值。
二、SpEL 的作用和应用场景

SpEL 的设计初衷是为了简化开发工作,提供一种 在运行时动态解析和执行表达式 的机制,常用于如下场景:

[*]配置 Bean 的属性值(配合 @Value 注解)
[*]Spring Security 权限表达式
[*]Spring Data JPA 查询表达式
[*]条件逻辑控制(如 SPEL 条件注解 @ConditionalOnExpression)
[*]模板引擎中处理动态数据
[*]静态方法调用或对象动态构造
举个简单例子,@Value("#{user.name}") 能让你动态从某个 Bean 中获取字段值注入到另一个 Bean 中。
SpEL 不仅支持属性访问和方法调用,还支持集合操作、正则匹配、表达式求值、对象创建等,是 Spring 应用中的通用表达式解析工具。
三、SpEL支持的功能特性

SpEL 主要支持以下操作:
功能示例描述文字表达式'hello', 123, true字符串、数字、布尔值、null属性访问person.name访问对象属性方法调用'abc'.toUpperCase()调用实例方法静态方法T(java.lang.Math).random()访问 Java 类的静态方法或字段对象创建new java.util.Date()实例化对象集合操作list, map['key']访问数组、List、Map关系运算符age > 18比较操作,如 >、 60 ? '及格' : '不及格'简化条件判断正则表达式'abc' matches '+'字符串正则匹配Bean 引用@myBean引用 Spring 容器中的 Bean投影操作list.!从集合中提取每个元素的某个属性过滤操作list.?过滤集合中满足条件的元素变量引用#name, #user.age使用上下文中定义的变量模板表达式"Welcome, #{#user.name}!"与字符串模板结合生成动态字符串四、SpEL的执行机制


[*]ExpressionParser
[*]EvaluationContext
ExpressionParser(表达式解析器)

用于将字符串形式的表达式解析为 Expression 对象:
ExpressionParser parser = new SpelExpressionParser();
Expression expr = parser.parseExpression("user.age");EvaluationContext(表达式上下文)

在执行表达式时提供变量、对象、函数等运行环境,简单来说,它是表达式执行的运行环境。
StandardEvaluationContext context = new StandardEvaluationContext(user);
int age = expr.getValue(context, Integer.class);主要有 StandardEvaluationContext 和 SimpleEvaluationContext两种
有些老版本不支持SimpleEvaluationContext,并且如果不做特意说明的情况下,默认是使用更不安全的StandardEvaluationContext
其中StandardEvaluationContext功能最强大,支持SpEL的所有特性,而SimpleEvaluationContext功能受限,专为安全场景设计
功能类别StandardEvaluationContext ✅SimpleEvaluationContext
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Java代码审计SpEL表达式注入