Inyección de Template en el Servidor (SSTI)
Input del usuario pasado directamente a la función de renderizado de un motor de templates, permitiendo a atacantes ejecutar código arbitrario en el servidor inyectando sintaxis de template.
Cómo Funciona
Motores de templates como Handlebars, Nunjucks, Pug y Jinja2 parsean y ejecutan su propia sintaxis. Si pasas input del usuario al string del template mismo (no solo como datos), un atacante puede inyectar expresiones como `{{7*7}}` o `{{config.SECRET_KEY}}`. En algunos motores, esto lleva a Ejecución Remota de Código completa.
// MAL: input del usuario en el string del template
import nunjucks from 'nunjucks';
export async function POST(req: Request) {
const { greeting } = await req.json();
// atacante envía: "Hola {{ process.mainModule.require('child_process').execSync('id') }}"
const html = nunjucks.renderString(`<h1>${greeting}</h1>`, {});
return new Response(html);
}// BIEN: pasa los datos del usuario como contexto, no en el template
import nunjucks from 'nunjucks';
export async function POST(req: Request) {
const { greeting } = await req.json();
// El input del usuario va en el objeto de datos, nunca en el string del template
const html = nunjucks.renderString('<h1>{{ greeting }}</h1>', { greeting });
return new Response(html);
}Ejemplo Real
SSTI fue la causa raíz del hackeo de Uber (2022) via una inyección de template Jinja2 en una herramienta interna. PayPal y otras plataformas importantes han pagado bounties por vulnerabilidades SSTI. Consistentemente lleva a compromiso total del servidor.
Cómo Prevenirlo
- Siempre pasa los datos del usuario como variables de contexto a los templates, nunca los embebas en el string del template
- Usa renderizado de templates con sandbox (modo sandbox de Nunjucks) para restringir lo que pueden hacer las expresiones
- Valida que el input del usuario no contenga caracteres de sintaxis de template ({{ }}, {% %})
- Evita los templates definidos por el usuario por completo — si los necesitas, usa un motor sin lógica como Mustache
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Inyección LDAP
highInput del usuario insertado en filtros de búsqueda LDAP sin escapar, permitiendo a atacantes manipular queries de directorio, bypassear autenticación o extraer datos sensibles del directorio.
XXE — Inyección de Entidad Externa XML
highParsers XML configurados para procesar referencias a entidades externas, permitiendo a atacantes leer archivos arbitrarios del servidor o disparar SSRF con un payload XML malicioso.
Inyección de Header HTTP (Inyección CRLF)
mediumInput controlado por el usuario incluido en headers de respuesta HTTP sin sanitizar, permitiendo a atacantes inyectar headers arbitrarios o dividir la respuesta en dos respuestas HTTP separadas.
Inyección de Header de Email
mediumInput del usuario sin sanitizar usado en los campos To, From, CC o Subject del email, permitiendo a atacantes inyectar destinatarios adicionales y convertir tu servidor de email en un relay de spam.