<summary><strong>Aprende hacking en AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
[**RootedCON**](https://www.rootedcon.com) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro efervescente para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
Una inyección de plantillas en el servidor ocurre cuando un atacante es capaz de utilizar la sintaxis nativa de la plantilla para inyectar una carga maliciosa en una plantilla, que luego se ejecuta en el servidor.
Los **motores de plantillas** están diseñados para **generar páginas web****combinando** plantillas **fijas** con datos **volátiles**. Los ataques de inyección de plantillas en el servidor pueden ocurrir cuando la **entrada de usuario** se concatena directamente **en una plantilla**, en lugar de pasarla como datos. Esto permite a los atacantes **inyectar directivas de plantilla arbitrarias** para manipular el motor de plantillas, lo que a menudo les permite tomar el **control completo del servidor**.
En el ejemplo anterior, **parte de la plantilla** se está **generando dinámicamente** utilizando el parámetro `GET``name`. Como la sintaxis de la plantilla se evalúa en el lado del servidor, esto potencialmente permite a un atacante colocar un payload de inyección de plantilla del lado del servidor dentro del parámetro `name` de la siguiente manera:
Como con cualquier vulnerabilidad, el primer paso hacia su explotación es poder encontrarla. Quizás el enfoque inicial más simple es intentar **fuzzear la plantilla** inyectando una secuencia de caracteres especiales comúnmente utilizados en expresiones de plantillas, como el polígloto **`${{<%[%'"}}%\`.**\
Para comprobar si el servidor es vulnerable, debes **observar las diferencias** entre la respuesta con **datos regulares** en el parámetro y el **payload proporcionado**.\
Si se **produce un error**, será bastante fácil determinar que **el servidor es vulnerable** e incluso qué **motor se está ejecutando**. Pero también podrías encontrar un servidor vulnerable si **esperabas** que **reflejara** el payload proporcionado y **no se está reflejando**, o si hay algunos **caracteres faltantes** en la respuesta.
La entrada proporcionada se está **renderizando y reflejando** en la respuesta. Esto se confunde fácilmente con una vulnerabilidad de [**XSS**](../xss-cross-site-scripting/) simple, pero es fácil diferenciar si intentas establecer **operaciones matemáticas** dentro de una expresión de plantilla:
Si **cambias** el parámetro **`greeting`** por un **valor diferente** la **respuesta no contendrá el nombre de usuario**, pero si accedes a algo como: `http://vulnerable-website.com/?greeting=data.username}}hello` entonces, **la respuesta contendrá el nombre de usuario** (si los caracteres de cierre de la expresión de la plantilla eran **`}}`**).\
Aunque hay un gran número de lenguajes de plantillas, muchos de ellos utilizan una sintaxis muy similar que se elige específicamente para no entrar en conflicto con los caracteres HTML.
Si tienes suerte, el servidor estará **imprimiendo los errores** y podrás encontrar el **motor** utilizado **dentro** de los errores. Algunas posibles cargas útiles que pueden causar errores:
De lo contrario, tendrás que **probar manualmente diferentes cargas útiles específicas del lenguaje** y estudiar cómo son interpretadas por el motor de plantillas. Una forma común de hacer esto es inyectar operaciones matemáticas arbitrarias utilizando la sintaxis de diferentes motores de plantillas. Luego puedes observar si se evalúan con éxito. Para ayudar con este proceso, puedes usar un árbol de decisión similar al siguiente:
El primer paso después de encontrar la inyección de plantillas e identificar el motor de plantillas es leer la documentación. Las áreas clave de interés son:
* Secciones 'Para Autores de Plantillas' que cubren la sintaxis básica.
* 'Consideraciones de Seguridad' - es probable que quien desarrolló la aplicación que estás probando no haya leído esto, y puede contener algunas pistas útiles.
* Listas de métodos, funciones, filtros y variables integrados.
* Listas de extensiones/plugins - algunos pueden estar habilitados por defecto.
Suponiendo que no se hayan presentado exploits, el siguiente paso es **explorar el entorno** para averiguar exactamente a qué **tienes acceso**. Puedes esperar encontrar tanto **objetos predeterminados** proporcionados por el motor de plantillas, como **objetos específicos de la aplicación** pasados a la plantilla por el desarrollador. Muchos sistemas de plantillas exponen un objeto 'self' o de espacio de nombres que contiene todo lo que está en el ámbito, y una forma idiomática de listar los atributos y métodos de un objeto.
Si no hay un objeto self integrado, tendrás que forzar nombres de variables usando [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) y la colección de listas de palabras de Burp Intruder.
Los objetos suministrados por el desarrollador son particularmente propensos a contener información sensible y pueden variar entre diferentes plantillas dentro de una aplicación, por lo que este proceso idealmente debería aplicarse a cada plantilla distinta individualmente.
En este punto deberías tener una **idea firme de la superficie de ataque disponible** para ti y poder proceder con técnicas tradicionales de auditoría de seguridad, revisando cada función en busca de vulnerabilidades explotables. Es importante abordar esto en el contexto de la aplicación más amplia - algunas funciones se pueden utilizar para explotar características específicas de la aplicación. Los ejemplos a seguir utilizarán la inyección de plantillas para desencadenar la creación de objetos arbitrarios, lectura/escritura de archivos arbitrarios, inclusión de archivos remotos, divulgación de información y vulnerabilidades de escalada de privilegios.
### [Tabla de Inyección de Plantillas](https://github.com/Hackmanit/template-injection-table)
una tabla interactiva que contiene los políglotos de inyección de plantillas más eficientes junto con las respuestas esperadas de los 44 motores de plantillas más importantes.
* En la sección FreeMarker de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* En la sección de Velocity de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
La expresión de prueba típica para SSTI es `${7*7}`. Esta expresión también funciona en Thymeleaf. Si deseas lograr ejecución remota de código, puedes usar una de las siguientes expresiones de prueba:
Sin embargo, como mencionamos antes, las expresiones solo funcionan en atributos especiales de Thymeleaf. Si es necesario usar una expresión en una ubicación diferente en la plantilla, Thymeleaf admite _inclusión de expresiones_. Para usar esta característica, debes colocar una expresión dentro de `[[...]]` o `[(...)]` (elige uno u otro dependiendo de si necesitas escapar símbolos especiales). Por lo tanto, una carga útil de detección de SSTI simple para Thymeleaf sería `[[${7*7}]]`.
Sin embargo, las posibilidades de que la carga útil de detección anterior funcione son muy bajas. Las vulnerabilidades de SSTI suelen ocurrir cuando una plantilla se genera dinámicamente en el código. Thymeleaf, por defecto, no permite tales plantillas generadas dinámicamente y todas las plantillas deben crearse con anterioridad. Por lo tanto, si un desarrollador quiere crear una plantilla a partir de una cadena _al vuelo_, necesitaría crear su propio TemplateResolver. Esto es posible pero ocurre muy raramente.
Si profundizamos en la documentación del motor de plantillas de Thymeleaf, encontraremos una característica interesante llamada _**preprocesamiento de expresiones**_. Las expresiones colocadas entre dobles guiones bajos (`__...__`) se preprocesan y el resultado del preprocesamiento se utiliza como parte de la expresión durante el procesamiento regular. Aquí hay un ejemplo oficial de la documentación de Thymeleaf:
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
Jinjava es un proyecto de código abierto desarrollado por Hubspot, disponible en [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
{% endraw %}
{{ji.render('{{1*2}}')}}
//Here, I created a variable 'ji' with new instance of com.hubspot.jinjava.Jinjava class and obtained reference to the newInterpreter method. In the next block, I called the render method on 'ji' with expression {{1*2}}.
EL proporciona un mecanismo importante para permitir que la capa de presentación (páginas web) se comunique con la lógica de la aplicación (beans gestionados). EL es utilizado por **varias tecnologías JavaEE**, como la tecnología JavaServer Faces, la tecnología JavaServer Pages (JSP) y Contexts and Dependency Injection para Java EE (CDI).\
Consulta la siguiente página para aprender más sobre la **explotación de intérpretes EL**:
Este bypass del Security Manager fue tomado de este [**informe**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
[**RootedCON**](https://www.rootedcon.com/) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro efervescente para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
* En la sección Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* En la sección de Twig y Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* En la sección de Jade de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
> [patTemplate](https://github.com/wernerwa/pat-template) es un motor de plantillas PHP que no compila, utiliza etiquetas XML para dividir un documento en diferentes partes
> Jinja2 es un motor de plantillas completo para Python. Cuenta con soporte completo para unicode, un entorno de ejecución opcional integrado y protegido, es ampliamente utilizado y tiene licencia BSD.
El método `System.Diagnostics.Process.Start` de .NET se puede utilizar para iniciar cualquier proceso en el servidor y así crear una webshell. Puedes encontrar un ejemplo de aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
* Si los datos pasados son un objeto que contiene el atributo Password, por ejemplo, el payload anterior lo revelaría, pero también podrías hacer: `{{ .Password }}`
*`{{html "ssti"}}`, `{{js "ssti"}}` = Estos son algunos otros payloads que deberían mostrar la cadena "ssti" sin las palabras finales "js" o "html". Puedes consultar más palabras clave en el motor [aquí](https://golang.org/pkg/text/template).
Si el servidor **está utilizando el paquete text/template**, XSS es muy fácil de lograr **simplemente** proporcionando tu **payload** como entrada. Sin embargo, eso **no es el caso con html/template** ya que codifica la respuesta en HTML: `{{"<script>alert(1)</script>"}}` --> `<script>alert(1)</script>`
La documentación para el módulo html/template se puede encontrar [aquí](https://golang.org/pkg/html/template/), y la documentación para el módulo text/template se puede encontrar [aquí](https://golang.org/pkg/text/template/), y sí, varían mucho. Por ejemplo, en **text/template**, puedes **llamar directamente a cualquier función pública con el valor “call”**, sin embargo, esto no es posible con html/template.
Si quieres encontrar un RCE en Go a través de SSTI, debes saber que, así como puedes acceder al objeto dado a la plantilla con `{{ . }}`, también puedes **llamar a los métodos del objeto**. Así que, imagina que el **objeto pasado tiene un método llamado System** que ejecuta el comando dado, podrías abusar de él con: `{{ .System "ls" }}`\
Revisa el resto de [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) para más exploits. También puedes encontrar información interesante sobre etiquetas en [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
[**RootedCON**](https://www.rootedcon.com/) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro efervescente para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.