Parte: 4 — Seguridad de aplicaciones web · Fuente: Real-World Bug Hunting (Yaworski) / PortSwigger Research ⏱️ Duración estimada: 110 min · Nivel: Experto
Explotar la inyección de plantillas del lado servidor (SSTI): cuando el input del usuario se evalúa como parte de una plantilla (Jinja2, Twig, Freemarker, etc.), permitiendo desde filtración de datos hasta RCE. Es un fallo potente que aparece en emails personalizados, generación de documentos y paneles configurables.
⚠️ Ética: puede derivar en RCE. Solo en labs propios/autorizados (PortSwigger). Nunca en sistemas ajenos.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Motores de plantillas | Contexto del fallo |
| 2 | Detección ({{7*7}}) |
Confirmar la inyección |
| 3 | Fingerprinting del motor | El exploit depende del motor |
| 4 | De expresión a RCE | Escalada de impacto |
| 5 | Jinja2 / Twig / Freemarker | Payloads concretos |
| 6 | SSTI vs. XSS | No confundir el sink |
| 7 | Defensa: sandbox, logic-less | Cierre del fallo |
{{7*7}}) que revela evaluación. Característica: si devuelve 49, hay SSTI.git clone https://github.com/epinna/tplmap && cd tplmap && pip install -r requirements.txt
⚠️ Solo en labs propios.
{{7*7}} y ${7*7} en campos que se reflejan (nombre, plantilla de email).49, confirma SSTI e identifica el motor con payloads diferenciadores.{{ config.items() }}
{{ ''.__class__.__mro__[1].__subclasses__() }}
{{7*7}} en SSTI de un simple reflejo de texto.__class__ → __mro__ → __subclasses__ en Python.{{7*7}}, distinto sink.Resuelve un lab de SSTI de PortSwigger que exija fingerprint + RCE y ejecuta un comando (p. ej. leer un archivo del sistema). Criterio de aceptación: el lab queda resuelto, documentas el motor identificado, la cadena de payloads y la defensa (sandbox, separar datos de plantilla, motor logic-less).
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
{{7*7}} sale literal |
No hay SSTI ahí; puede ser XSS o texto plano |
49 pero sin RCE |
Motor con sandbox; busca bypass conocido |
| Payload de otro motor falla | Fingerprint incorrecto; ajusta el motor |
| tplmap no detecta | Contexto peculiar; prueba manual |
| RCE ciega | Usa OOB para confirmar |
❓ ¿SSTI siempre es RCE? No siempre; depende del motor y su sandbox. A veces solo permite leer datos, pero muchos motores llegan a RCE.
❓ ¿Cómo distingo SSTI de XSS?
{{7*7}} que devuelve 49 indica evaluación en servidor (SSTI); si aparece literal y ejecuta JS, es XSS en cliente.
❓ ¿El sandbox me protege? Ayuda, pero muchos sandboxes de plantillas han sido evadidos. La defensa robusta es no meter input del usuario en la plantilla.
Clase 106 — Deserialización insegura