mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p
This commit is contained in:
parent
0ed01dd26b
commit
f4e71f8317
@ -26,7 +26,7 @@ Una volta identificata una vulnerabilità di prototype pollution da uno degli st
|
||||
Per codebase più grandi e complesse, un metodo semplice per scoprire il codice vulnerabile prevede i seguenti passaggi:
|
||||
|
||||
1. Usa uno strumento per identificare una vulnerabilità e ottenere un payload progettato per impostare una proprietà nel costruttore. Un esempio fornito da ppmap potrebbe apparire così: `constructor[prototype][ppmap]=reserved`.
|
||||
2. Imposta un breakpoint sulla prima riga di codice JavaScript che verrà eseguita sulla pagina. Aggiorna la pagina con il payload, mettendo in pausa l'esecuzione a questo breakpoint.
|
||||
2. Imposta un punto di interruzione sulla prima riga di codice JavaScript che verrà eseguita nella pagina. Aggiorna la pagina con il payload, mettendo in pausa l'esecuzione a questo punto di interruzione.
|
||||
3. Mentre l'esecuzione di JavaScript è in pausa, esegui il seguente script nella console JS. Questo script segnalerà quando la proprietà 'ppmap' viene creata, aiutando a localizzarne l'origine:
|
||||
```javascript
|
||||
function debugAccess(obj, prop, debugGet = true) {
|
||||
@ -46,9 +46,9 @@ origValue = val
|
||||
|
||||
debugAccess(Object.prototype, "ppmap")
|
||||
```
|
||||
4. Torna alla scheda **Sources** e seleziona “Resume script execution”. Il JavaScript continuerà a essere eseguito e la proprietà 'ppmap' sarà inquinata come previsto. Utilizzando il frammento fornito, è possibile identificare il luogo esatto in cui la proprietà 'ppmap' è inquinata. Esaminando lo **Call Stack**, è possibile osservare diversi stack in cui si è verificato l'inquinamento.
|
||||
4. Torna alla scheda **Sources** e seleziona “Resume script execution”. Il JavaScript continuerà a essere eseguito e la proprietà 'ppmap' sarà inquinata come previsto. Utilizzando il frammento fornito, è possibile identificare l'esatta posizione in cui la proprietà 'ppmap' è inquinata. Esaminando lo **Call Stack**, è possibile osservare diversi stack in cui si è verificato l'inquinamento.
|
||||
|
||||
Quando si decide quale stack investigare, è spesso utile mirare agli stack associati ai file delle librerie JavaScript, poiché l'inquinamento del prototipo si verifica frequentemente all'interno di queste librerie. Identifica lo stack pertinente esaminando il suo attacco ai file delle librerie (visibile sul lato destro, simile a un'immagine fornita come guida). In scenari con più stack, come quelli alle righe 4 e 6, la scelta logica è lo stack alla riga 4, poiché rappresenta la prima occorrenza di inquinamento e quindi la causa principale della vulnerabilità. Cliccando sullo stack verrai indirizzato al codice vulnerabile.
|
||||
Quando si decide quale stack investigare, è spesso utile mirare agli stack associati a file di librerie JavaScript, poiché l'inquinamento del prototipo si verifica frequentemente all'interno di queste librerie. Identifica lo stack rilevante esaminando il suo attacco a file di librerie (visibile sul lato destro, simile a un'immagine fornita come guida). In scenari con più stack, come quelli alle righe 4 e 6, la scelta logica è lo stack alla riga 4, poiché rappresenta la prima occorrenza di inquinamento e quindi la causa principale della vulnerabilità. Cliccando sullo stack verrai indirizzato al codice vulnerabile.
|
||||
|
||||

|
||||
|
||||
@ -67,9 +67,9 @@ Controlla questo writeup: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-
|
||||
- [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
|
||||
- [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
|
||||
|
||||
## Bypass dei Sanitizzatori HTML tramite PP
|
||||
## Bypass degli HTML Sanitizers tramite PP
|
||||
|
||||
[**Questa ricerca**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) mostra gadget PP da utilizzare per **bypassare le sanificazioni** fornite da alcune librerie di sanitizzatori HTML:
|
||||
[**Questa ricerca**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) mostra gadget PP da utilizzare per **bypassare le sanificazioni** fornite da alcune librerie di sanitizzazione HTML:
|
||||
|
||||
- **sanitize-html**
|
||||
|
||||
@ -101,8 +101,73 @@ const node = goog.dom.safeHtmlToNode(sanitized);
|
||||
document.body.append(node);
|
||||
</script>
|
||||
```
|
||||
## Nuovi Strumenti & Automazione (2023–2025)
|
||||
|
||||
* **Burp Suite DOM Invader (v2023.6)** – PortSwigger ha aggiunto una scheda dedicata a *Prototype-pollution* che muta automaticamente i nomi dei parametri (ad es. `__proto__`, `constructor.prototype`) e rileva le proprietà inquinate nei punti di sink all'interno dell'estensione del browser. Quando un gadget viene attivato, DOM Invader mostra lo stack di esecuzione e la riga esatta in cui la proprietà è stata dereferenziata, rendendo superflua la ricerca manuale dei breakpoint. Combinalo con il frammento "Break on property access" già mostrato sopra per passare rapidamente da *source → sink*.
|
||||
* **protoStalker** – un plug-in open-source per Chrome DevTools (rilasciato nel 2024) che visualizza le catene di prototipi in tempo reale e segnala le scritture su chiavi globalmente pericolose come `onerror`, `innerHTML`, `srcdoc`, `id`, ecc. Utile quando hai solo un bundle di produzione e non puoi strumentare il passaggio di build.
|
||||
* **ppfuzz 2.0 (2025)** – lo strumento ora supporta ES-modules, HTTP/2 e endpoint WebSocket. La nuova modalità `-A browser` avvia un'istanza headless di Chromium e enumera automaticamente le classi di gadget forzando le API DOM (vedi sezione sottostante).
|
||||
|
||||
---
|
||||
|
||||
## Recenti Ricerche sui Gadget di Prototype-Pollution (2022–2025)
|
||||
|
||||
A metà del 2023 i ricercatori di PortSwigger hanno pubblicato un documento che mostra che gli oggetti *browser-built-in* possono essere trasformati in gadget XSS affidabili una volta inquinati. Poiché questi oggetti sono presenti su **ogni** pagina, puoi ottenere l'esecuzione anche se il codice dell'applicazione target non tocca mai la proprietà inquinata.
|
||||
|
||||
Esempio di gadget (funziona in tutti i browser evergreen ≥ 2023-04):
|
||||
```html
|
||||
<script>
|
||||
// Source (e.g. https://victim/?__proto__[href]=javascript:alert(document.domain))
|
||||
// For demo we just pollute manually:
|
||||
Object.prototype.href = 'javascript:alert(`polluted`)' ;
|
||||
|
||||
// Sink – URL() constructor implicitly reads `href`
|
||||
new URL('#'); // breaks into JS; in Chrome you get an alert, Firefox loads "javascript:" URL
|
||||
</script>
|
||||
```
|
||||
Altri gadget globali utili che sono stati confermati funzionare dopo la contaminazione (testato 2024-11):
|
||||
|
||||
| Classe di gadget | Proprietà letta | Primitiva ottenuta |
|
||||
|------------------|----------------|--------------------|
|
||||
| `Notification` | `title` | `alert()` tramite clic sulla notifica |
|
||||
| `Worker` | `name` | Esecuzione JS in Worker dedicato |
|
||||
| `Image` | `src` | Tradizionale XSS `onerror` |
|
||||
| `URLSearchParams`| `toString` | Open Redirect basato su DOM |
|
||||
|
||||
Vedi il documento di PortSwigger per l'elenco completo di 11 gadget e una discussione sulle fughe dalla sandbox.
|
||||
|
||||
---
|
||||
|
||||
## CVE PP Notabili Lato Client (2023-2025)
|
||||
|
||||
* **DOMPurify ≤ 3.0.8 – CVE-2024-45801** Un attaccante potrebbe inquinare `Node.prototype.after` prima che il sanitizzatore fosse inizializzato, eludendo il profilo *SAFE_FOR_TEMPLATES* e portando a XSS memorizzato. Il fornitore ha corretto utilizzando controlli `Object.hasOwn()` e `Object.create(null)` per le mappe interne.
|
||||
* **jQuery 3.6.0-3.6.3 – CVE-2023-26136 / CVE-2023-26140** `extend()` potrebbe essere utilizzato su oggetti creati da `location.hash`, introducendo proprietà arbitrarie in `Object.prototype` nel contesto di navigazione.
|
||||
* **sanitize-html < 2.8.1 (2023-10) contaminazione del prototipo** Un elenco di attributi malevoli come `{"__proto__":{"innerHTML":"<img/src/onerror=alert(1)>"}}` ha eluso la lista di autorizzazione.
|
||||
|
||||
Anche se la libreria vulnerabile vive **solo sul client**, l'XSS risultante è comunque sfruttabile da remoto tramite parametri riflessi, gestori postMessage o dati memorizzati resi successivamente.
|
||||
|
||||
---
|
||||
|
||||
## Misure Difensive Moderne
|
||||
|
||||
1. **Congela il prototipo globale presto** (idealmente come primo script):
|
||||
```javascript
|
||||
Object.freeze(Object.prototype);
|
||||
Object.freeze(Array.prototype);
|
||||
Object.freeze(Map.prototype);
|
||||
```
|
||||
Fai attenzione che questo potrebbe rompere i polyfill che si basano su estensioni tardive.
|
||||
2. Usa `structuredClone()` invece di `JSON.parse(JSON.stringify(obj))` o frammenti "deepMerge" della comunità – ignora setter/getter e non percorre la catena del prototipo.
|
||||
3. Quando hai davvero bisogno di funzionalità di fusione profonda, scegli **lodash ≥ 4.17.22** o **deepmerge ≥ 5.3.0** che hanno sanificazione del prototipo integrata.
|
||||
4. Aggiungi una Content-Security-Policy con `script-src 'self'` e un nonce rigoroso. Anche se CSP non fermerà tutti i gadget (ad es. manipolazione di `location`), blocca la maggior parte dei sink `innerHTML`.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [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/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user