Saltar a contenido

Expression Language (EL) Injection

Inyección de Lenguaje de Expresiones (EL)

Descripción

La inyección de lenguaje de expresiones (EL Injection) es una vulnerabilidad crítica que surge del manejo incorrecto de las entradas del usuario dentro de los lenguajes de expresiones comúnmente utilizados en las aplicaciones web. Estos lenguajes sirven para acceder y modificar datos dinámicamente. Los atacantes explotan la inyección de EL inyectando código malicioso en estas expresiones. Esta manipulación no autorizada puede tener consecuencias graves, incluido el acceso no autorizado, violaciones de datos o incluso la ejecución remota de código.

La inyección de EL se manifiesta principalmente dentro de marcos (frameworks) o plantillas que admiten lenguajes de expresiones como JSP (JavaServer Pages), JSF (JavaServer Faces), Apache Struts, Thymeleaf y varios otros empleados comúnmente en el desarrollo de aplicaciones web.

Ejemplo

  @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";
          }
      }

  }

Recomendación

Para proteger la aplicación contra la inyección de lenguaje de expresiones (EL Injection), considere las siguientes recomendaciones:

  • Evitar el uso directo de la entrada del usuario: Siempre que sea posible, evite usar directamente las entradas del usuario en las expresiones EL. En su lugar, prefiera un enfoque de lista blanca donde solo se permita el uso de valores predefinidos y seguros en las expresiones EL.

  • Validación de entrada: Valide y desinfecte (sanitize) las entradas del usuario antes de usarlas en expresiones EL. Implemente una validación estricta para aceptar solo los tipos y patrones de datos esperados.

  • Codificación específica del contexto: Utilice las funciones de codificación proporcionadas por su marco o bibliotecas (por ejemplo, \ en JSP, fn:escapeXml() en JSTL) para garantizar una codificación de salida consciente del contexto. Esto evita la interpretación de las entradas del usuario como código.

Ejemplo

  @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;
      }
  }

Enlaces

Estándares

  • 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