当前位置: 首页 > news >正文

应用安全系列之四十六:Expression Language Injection (EL注入)

1、EL注入简介

Expression Language Injection (EL注入)是一种安全漏洞,攻击者能够注入并执行恶意的EL表达式,导致服务器端代码执行、敏感信息泄露或服务拒绝等安全问题。在Java EE环境中,特别是使用JSP(JavaServer Pages)技术的应用程序中,EL用于简化页面逻辑处理和数据展示。如果未正确处理用户输入,攻击者可以通过构造恶意输入来执行任意代码或者访问敏感信息。

EL注入的工作原理类似于其他注入攻击:

1、应用程序接收用户输入

2、未经验证或转义就将用户输入作为EL表达式处理

3、服务器解析并执行这些表达式,可能导致恶意操作

2、攻击原理

2.1、EL 表达式的解析

在 buildConstraintViolationWithTemplate 中,${...} 是一种表达式语言(EL)语法,Hibernate Validator 默认会解析这些表达式。

如果用户输入的内容直接被嵌入到错误消息模板中,并且没有经过适当的清理或转义,攻击者可以通过构造恶意输入来执行任意 EL 表达式。

2.2、潜在风险

  1. 攻击者可以利用 EL 表达式访问系统对象(如环境变量、文件系统等),甚至执行任意代码。
  2. 这种漏洞可能导致信息泄露、权限提升或其他严重后果。

2.3、示例攻击

假设某个字段允许用户输入值,并且该值直接被插入到错误消息模板中:

@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {
   if (value == null || value.isEmpty()) {
        context.disableDefaultConstraintViolation(); 
        context.buildConstraintViolationWithTemplate("Invalid value: ${validatedValue}")               .addConstraintViolation();        
        return false;    
    }    
    return true;
}

如果用户输入如下内容:

${T(java.lang.Runtime).getRuntime().exec('rm -rf /')}

当 EL 表达式被解析时,这将尝试执行系统命令 rm -rf /,从而导致严重的安全问题。

3、Spring 中易导致EL注入的API

以下Spring框架中的API容易导致EL注入问题:

1、Spring Expression Language (SpEL)

  1. SpelExpressionParserEvaluationContext ConstraintValidatorContext 相关方法(如:buildConstraintViolationWithTemplate),这些类用于解析和评估Spring表达式语言(SpEL),如果开发者不谨慎处理用户输入,就可能存在注入风险。
  2. @Value 注解中使用SpEL表达式,在Spring配置类或组件中使用@Value注解时,如果值来源于不可信来源且包含SpEL表达式,则可能导致安全问题。

2、JSP EL表达式

在JSP页面中直接使用 ${userInput}

3、Spring MVC 视图层

Thymeleaf、FreeMarker等模板引擎中不安全的表达式处理Spring Boot默认支持Thymeleaf作为视图层技术,虽然Thymeleaf默认是安全的,但如果启用了不安全的特性或错误地配置了模板引擎,仍有可能导致类似的注入问题。

4、Spring Data查询

使用SpEL的 @Query 注解

4、EL注入的解决方案

为了避免这种攻击,可以采取以下措施:

1 禁用 EL 表达式解析
  • Hibernate Validator 允许通过配置禁用 EL 表达式的解析。这是最直接和推荐的方法。 
  • 设置系统属性 hibernate.validator.el.enabled 为 false
  • System.setProperty("hibernate.validator.el.enabled", "false");
  • 在 Spring Boot 应用中,通过 application.properties 配置:
spring.jpa.properties.hibernate.validator.el.enabled=false

2、避免直接使用用户输入作为模板内容

不要直接将用户输入嵌入到错误消息模板中。可以通过硬编码模板或对用户输入进行严格的验证和清理来避免问题。

@Overridepublic boolean isValid(String userInput, ConstraintValidatorContext context) { 
   if (!isValidLogic(userInput)) {        
        String safeMessage = "Invalid input"; // 使用固定的错误消息        
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(safeMessage).addConstraintViolation();        return false;    
    }    
return true;
}

3、使用占位符而非 EL 表达式

  • 如果需要动态生成错误消息,可以使用占位符(如 {0}),并通过参数化的方式传递值,而不是依赖 EL 表达式。
@Overridepublic boolean isValid(String userInput, ConstraintValidatorContext context) {
    if (!isValidLogic(userInput)) {        
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate("Invalid input: {0}") 
              .addPropertyNode("fieldName").addConstraintViolation();        
        return false;    
    }    

    return true;
}

4、升级到最新版本 

    • 确保使用的 Hibernate Validator 和相关库是最新版本,因为较新的版本可能已经修复了已知的安全漏洞。

    5、输入验证与过滤

      • 对所有用户输入进行严格的验证。
      • 过滤或转义EL表达式特殊字符如 ${}, #, T(), new 等

      6、使用安全的API配置

        // 使用SimpleEvaluationContext代替StandardEvaluationContext
        
        EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();

        5、总结

        • 风险点
          • buildConstraintViolationWithTemplate 方法默认支持 EL 表达式解析,如果用户输入被直接嵌入到模板中,可能导致 EL 注入攻击。
        • 解决方案
          1. 禁用 EL 表达式解析(推荐)。
          2. 避免直接使用用户输入作为模板内容。
          3. 使用占位符或硬编码的错误消息。
          4. 升级到最新的 Hibernate Validator 版本。
          5. 输入验证与过滤
          6. 使用安全的API配置

        通过采取上述措施,可以有效防止 buildConstraintViolationWithTemplate 导致的 EL 注入攻击,确保应用程序的安全性。

        相关文章:

      1. C语言实现TcpDump
      2. MATLAB在工程领域的实际应用案例
      3. 【 antd 】Form表单组件,“change“ 不生效
      4. RK3588芯片NPU的使用:Windows11 Docker中运行PPOCRv4例子
      5. 人工智能100问☞第1问:人工智能(AI)的定义是什么?
      6. [D1,2]回溯刷题
      7. python面试技巧
      8. Android 应用蓝牙连接通信实现
      9. 巧*书重大更新!商务标智能编写,标书一次成型!
      10. 函数式编程在 Java:Function、BiFunction、UnaryOperator 你真的会用?
      11. 研发效能实践:BDD(行为驱动开发)深度解毒手册:从「撕逼大会」到「人见人爱」的协作秘笈
      12. chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
      13. SQL:DML的基本语法
      14. android wifi通过命令行打开2.4G热点
      15. 网络安全·第二天·ARP协议安全分析
      16. 从代码学习深度学习 - 注意力汇聚:注意力评分函数(加性和点积注意力) PyTorch 版
      17. SQL问题分析与诊断(8)——其他工具和技术
      18. ECMAScript 7~10 新特性
      19. RLAgent note
      20. 数据结构与算法-动态规划-线性动态规划,0-1背包,多重背包,完全背包,有依赖的背包,分组背包,背包计数,背包路径
      21. 网站被百度k掉怎么办/中国新闻今日头条
      22. 姓名域名/长沙网站托管优化
      23. 网站开发快递文件/百度指数热度榜
      24. 做班级网站的目的/百度关键词优化多少钱一年
      25. 怎么样查中企动力做的网站/专业seo站长工具全面查询网站
      26. 网站托管套餐/admin5站长网