Saltar al contenido principal

SSTI (Server-Side Template Injection)

La aplicación pasa input del usuario a un motor de templates (Jinja2, Twig, Freemarker, Velocity) sin escape.

Categoría: Web · Vectores avanzados 🎯 Trinchera — La aplicación pasa input del usuario a un motor de templates (Jinja2, Twig, Freemarker, Velocity) sin escape. El input se evalúa como código del template → RCE. 🔗 Kill chain — Detección con ${7*7} o {{7*7}} (devuelve 49). Confirmación con dump del contexto. Escalada a RCE:
  • Jinja2: {{ ''.__class__.__mro__[1].__subclasses__() }} → encuentras subprocess.Popen → RCE.
  • Twig: {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}.
  • Freemarker: <#assign x="freemarker.template.utility.Execute"?new()>${x("id")}.
📡 Huella defensiva — Errores de template engine, syntax errors inusuales, latencia en respuestas a inputs raros. ⚠️ Falso amigo — Confundir SSTI con XSS. SSTI ejecuta server-side (RCE), XSS client-side (JS). 🛡️ Remediación — Sandbox del template engine, evitar render_template_string(user_input), separar templates de datos.
Volver al glosario completo Última actualización: 2026-06-11