Template Injections

🌐 Vulnerabilidad: Template Injection (Inyección de Plantillas)


🕵️‍♂️ ¿Qué es la inyección de plantillas?

La vulnerabilidad Template Injection ocurre cuando una aplicación permite que un atacante manipule o inyecte código malicioso en un motor de plantillas. Si las entradas del usuario son procesadas sin sanitización adecuada, un atacante puede ejecutar código arbitrario en el servidor o manipular el contenido mostrado al usuario.


⚙️ ¿Cómo se produce?

Los motores de plantillas (como Jinja2 en Python, Twig en PHP, o Freemarker en Java) son herramientas que convierten plantillas en código dinámico. Si una aplicación utiliza entradas de usuario en estas plantillas sin validación, se abre la posibilidad de una inyección de código.

Ejemplo típico:

from flask import render_template_string

template = "Hello {{ user_input }}"
rendered = render_template_string(template, user_input=user_input)

Si user_input proviene de un usuario malintencionado, podría inyectar código como:

{{ 7 * 7 }}

El resultado renderizado sería:

Hello 49

En casos más graves, podrían ejecutarse comandos arbitrarios en el servidor.


🛠️ Mecanismo de ataque

  1. Inyección básica: Manipular variables dentro de la plantilla:

    {{ user_input }}
  2. Acceso a funciones avanzadas: Utilizando métodos internos o atributos peligrosos del motor de plantillas:

    {{ config.items() }}
  3. Ejecución de código: Dependiendo del motor, un atacante puede ejecutar comandos del sistema:

    {{ self._template.globals['os'].system('ls') }}

🎯 Impacto

  • Ejecución remota de código (RCE): Si el motor de plantillas expone funciones como os.system, el atacante puede tomar control total del servidor.

  • Exfiltración de datos sensibles: Acceso a variables del entorno, configuraciones o datos internos.

  • Manipulación de contenido: Cambiar el HTML renderizado para ejecutar ataques XSS.

  • Impacto en la disponibilidad: Ataques de denegación de servicio mediante bucles o cargas pesadas en la plantilla.


📉 Puntaje CVSS v3

  • Vector de ataque: Red (Explotable remotamente)

  • Complejidad del ataque: Media a baja (dependiendo del motor y la configuración)

  • Impacto en confidencialidad: Alto

  • Impacto en integridad: Alto

  • Impacto en disponibilidad: Medio

  • Puntaje CVSS v3: 7.5 - 9.8 (Crítico) 🔥


🧑‍💻 Ejemplo práctico

Código vulnerable en Flask:

from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/greet')
def greet():
    user_input = request.args.get('name')
    template = "Hello, {{ user_input }}"
    return render_template_string(template, user_input=user_input)

Ataque: El atacante envía una solicitud manipulada:

http://victim.com/greet?name={{7*7}}

El servidor devuelve:

Hello, 49

En motores mal configurados, podría inyectar comandos más peligrosos:

http://victim.com/greet?name={{self._template.globals['os'].popen('ls').read()}}

🛡️ ¿Cómo prevenir la inyección de plantillas?

1️⃣ Evitar usar render_template_string

Siempre utiliza plantillas predefinidas en lugar de construirlas dinámicamente.

2️⃣ Sanitizar entradas del usuario

Limpia cualquier entrada del usuario antes de procesarla:

from markupsafe import escape

user_input = escape(user_input)

3️⃣ Deshabilitar funciones peligrosas

Configura el motor de plantillas para restringir funciones que puedan ser explotadas, como os, eval o métodos peligrosos.

Ejemplo en Jinja2:

from jinja2 import Environment

env = Environment()
env.globals.clear()  # Deshabilita funciones globales no necesarias

4️⃣ Usar motores de plantillas seguros

Algunos motores de plantillas, como Mustache o Handlebars, son diseñados para ser lógicos pero no ejecutar código.

5️⃣ Auditoría y pruebas de seguridad

Realiza pruebas de penetración en tu aplicación para identificar puntos vulnerables.

6️⃣ Implementar un WAF

Un firewall de aplicaciones web puede detectar patrones de ataque comunes y bloquearlos.


💡 Dato extra: Las inyecciones de plantillas son especialmente peligrosas en frameworks dinámicos donde las entradas de usuario se procesan directamente, como en aplicaciones Flask, Django o PHP con Twig.

🚨 Nota importante: Si se permite que los usuarios ingresen código malicioso en plantillas, podría comprometerse completamente el sistema, incluso en entornos que inicialmente parecen seguros.

Última actualización

¿Te fue útil?