Post

Server-Side Template Injection (SSTI)

Descripción

La inyección de plantilla del lado del servidor (Server-Site Template Injection) ocurre cuando un atacante puede usar la sintaxis de plantilla nativa para inyectar un payload malicioso en una plantilla, que luego se ejecuta en el lado del servidor.

Los motores de plantillas están diseñados para generar páginas web combinando plantillas fijas con datos volátiles. Los ataques de SSTI pueden ocurrir cuando la entrada del usuario se concatena directamente en una plantilla, en lugar de pasarse como datos. Esto permite a los atacantes inyectar directivas de plantilla arbitrarias para manipular el motor de plantillas, lo que a menudo les permite tomar el control total del servidor. Como sugiere el nombre, los payloads de inyección de plantillas del lado del servidor se entregan y evalúan en el lado del servidor, lo que potencialmente las hace mucho más peligrosas que una inyección de plantilla típica del lado del cliente.

Mitigación

La mejor manera de evitar la inyección de plantillas del lado del servidor es no permitir que ningún usuario modifique o envíe nuevas plantillas. Sin embargo, esto a veces es inevitable debido a requisitos comerciales.

Una de las formas más sencillas de evitar la introducción de vulnerabilidades de inyección de plantillas en el lado del servidor es utilizar siempre un motor de plantillas “sin lógica”, como Moustache, a menos que sea absolutamente necesario. Separar la lógica de la presentación tanto como sea posible puede reducir en gran medida su exposición a los ataques basados ​​en plantillas más peligrosos.

Otra medida es ejecutar el código de los usuarios únicamente en un entorno aislado donde los módulos y funciones potencialmente peligrosos se hayan eliminado por completo. Desafortunadamente, proteger el código que no es de confianza es intrínsecamente difícil y propenso a ser omitido.

Finalmente, otro enfoque complementario es aceptar que la ejecución de código arbitrario es casi inevitable y aplicar su propio entorno de pruebas implementando su entorno de plantilla en un contenedor Docker bloqueado, por ejemplo.

PoC

Para este ejemplo, contamos con un sitio web sensillo que posee un input que es reflejado en el sitio, sabemos que está trabajando bajo un framework de python (Flask) en su versión 2.2.2.

Al presionar en Log In, podemos observar que es reflejada la palabra ingresada (Test).

Ahora, intentaremos ingresar una etiqueta propia del framework para ver si esta se nos interpreta desde el input, para esta ocasión utilizaremos el siguiente payload.

Podemos notar que, se está interpretando lo que está dentro de los paréntesis de llaves, por lo que, podemos probar distintos payloads para extraer o ejecturar distintas acciones.

Leer archivo etc/passwd

Podemos utilizar el siguiente payload para leer el archivo /etc/passwd

Ejecución de comandos

En este ejemplo utilizaremos un payload para ejecutar el comando ‘id’.

Podemos observar, que esto nos devuelve el output del comando ‘id’.

Reverse shell con template injection

Ahora utilizaremos el siguiente payload para obtener una reverse shell a nuestra máquina de atacante facilitando la ip del atacante y el puerto que estará a la escucha.

Ponemos el puerto 443 a la escucha utilizando nectat

1
nc -nlvp 443

Ahora inyectamos nuestro payload.

Esto nos ejecutará nuestra reverse shell y obtendremos acceso como usuario root.

This post is licensed under CC BY 4.0 by the author.