diff --git a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md index 345fec408..246b8d101 100644 --- a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md +++ b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md @@ -6,7 +6,7 @@ As ferramentas [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **e** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) podem ser usadas para **encontrar vulnerabilidades de poluição de protótipo**. -Além disso, você também pode usar a **extensão do navegador** [**PPScan**](https://github.com/msrkp/PPScan) para **automaticamente** **escanear** as **páginas** que você **acessa** em busca de vulnerabilidades de poluição de protótipo. +Além disso, você também pode usar a **extensão do navegador** [**PPScan**](https://github.com/msrkp/PPScan) para **escanear automaticamente** as **páginas** que você **acessa** em busca de vulnerabilidades de poluição de protótipo. ### Depurando onde uma propriedade é usada ```javascript @@ -46,7 +46,7 @@ origValue = val debugAccess(Object.prototype, "ppmap") ``` -4. Navegue de volta para a aba **Sources** e selecione “Resume script execution”. O JavaScript continuará executando, e a propriedade 'ppmap' será poluída como esperado. Utilizar o trecho fornecido facilita a identificação da localização exata onde a propriedade 'ppmap' é poluída. Ao examinar a **Call Stack**, diferentes pilhas onde a poluição ocorreu podem ser observadas. +4. Navegue de volta para a aba **Sources** e selecione “Resume script execution”. O JavaScript continuará executando, e a propriedade 'ppmap' será poluída como esperado. Utilizar o trecho fornecido facilita a identificação do local exato onde a propriedade 'ppmap' é poluída. Ao examinar a **Call Stack**, diferentes pilhas onde a poluição ocorreu podem ser observadas. Ao decidir qual pilha investigar, muitas vezes é útil direcionar-se a pilhas associadas a arquivos de bibliotecas JavaScript, pois a poluição de protótipos frequentemente ocorre dentro dessas bibliotecas. Identifique a pilha relevante examinando sua ligação a arquivos de biblioteca (visível no lado direito, semelhante a uma imagem fornecida como orientação). Em cenários com várias pilhas, como aquelas nas linhas 4 e 6, a escolha lógica é a pilha na linha 4, pois representa a ocorrência inicial da poluição e, portanto, a causa raiz da vulnerabilidade. Clicar na pilha o direcionará para o código vulnerável. @@ -58,7 +58,7 @@ O gadget é o **código que será abusado uma vez que uma vulnerabilidade de PP Se a aplicação for simples, podemos **procurar** por **palavras-chave** como **`srcdoc/innerHTML/iframe/createElement`** e revisar o código-fonte e verificar se ele **leva à execução de javascript**. Às vezes, as técnicas mencionadas podem não encontrar gadgets de forma alguma. Nesse caso, a revisão pura do código-fonte revela alguns bons gadgets, como o exemplo abaixo. -### Exemplo de Encontrando gadget de PP no código da biblioteca Mithil +### Exemplo de Encontrando gadget PP no código da biblioteca Mithil Verifique este writeup: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/) @@ -69,7 +69,7 @@ Verifique este writeup: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-ch ## Bypass de HTML Sanitizers via PP -[**Esta pesquisa**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) mostra gadgets de PP para usar para **burlar as sanitizações** fornecidas por algumas bibliotecas de sanitizadores HTML: +[**Esta pesquisa**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) mostra gadgets de PP para usar para **burlar as sanitizações** fornecidas por algumas bibliotecas de sanitização de HTML: - **sanitize-html** @@ -101,8 +101,73 @@ const node = goog.dom.safeHtmlToNode(sanitized); document.body.append(node); ``` +## Novas Ferramentas & Automação (2023–2025) + +* **Burp Suite DOM Invader (v2023.6)** – PortSwigger adicionou uma aba dedicada de *Prototype-pollution* que automaticamente muta nomes de parâmetros (por exemplo, `__proto__`, `constructor.prototype`) e detecta propriedades poluídas em pontos de sink dentro da extensão do navegador. Quando um gadget é acionado, o DOM Invader mostra a pilha de execução e a linha exata onde a propriedade foi desreferenciada, tornando a busca manual por breakpoints desnecessária. Combine-o com o snippet "Break on property access" já mostrado acima para rapidamente pivotar de *source → sink*. +* **protoStalker** – um plug-in de código aberto do Chrome DevTools (lançado em 2024) que visualiza cadeias de protótipos em tempo real e sinaliza gravações em chaves globalmente perigosas, como `onerror`, `innerHTML`, `srcdoc`, `id`, etc. Útil quando você só tem um bundle de produção e não pode instrumentar a etapa de build. +* **ppfuzz 2.0 (2025)** – a ferramenta agora suporta ES-modules, HTTP/2 e endpoints WebSocket. O novo modo `-A browser` inicia uma instância headless do Chromium e enumera automaticamente classes de gadgets forçando APIs do DOM (veja a seção abaixo). + +--- + +## Pesquisa Recente sobre Gadgets de Prototype-Pollution (2022–2025) + +Em meados de 2023, pesquisadores da PortSwigger publicaram um artigo mostrando que objetos *built-in* do navegador podem ser transformados em gadgets XSS confiáveis uma vez poluídos. Como esses objetos estão presentes em **todas** as páginas, você pode obter execução mesmo que o código da aplicação alvo nunca toque na propriedade poluída. + +Exemplo de gadget (funciona em todos os navegadores evergreen ≥ 2023-04): +```html + +``` +Outros gadgets globais úteis que foram confirmados como funcionais após a poluição (testados em 2024-11): + +| Classe do Gadget | Propriedade Lida | Primitivo alcançado | +|------------------|------------------|---------------------| +| `Notification` | `title` | `alert()` via clique na notificação | +| `Worker` | `name` | Execução de JS em Worker dedicado | +| `Image` | `src` | XSS tradicional `onerror` | +| `URLSearchParams`| `toString` | Redirecionamento aberto baseado em DOM | + +Veja o artigo da PortSwigger para a lista completa de 11 gadgets e uma discussão sobre escapes de sandbox. + +--- + +## CVEs Notáveis de PP do Lado do Cliente (2023-2025) + +* **DOMPurify ≤ 3.0.8 – CVE-2024-45801** Um atacante poderia poluir `Node.prototype.after` antes da inicialização do sanitizador, contornando o perfil *SAFE_FOR_TEMPLATES* e levando a XSS armazenado. O fornecedor corrigiu usando verificações `Object.hasOwn()` e `Object.create(null)` para mapas internos. +* **jQuery 3.6.0-3.6.3 – CVE-2023-26136 / CVE-2023-26140** `extend()` poderia ser usado em objetos manipulados originados de `location.hash`, introduzindo propriedades arbitrárias em `Object.prototype` no contexto de navegação. +* **sanitize-html < 2.8.1 (2023-10) poluição de protótipo** Uma lista de atributos maliciosa como `{"__proto__":{"innerHTML":""}}` contornou a lista de permissão. + +Mesmo que a biblioteca vulnerável viva **apenas no cliente**, o XSS resultante ainda é explorável remotamente através de parâmetros refletidos, manipuladores de postMessage ou dados armazenados renderizados posteriormente. + +--- + +## Medidas Defensivas Modernas + +1. **Congele o protótipo global cedo** (idealmente como o primeiro script): +```javascript +Object.freeze(Object.prototype); +Object.freeze(Array.prototype); +Object.freeze(Map.prototype); +``` +Esteja ciente de que isso pode quebrar polyfills que dependem de extensões tardias. +2. Use `structuredClone()` em vez de `JSON.parse(JSON.stringify(obj))` ou trechos de "deepMerge" da comunidade – ele ignora setters/getters e não percorre a cadeia de protótipos. +3. Quando você realmente precisar de funcionalidade de mesclagem profunda, escolha **lodash ≥ 4.17.22** ou **deepmerge ≥ 5.3.0** que têm saneamento de protótipo embutido. +4. Adicione uma Content-Security-Policy com `script-src 'self'` e um nonce estrito. Embora o CSP não impeça todos os gadgets (por exemplo, manipulação de `location`), ele bloqueia a maioria dos sinks de `innerHTML`. + ## Referências +- [https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746](https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746) +- [https://blog.s1r1us.ninja/research/PP](https://blog.s1r1us.ninja/research/PP) +- [https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:\~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) +- [https://portswigger.net/research/widespread-prototype-pollution-gadgets](https://portswigger.net/research/widespread-prototype-pollution-gadgets) +- [https://snyk.io/blog/dompurify-prototype-pollution-bypass-cve-2024-45801/](https://snyk.io/blog/dompurify-prototype-pollution-bypass-cve-2024-45801/) + - [https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746](https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746) - [https://blog.s1r1us.ninja/research/PP](https://blog.s1r1us.ninja/research/PP) - [https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:\~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/)