什么是 SpEL
SpEL(Spring Expression Language) 是 Spring 框架提供的一种功能强大的表达式语言,用于在运行时动态地查询和操作对象图。当用户输入被直接作为 SpEL 表达式求值且未做任何过滤时,攻击者可以构造恶意表达式执行任意代码。它支持:
-
字面量(字符串、数字)
-
方法调用
-
属性访问
-
三元运算符
-
集合操作
-
Bean 引用
-
创建对象(new 关键字)
-
执行系统命令
SpEL 注入原理
Spring 为解析 SpEL 提供了两套不同的接口,SimpleEvaluationContext和StandardEvaluationContext。
SimpleEvaluationContext接口仅支持 SpEL 语法的子集,抛弃了 Java 类型引用、构造函数及 beam 引用,相对较为安全;而StandardEvaluationContext则包含了 SpEL 的所有功能,并且在不指定EvaluationContext的情况下,将默认采用StandardEvaluationContext。
https://docs.springframework.org.cn/spring-framework/reference/core/expressions/evaluation.html
核心机制
应用程序使用SpelExpressionParser解析用户输入的字符串。
若该字符串被当作 SpEL 表达式处理(如#{…}或T(…)),则可执行任意 Java 代码。
攻击者通过构造恶意表达式,如调用Runtime.getRuntime().exec()执行系统命令。
典型触发点
URL 参数中触发 SpEL 注入
@RestController
public class SpELController{
private static final SpelExpressionParser parser = new SpelExpressionParser();
private final StandardEvaluationContext standardContext = new StandardEvaluationContext();
private final TemplateParserContext templateContext = new TemplateParserContext();
@RequestMapping(path = \”/standard\”, method = {RequestMethod.POST, RequestMethod.GET})
public String standard(@RequestParam(\”param\”)&nbs
网硕互联帮助中心







评论前必须登录!
注册