跳转至

Expression Language (EL) Injection

表达式语言 (EL) 注入

描述

表达式语言注入 (EL Injection) 是一种严重的漏洞,源于在 Web 应用程序常用的表达式语言中对用户输入处理不当。这些语言用于动态访问和修改数据。攻击者通过将恶意代码注入这些表达式来利用 EL 注入漏洞。这种未经授权的篡改会导致严重的后果,包括未经授权的访问、数据泄露甚至远程代码执行。

EL 注入主要出现在支持表达式语言的框架或模板中,如 JSP (JavaServer Pages)、JSF (JavaServer Faces)、Apache Struts、Thymeleaf 以及 Web 应用程序开发中常用的其他各种框架。

示例

  @RestController
  public class MathExpressionController {

      private final ExpressionParser parser = new SpelExpressionParser();

      @GetMapping("/evaluate")
      public String evaluateExpression(@RequestParam String expression) {
          Expression exp = parser.parseExpression(expression);
          try {
              Object result = exp.getValue();
              return "Result: " + result.toString();
          } catch (Exception e) {
              return "Error: Invalid expression";
          }
      }

  }

建议

为了保护应用程序免受表达式语言注入 (EL Injection) 的影响,请考虑以下建议:

  • 避免直接使用用户输入:尽可能避免在 EL 表达式中直接使用用户输入。相反,最好采用白名单方法,只允许在 EL 表达式中使用预定义的安全值。

  • 输入验证:在将用户输入用于 EL 表达式之前,对其进行验证和清理 (sanitize)。实施严格的验证,以仅接受预期的数据类型和模式。

  • 特定于上下文的编码:使用框架或库提供的编码函数(例如,JSP 中的 \,JSTL 中的 fn:escapeXml()),以确保具有上下文感知的输出编码。这可以防止用户输入被解释为代码。

示例

  @RestController
  public class MathExpressionController {

      private final ExpressionParser parser = new SpelExpressionParser();

      @GetMapping("/evaluate")
      public String evaluateExpression(@RequestParam String expression) {
          String sanitizedExpression = sanitizeInput(expression);
          Expression exp = parser.parseExpression(sanitizedExpression);
          try {
              Object result = exp.getValue();
              return "Result: " + result.toString();
          } catch (Exception e) {
              return "Error: Invalid expression";
          }
      }

      private String sanitizeInput(String input) {
          // Implement your input sanitization logic here
          // For this example, allow only basic arithmetic operations and numbers
          input = input.replaceAll("[^0-9\\+\\-\\*/]", ""); // Allow only digits, +, -, *, /
          return input;
      }
  }

链接

标准

  • CWE_TOP_25:
    • CWE_20
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255