Nuevos labs cada semana — Accede a todos desde 7,99€/mes

Labs de SSTI

Server-Side Template Injection (SSTI)

¿Qué es SSTI?

La SSTI ocurre cuando entrada del usuario se concatena en un template renderizado server-side (Jinja2, Twig, FreeMarker, Velocity, Handlebars). Casi siempre escala a RCE porque los engines de template tienen acceso al runtime del lenguaje host.

¿Por qué practicar SSTI?

SSTI es de las vulnerabilidades de mayor impacto: detección rápida con `{{7*7}}` o `${7*7}`, escalada casi garantizada a RCE. Aparece en emails templated, error pages personalizadas y CMS configurables. Bounties P1 frecuentes en programs maduros.

¿Qué aprenderás con los labs de SSTI?

Aprenderás el flow de detección (basic + polyglot payloads), identificación del engine (Jinja2 vs Twig vs FreeMarker tienen syntaxis distinta), escalada a RCE específica por engine (`__class__.__mro__` en Python, `Runtime.getRuntime()` en Java), y bypass de sandboxes débiles.

Tipos de SSTI que cubrimos

  • Jinja2 / Flask

    {{7*7}} → 49. Escalada con {{config.__class__.__init__.__globals__[...]}} → os.system.

  • Twig / Symfony

    {{7*7}} → 49. Escalada con {{_self.env.registerUndefinedFilterCallback('exec')}}.

  • FreeMarker / Velocity

    Java-based. ${7*7} o ${'a'?upper_case}. RCE via freemarker.template.utility.Execute.

  • Handlebars / Node

    Más restrictivo, pero escalable con prototype pollution o helpers expuestos.

¿Cómo encontrar y explotar SSTI?

Playbook práctico — del recon a la prueba de concepto.

  1. 1

    Detectar la inyección

    Mete una expresión matemática en sintaxis de varios engines. Si la respuesta devuelve el resultado evaluado (no el literal), hay SSTI.

    {{7*7}} → 49   ·   ${7*7} → 49   ·   #{7*7}   ·   <%= 7*7 %>
  2. 2

    Distinguir SSTI de XSS

    Usa un polyglot que rompa en cualquier contexto y observa qué se evalúa server-side frente a lo que solo se refleja.

    ${{<%[%'"}}%\
  3. 3

    Identificar el engine

    Cada motor responde distinto a payloads específicos. Esto define la cadena de escalada a RCE.

    {{7*'7'}} → 7777777 (Jinja2) | 49 (Twig)
  4. 4

    Escalar a RCE en Jinja2

    Recorre la jerarquía de objetos Python hasta os para ejecutar comandos. El gadget cycler/lipsum es de los más fiables.

    {{cycler.__init__.__globals__.os.popen('id').read()}}
  5. 5

    Escalar a RCE en otros engines

    En Twig usa el callback de filtros; en FreeMarker la utilidad Execute. Adapta el payload al motor detectado.

    Twig: {{['id']|filter('system')}}   ·   FreeMarker: ${"freemarker.template.utility.Execute"?new()("id")}

Preguntas frecuentes

¿Qué es una SSTI?

Server-Side Template Injection ocurre cuando input del usuario se inserta en una plantilla que se renderiza en el servidor (Jinja2, Twig, FreeMarker). El motor evalúa el payload como código, lo que casi siempre permite escalar a ejecución remota de comandos.

¿Cómo se explota una SSTI?

Primero se detecta con expresiones como {{7*7}} que devuelven 49. Luego se identifica el motor y se usa su cadena específica para acceder al runtime: en Jinja2 se navega __class__/__globals__ hasta os.popen para ejecutar comandos.

¿Cómo encontrar SSTI en bug bounty?

Prueba payloads de plantilla en cualquier campo que acabe renderizado: nombres de perfil, asuntos de email, plantillas de factura, error pages personalizables y CMS. Si {{7*7}} o ${7*7} devuelve 49, tienes SSTI.

¿Cómo prevenir la SSTI?

Nunca construyas plantillas concatenando input del usuario; pasa los datos como variables de contexto, usa motores con sandbox y logic-less (como Mustache) para contenido de usuario y restringe los objetos/atributos accesibles desde el template.

¿Diferencia entre SSTI y XSS?

La SSTI se evalúa en el servidor y suele acabar en RCE; el XSS se ejecuta en el navegador de la víctima. Un mismo input reflejado puede ser solo XSS (si solo lo interpreta el browser) o SSTI (si el motor de plantillas lo evalúa antes): {{7*7}}=49 lo confirma.

Empieza con labs de SSTI

Practica Server-Side Template Injection (SSTI) con labs basados en reportes reales. En español. Desde 7,99€/mes.

Empieza con el primer lab de SSTI