mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/dom-invader.md'
This commit is contained in:
parent
9515d4f292
commit
bed9bfe241
@ -4,78 +4,125 @@
|
||||
|
||||
## DOM Invader
|
||||
|
||||
DOM Invader é uma ferramenta de navegador instalada no navegador embutido do Burp. Ela ajuda na **detecção de vulnerabilidades DOM XSS** usando várias fontes e sinks, incluindo mensagens da web e poluição de protótipos. A ferramenta vem pré-instalada como uma extensão.
|
||||
DOM Invader é uma ferramenta de navegador instalada no **navegador Chromium embutido do Burp Suite**. Ela ajuda na **detecção de DOM XSS e outras vulnerabilidades do lado do cliente** (poluição de protótipos, DOM clobbering, etc.) ao **instrumentar automaticamente fontes e destinos JavaScript**. A extensão é fornecida com o Burp e só precisa ser ativada.
|
||||
|
||||
DOM Invader integra uma aba dentro do painel DevTools do navegador, permitindo o seguinte:
|
||||
DOM Invader adiciona uma aba ao painel DevTools do navegador que permite que você:
|
||||
|
||||
1. **Identificação de sinks controláveis** em uma página da web para testes de DOM XSS, fornecendo detalhes de contexto e sanitização.
|
||||
2. **Registro, edição e reenvio de mensagens da web** enviadas via o método `postMessage()` para testes de DOM XSS. O DOM Invader também pode detectar automaticamente vulnerabilidades usando mensagens da web especialmente elaboradas.
|
||||
3. Detecção de **fontes de poluição de protótipos do lado do cliente** e varredura de gadgets controláveis enviados para sinks arriscados.
|
||||
4. Identificação de **vulnerabilidades de clobbering DOM**.
|
||||
1. **Identifique destinos controláveis** em tempo real, incluindo contexto (atributo, HTML, URL, JS) e sanitização aplicada.
|
||||
2. **Registre, edite e reenvie mensagens web `postMessage()`**, ou deixe a extensão mutá-las automaticamente.
|
||||
3. **Detecte fontes de poluição de protótipos do lado do cliente e escaneie por cadeias gadget→sink**, gerando PoCs em tempo real.
|
||||
4. **Encontre vetores de DOM clobbering** (por exemplo, colisões de `id` / `name` que sobrescrevem variáveis globais).
|
||||
5. **Ajuste o comportamento** através de uma rica interface de Configurações (canário personalizado, auto-injeção, bloqueio de redirecionamento, listas de fontes/destinos, etc.).
|
||||
|
||||
### Ative-o
|
||||
---
|
||||
|
||||
No navegador embutido do Burp, vá para a **extensão Burp** e ative-a:
|
||||
### 1. Ative-o
|
||||
|
||||
<figure><img src="../../images/image (1129).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Agora, atualize a página e nas **Dev Tools** você encontrará a **aba DOM Invader:**
|
||||
1. Abra **Proxy ➜ Intercept ➜ Open Browser** (navegador embutido do Burp).
|
||||
2. Clique no logo do **Burp Suite** (canto superior direito). Se estiver oculto, clique primeiro na peça de quebra-cabeça.
|
||||
3. Na aba **DOM Invader**, ative **Enable DOM Invader** e pressione **Reload**.
|
||||
4. Abra o DevTools ( `F12` / Clique direito ➜ Inspecionar ) e anexe-o. Um novo painel **DOM Invader** aparece.
|
||||
|
||||
<figure><img src="../../images/image (695).png" alt=""><figcaption></figcaption></figure>
|
||||
> O Burp lembra o estado por perfil. Desative-o em *Settings ➜ Tools ➜ Burp’s browser ➜ Store settings...* se necessário.
|
||||
|
||||
### Injete um Canary
|
||||
### 2. Injetar um Canário
|
||||
|
||||
Na imagem anterior, você pode ver um **grupo aleatório de caracteres, que é o Canary**. Você deve agora começar a **injetá-lo** em diferentes partes da web (parâmetros, formulários, url...) e cada vez que clicar em buscar, o DOM Invader verificará se o **canary terminou em algum sink interessante** que poderia ser explorado.
|
||||
Um **canário** é uma string de marcador aleatório (por exemplo, `xh9XKYlV`) que o DOM Invader rastreia. Você pode:
|
||||
|
||||
Além disso, as opções **Injetar parâmetros de URL** e **Injetar formulários** abrirão automaticamente uma **nova aba** **injetando** o **canary** em cada **parâmetro de URL** e **formulário** que encontrar.
|
||||
* **Copiá-lo** e injetá-lo manualmente em parâmetros, formulários, quadros de Web-Socket, mensagens web, etc.
|
||||
* Usar os botões **Inject URL params / Inject forms** para abrir uma nova aba onde o canário é anexado automaticamente a cada chave/valor de consulta ou campo de formulário.
|
||||
* Procurar por um **canário vazio** para revelar todos os destinos, independentemente da explorabilidade (ótimo para reconhecimento).
|
||||
|
||||
### Injete um Canary vazio
|
||||
#### Canário personalizado (2025+)
|
||||
|
||||
Se você apenas quiser encontrar sinks potenciais que a página possa ter, mesmo que não sejam exploráveis, você pode **procurar por um canary vazio**.
|
||||
O Burp 2024.12 introduziu **Canary settings** (Burp-logo ➜ DOM Invader ➜ Canary). Você pode:
|
||||
|
||||
### Mensagens Post
|
||||
* **Randomizar** ou definir uma **string personalizada** (útil para testes em várias abas ou quando o valor padrão aparece naturalmente na página).
|
||||
* **Copiar** o valor para a área de transferência.
|
||||
* Mudanças requerem **Reload**.
|
||||
|
||||
DOM Invader permite testar para DOM XSS usando mensagens da web com recursos como:
|
||||
---
|
||||
|
||||
1. **Registro de mensagens da web** enviadas via `postMessage()`, semelhante ao registro de histórico de requisições/respostas HTTP do Burp Proxy.
|
||||
2. **Modificação** e **reemissão** de mensagens da web para testar manualmente por DOM XSS, similar à função do Burp Repeater.
|
||||
3. **Alteração automática** e envio de mensagens da web para sondar DOM XSS.
|
||||
### 3. Mensagens web (`postMessage`)
|
||||
|
||||
#### Detalhes da mensagem
|
||||
A sub-aba **Messages** registra cada chamada `window.postMessage()`, mostrando o uso de `origin`, `source` e `data`.
|
||||
|
||||
Informações detalhadas podem ser visualizadas sobre cada mensagem clicando nela, incluindo se o JavaScript do lado do cliente acessa as propriedades `origin`, `data` ou `source` da mensagem.
|
||||
• **Modificar e reenviar**: clique duas vezes em uma mensagem, edite `data` e pressione **Send** (semelhante ao Burp Repeater).
|
||||
|
||||
- **`origin`** : Se a **informação de origem da mensagem não for verificada**, você pode ser capaz de enviar mensagens de origem cruzada para o manipulador de eventos **de um domínio externo arbitrário**. Mas se for verificado, ainda pode ser inseguro.
|
||||
- **`data`**: É aqui que a carga útil é enviada. Se esses dados não forem usados, o sink é inútil.
|
||||
- **`source`**: Avalia se a propriedade source, geralmente referenciando um iframe, é validada em vez da origem. Mesmo que isso seja verificado, não garante que a validação não possa ser contornada.
|
||||
• **Auto-fuzz**: ative **Postmessage interception ➜ Auto-mutate** nas configurações para permitir que o DOM Invader gere cargas úteis baseadas em canário e as reproduza para o manipulador.
|
||||
|
||||
#### Responder a uma mensagem
|
||||
Recapitulando o significado dos campos:
|
||||
|
||||
1. Na visualização **Mensagens**, clique em qualquer mensagem para abrir o diálogo de detalhes da mensagem.
|
||||
2. Edite o campo **Data** conforme necessário.
|
||||
3. Clique em **Enviar**.
|
||||
* **origin** – se o manipulador valida `event.origin`.
|
||||
* **data** – localização da carga útil. Se não utilizada, o destino é irrelevante.
|
||||
* **source** – validação de referência de iframe / janela; muitas vezes mais fraca do que a verificação de origem estrita.
|
||||
|
||||
### Poluição de Protótipos
|
||||
---
|
||||
|
||||
DOM Invader também pode procurar por **vulnerabilidades de Poluição de Protótipos**. Primeiro, você precisa ativá-lo:
|
||||
### 4. Poluição de Protótipos
|
||||
|
||||
<figure><img src="../../images/image (1026).png" alt=""><figcaption></figcaption></figure>
|
||||
Ative em **Settings ➜ Attack types ➜ Prototype pollution**.
|
||||
|
||||
Em seguida, ele **procurará fontes** que permitem adicionar propriedades arbitrárias ao **`Object.prototype`**.
|
||||
Fluxo de trabalho:
|
||||
|
||||
1. **Navegar** – O DOM Invader sinaliza **fontes** de poluição (`__proto__`, `constructor`, `prototype`) encontradas em URL/query/hash ou mensagens web JSON.
|
||||
2. **Testar** – clique em *Test* para abrir uma aba de PoC onde `Object.prototype.testproperty` deve existir:
|
||||
|
||||
Se algo for encontrado, um botão **Testar** aparecerá para **testar a fonte encontrada**. Clique nele, uma nova aba aparecerá, crie um objeto no console e verifique se a `testproperty` existe:
|
||||
```javascript
|
||||
let b = {}
|
||||
b.testproperty
|
||||
let obj = {};
|
||||
console.log(obj.testproperty); // ➜ 'DOM_INVADER_PP_POC'
|
||||
```
|
||||
Uma vez que você encontrou uma fonte, você pode **escanear por um gadget**:
|
||||
3. **Escanear por gadgets** – O DOM Invader força nomes de propriedades e rastreia se algum acaba em destinos perigosos (por exemplo, `innerHTML`).
|
||||
4. **Explorar** – quando uma cadeia gadget-sink é encontrada, um botão *Exploit* aparece que encadeia fonte + gadget + sink para acionar um alerta.
|
||||
|
||||
1. Uma nova aba é aberta pelo DOM Invader quando o botão **Scan for gadgets**, que pode ser encontrado ao lado de qualquer fonte de poluição de protótipo identificada na visualização **DOM**, é clicado. O escaneamento por gadgets adequados então começa.
|
||||
2. Enquanto isso, na mesma aba, a aba **DOM Invader** deve ser aberta no painel DevTools. Após a conclusão do escaneamento, quaisquer sinks acessíveis através dos gadgets identificados são exibidos na visualização **DOM**. Por exemplo, uma propriedade de gadget chamada `html` sendo passada para o sink `innerHTML` é mostrada no exemplo abaixo.
|
||||
Configurações avançadas (ícone de engrenagem):
|
||||
|
||||
## DOM clobbering
|
||||
* **Remover CSP / X-Frame-Options** para manter iframes funcionais durante a varredura de gadgets.
|
||||
* **Escanear técnicas em quadros separados** para evitar interferência de `__proto__` vs `constructor`.
|
||||
* **Desativar técnicas** individualmente para aplicativos frágeis.
|
||||
|
||||
Na imagem anterior, é possível ver que a varredura de DOM clobbering pode ser ativada. Uma vez feito isso, **DOM Invader começará a procurar por vulnerabilidades de DOM clobbering**.
|
||||
---
|
||||
|
||||
### 5. DOM Clobbering
|
||||
|
||||
Ative **Attack types ➜ DOM clobbering**. O DOM Invader monitora elementos criados dinamicamente cujos atributos `id`/`name` colidem com variáveis globais ou objetos de formulário (`<input name="location">` → clobbers `window.location`). Uma entrada é produzida sempre que a marcação controlada pelo usuário leva à substituição de variáveis.
|
||||
|
||||
---
|
||||
|
||||
## 6. Visão Geral das Configurações (2025)
|
||||
|
||||
O DOM Invader agora está dividido em categorias **Main / Attack Types / Misc / Canary**.
|
||||
|
||||
1. **Main**
|
||||
* **Enable DOM Invader** – interruptor global.
|
||||
* **Postmessage interception** – ativar/desativar registro de mensagens; sub-toggles para auto-mutação.
|
||||
* **Custom Sources/Sinks** – *ícone de engrenagem* ➜ ativar/desativar destinos específicos (por exemplo, `eval`, `setAttribute`) que podem quebrar o aplicativo.
|
||||
|
||||
2. **Attack Types**
|
||||
* **Prototype pollution** (com configurações por técnica).
|
||||
* **DOM clobbering**.
|
||||
|
||||
3. **Misc**
|
||||
* **Redirect prevention** – bloquear redirecionamentos do lado do cliente para que a lista de destinos não seja perdida.
|
||||
* **Breakpoint before redirect** – pausar o JS logo antes do redirecionamento para inspeção da pilha de chamadas.
|
||||
* **Inject canary into all sources** – auto-injetar canário em todos os lugares; lista de permissões de fonte/parâmetro configurável.
|
||||
|
||||
4. **Canary**
|
||||
* Visualizar / randomizar / definir canário personalizado; copiar para a área de transferência. Mudanças requerem recarregamento do navegador.
|
||||
|
||||
---
|
||||
|
||||
### 7. Dicas e Boas Práticas
|
||||
|
||||
* **Use canário distinto** – evite strings comuns como `test`, caso contrário, ocorrem falsos positivos.
|
||||
* **Desative destinos pesados** (`eval`, `innerHTML`) temporariamente se quebrarem a funcionalidade da página durante a navegação.
|
||||
* **Combine com Burp Repeater & Proxy** – replique a solicitação/resposta do navegador que produziu um estado vulnerável e crie URLs de exploração finais.
|
||||
* **Lembre-se do escopo do quadro** – fontes/destinos são exibidos por contexto de navegação; vulnerabilidades dentro de iframes podem precisar de foco manual.
|
||||
* **Exporte evidências** – clique com o botão direito no painel DOM Invader ➜ *Save screenshot* para incluir em relatórios.
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
@ -85,5 +132,7 @@ Na imagem anterior, é possível ver que a varredura de DOM clobbering pode ser
|
||||
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/web-messages](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/web-messages)
|
||||
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution)
|
||||
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/dom-clobbering](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/dom-clobbering)
|
||||
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/canary](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/canary)
|
||||
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/misc](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/misc)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user