criticalCWE-94A03:2021

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.

Código Vulnerable
// 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);
}
Código Seguro
// 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

nodejsPythonPHPJava

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas