La inyección de código es una vulnerabilidad crítica que permite a un tercero ejecutar código en el software del lado del servidor. La inyección de lenguaje de expresión es un tipo de ejecución remota de código que divulga datos confidenciales del servidor. El código remoto ejecuta y muestra variables, contraseñas, funciones o códigos. En el peor de los casos, puede darle a un atacante control remoto del servidor.
¿Qué es la inyección de lenguaje de expresión?
La inyección de lenguaje de expresión es una vulnerabilidad que afecta a las páginas de JavaServer (JSP), las páginas de servidor activo (ASP) y otros lenguajes de expresión alojados en un servidor web. Estos idiomas son idiomas interpretados, por lo que cualquier código enviado al servidor se compila durante el tiempo de ejecución de la aplicación, en lugar de los idiomas compilados estándar con archivos ejecutables binarios. En un idioma interpretado, el código se compila en el servidor cuando un usuario solicita una página.
Cuando una aplicación de lenguaje de expresión (EL) es vulnerable a la inyección de lenguaje de expresión, un atacante envía un código creado a la aplicación como entrada, ya sea en la cadena de consulta o en un objeto de forma. El código se compila en tiempo de ejecución y luego puede mostrar variables, contraseñas y otra información confidencial. Las vulnerabilidades de EL son comunes en versiones desactualizadas de lenguajes interpretados, por lo que las aplicaciones heredadas deben probarse antes de implementarlas en la producción. Después de un evento crítico, las organizaciones necesitan planes de recuperación ante desastres para remediar la divulgación de datos y los exploits.
Cómo funciona la inyección de lenguaje de expresión
Cualquier aplicación que ejecute un idioma interpretado debe eliminar el código y los caracteres especiales de la entrada. Sin restregar la entrada, la aplicación aceptará el código y lo ejecutará en el servidor. La mayoría de las vulnerabilidades de inyección de EL involucran JSP, por lo que usaremos el código JSP en el siguiente ejemplo. El siguiente fragmento es un ejemplo de una única línea de código vulnerable a la inyección EL:
<spring:message code="${param['message']}" text=""/>
En este ejemplo, el atributo de código toma un parámetro que contiene una cadena. Si un atacante inyecta código en el parámetro, se compilará y ejecutará en el servidor. Los usuarios no ven este código en su página web local, por lo que los atacantes usan guiones comunes para encontrar vulnerabilidades de inyección de EL.
Vulnerabilidades comunes que llevan a la inyección del lenguaje de expresión
De manera similar a cualquier vulnerabilidad a la inyección, la vulnerabilidad a la inyección de EL surge de la falta de validación de la entrada en la aplicación del servidor. Usando el mismo ejemplo anterior, la cadena de mensajes podría ser una cadena inocente de caracteres, pero también podría ser un código. En lugar de enviar una cadena inocente, supongamos que el usuario envió lo siguiente:
${"aaaa".toString().concat(T(java.lang.Runtime).getRuntime().exec('ls -l'))}
La entrada anterior intenta ejecutar el comando del sistema “ls -l” en el servidor. Este comando enumera los archivos y directorios en el directorio actual. Con una lista de archivos, un atacante podría intentar enviar otro comando para abrir y mostrar el contenido de un archivo en su ventana. Un archivo podría contener datos confidenciales, como contraseñas. Desde allí, el atacante podría acceder al servidor y realizar acciones maliciosas adicionales.
Detección de la inyección del lenguaje de expresión
Las pruebas de penetración, tanto de caja blanca como de caja negra, detectarán vulnerabilidades de la inyección de EL. La prueba de caja blanca es un método en el que los profesionales de seguridad revisan el código para detectar vulnerabilidades. Las empresas suministran el código a los revisores de seguridad, y los revisores identifican todas las vulnerabilidades del código en un informe. Es un enfoque proactivo común para la protección de datos.
Las pruebas de penetración de caja negra utilizan la misma forma de análisis y detección de vulnerabilidades que un atacante. Los profesionales de seguridad atacan la aplicación sin conocer el código, por lo que se puede probar cualquier validación o defensa. Las pruebas de caja gris son una combinación de pruebas de caja negra y caja blanca, y a menudo son un método elegido para las aplicaciones web de pruebas de penetración.
Prevención de la inyección del lenguaje de expresión
La mejor manera de detectar ataques de inyección EL es validar el código y eliminar la entrada con caracteres específicos. Por ejemplo, la entrada para un campo de nombre no debe contener caracteres “<” or “>”. Los desarrolladores deben usar bibliotecas creadas para detectar estos caracteres y eliminarlos o soltar la entrada y mostrar un error al usuario.
Otros caracteres también pueden ser maliciosos. En una página de JSP, los fragmentos de código comienzan con los caracteres “<%” characters and end with the “%>”. Estos caracteres juntos deben eliminarse de la entrada. Los atacantes realizarán numerosas combinaciones de código malicioso para evitar la detección, por lo que la mejor manera de detectarlo es usar una biblioteca diseñada para la validación de entradas. Las aplicaciones SIEM también pueden detectar exploits y proporcionar análisis si su aplicación es un objetivo.
Conclusiones
Las vulnerabilidades de las inyecciones de EL deben tratarse como problemas de seguridad críticos. Siempre pruebe sus aplicaciones de lenguaje interpretado para detectar vulnerabilidades de inyección y cualquier otra que pueda divulgar datos confidenciales. Los desarrolladores deben usar herramientas de validación para detectar y detener la inyección de EL, y las aplicaciones heredadas que usan JSP y ASP deben ser monitoreadas de cerca para detectar ataques.
Pure Storage cuenta con la infraestructura de seguridad y el monitoreo de amenazas para proteger sus aplicaciones de los ataques de seguridad.