Whitepaper que presenta técnicas Error-Based y Boolean Error-Based Blind para SSTI y Code Injection, con payloads universales para seis lenguajes de programación e integración en SSTImap.
[!NOTE] Esta es la segunda versión del documento técnico basado en los resultados que presenté antes de lanzar SSTImap versión 1.3.1. Las mejoras adicionales se adaptarán a este formato como versión 1.2 de la investigación en una fecha posterior.
Algunas categorías de vulnerabilidades pueden, a primera vista, parecer bien conocidas y algo obvias. Podría parecer que todas las técnicas posibles para esas vulnerabilidades son conocidas, por lo que solo se podrían descubrir cargas útiles para casos inusuales. Server-Side Template Injection (SSTI) y Code Injection a menudo se consideran dentro de esas categorías bien conocidas.
A veces, se encuentran técnicas nuevas con nombres autoexplicativos para esas vulnerabilidades. Muchos investigadores podrían considerar esas técnicas como bien conocidas o incluso recordar haberlas utilizado, pero en realidad, la técnica podría existir solo como un nombre comúnmente entendido sin investigación, descripciones o cargas útiles universales. Podría mencionarse un par de veces junto con cargas útiles para casos muy específicos, pero no se probaría y el potencial real de esa técnica podría permanecer sin descubrir durante años.
Esta investigación introduce dos técnicas de este tipo para Code Injection y SSTI: Error-Based y Boolean Error-Based Blind. Proporcionaré cargas útiles para Code Injection y SSTI en seis lenguajes de programación: Python, PHP, Java, Ruby, NodeJS y Elixir. Además, proporcionaré cargas útiles de detección universales, capaces de detectar incluso inyecciones ciegas.
Proporcionaré la cronología completa de mi investigación, desde encontrar las primeras pistas hasta las conclusiones finales. También exploraré el proceso de creación de nuevas cargas útiles para lenguajes de programación y plantillas no mencionados en esta investigación.
En esta investigación mostraré ejemplos de aplicaciones prácticas de las nuevas técnicas y compartiré áreas potenciales de investigación adicional. Todas las cargas útiles proporcionadas pueden utilizarse para detectar y explotar vulnerabilidades en aplicaciones reales. Además, todas las cargas útiles proporcionadas se agregaron a la herramienta de código abierto SSTImap, lo que facilita la aplicación de los resultados de esta investigación a objetivos del mundo real.
Las vulnerabilidades de Server-Side Template Injection aparecen en sitios web dinámicos que utilizan motores de plantillas para el renderizado del lado del servidor, cuando la entrada del usuario no confiable se inserta en la plantilla antes de que sea procesada por el motor de plantillas. Un actor malicioso puede insertar sintaxis de plantilla válida, que será procesada por un motor de plantillas durante el renderizado de la página. Muchos motores de plantillas proporcionan alguna forma de funcionalidad de ejecución de código, lo que a menudo conduce a Remote Code Execution (RCE) en el servidor objetivo. Esta investigación se centra en los motores de plantillas que proporcionan dichas capacidades en caso de explotación.
Las vulnerabilidades SSTI se conocen desde 2015, y desde entonces se han descubierto muchas cargas útiles que permiten la exfiltración de información, elusión de filtros y escape de sandbox. A pesar de eso, la mayoría de las cargas útiles o bien renderizan el resultado directamente en la página o se centran en el hecho de la ejecución del código en sí, descartando los resultados producidos por ese código.

Otra técnica bien conocida de SSTI es la ciega basada en tiempo, que implica agregar un retraso al comando de shell ejecutado. Esta técnica permite determinar el éxito de la ejecución del código inyectado, pero requiere adivinar la carga útil para la ejecución del comando del sistema operativo, lo que dificulta la detección de SSTI ciega en un motor de plantillas desconocido para el investigador.

La clase de vulnerabilidad SSTI y ambas técnicas de explotación conocidas fueron descubiertas en 2015 por James Kettle. Esas técnicas se describen con gran detalle en su investigación “Server-Side Template Injection: RCE For The Modern Web App”. [^1] En diez años desde entonces, no se han documentado nuevas técnicas de explotación. Solo se descubrió una técnica de detección en 2023, que utiliza cargas útiles políglotas para probar múltiples motores de plantillas a la vez. Esta técnica fue descubierta por Maximilian Hildebrand y descrita en su investigación “Improving the Detection and Identification of Template Engines for Large-Scale Template Injection Scanning”. [^2] La técnica se centra en determinar los motores de plantillas utilizando la cantidad mínima de solicitudes, pero solo funciona para contextos de inyección simples.

La mayoría de los motores de plantillas basados en lenguajes de programación interpretados, como PHP, NodeJS y Python, permiten directamente evaluar las expresiones de los lenguajes de programación correspondientes. Esta capacidad nos permite usar cargas útiles para una categoría más amplia de vulnerabilidades de Code Injection, envolviéndolas en el formato correcto de la etiqueta de plantilla.
Code Injection también puede ocurrir sin SSTI, cuando la entrada del usuario no confiable puede llegar a eval() o una función peligrosa similar.
A menudo se considera que la explotación de Code Injection es simplemente programar en el lenguaje correspondiente,
por lo que las técnicas y cargas útiles solo se documentan para ejemplos específicos de vulnerabilidades, que requieren adaptar el código a la aplicación objetivo.