云计算百科
云计算领域专业知识百科平台

java 代码审计 - SpEL 表达式注入

什么是 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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » java 代码审计 - SpEL 表达式注入
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!