NodeJS - __proto__ & prototype Pollution
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Τα αντικείμενα στην JavaScript είναι ουσιαστικά συλλογές ζευγών κλειδιού-τιμής, γνωστές ως ιδιότητες. Ένα αντικείμενο μπορεί να δημιουργηθεί χρησιμοποιώντας το Object.create
με null
ως επιχείρημα για να παραχθεί ένα κενό αντικείμενο. Αυτή η μέθοδος επιτρέπει τη δημιουργία ενός αντικειμένου χωρίς καμία κληρονομούμενη ιδιότητα.
Ένα κενό αντικείμενο είναι παρόμοιο με ένα κενό λεξικό, που αναπαρίσταται ως {}
.
Στην JavaScript, οι κλάσεις και οι συναρτήσεις είναι στενά συνδεδεμένες, με τις συναρτήσεις συχνά να λειτουργούν ως κατασκευαστές για κλάσεις. Παρά την έλλειψη εγγενών υποστηρίξεων κλάσης στην JavaScript, οι κατασκευαστές μπορούν να μιμούνται τη συμπεριφορά κλάσης.
Η JavaScript επιτρέπει την τροποποίηση, προσθήκη ή διαγραφή χαρακτηριστικών πρωτοτύπου κατά την εκτέλεση. Αυτή η ευελιξία επιτρέπει τη δυναμική επέκταση των λειτουργιών της κλάσης.
Συναρτήσεις όπως toString
και valueOf
μπορούν να τροποποιηθούν για να αλλάξουν τη συμπεριφορά τους, αποδεικνύοντας τη προσαρμοστική φύση του συστήματος πρωτοτύπων της JavaScript.
Στον προγραμματισμό με βάση τα πρωτότυπα, οι ιδιότητες/μέθοδοι κληρονομούνται από αντικείμενα από κλάσεις. Αυτές οι κλάσεις δημιουργούνται προσθέτοντας ιδιότητες/μεθόδους είτε σε μια παρουσία άλλης κλάσης είτε σε ένα κενό αντικείμενο.
Πρέπει να σημειωθεί ότι όταν μια ιδιότητα προστεθεί σε ένα αντικείμενο που χρησιμεύει ως το πρωτότυπο για άλλα αντικείμενα (όπως το myPersonObj
), τα κληρονομικά αντικείμενα αποκτούν πρόσβαση σε αυτή τη νέα ιδιότητα. Ωστόσο, αυτή η ιδιότητα δεν εμφανίζεται αυτόματα εκτός αν προσκληθεί ρητά.
Τα αντικείμενα JavaScript ορίζονται από ζεύγη κλειδιού-τιμής και κληρονομούν από το πρωτότυπο Αντικειμένου JavaScript. Αυτό σημαίνει ότι η τροποποίηση του πρωτοτύπου Αντικειμένου μπορεί να επηρεάσει όλα τα αντικείμενα στο περιβάλλον.
Ας χρησιμοποιήσουμε ένα διαφορετικό παράδειγμα για να το εικονογραφήσουμε:
Η πρόσβαση στο πρωτότυπο του αντικειμένου είναι δυνατή μέσω:
Με την προσθήκη ιδιοτήτων στο πρωτότυπο του Object, κάθε αντικείμενο JavaScript θα κληρονομήσει αυτές τις νέες ιδιότητες:
Για ένα σενάριο όπου η χρήση του __proto__
είναι περιορισμένη, η τροποποίηση του πρωτοτύπου μιας συνάρτησης είναι μια εναλλακτική:
Αυτό επηρεάζει μόνο τα αντικείμενα που δημιουργούνται από τον κατασκευαστή Vehicle
, δίνοντάς τους τις ιδιότητες beep
, hasWheels
, honk
και isElectric
.
Δύο μέθοδοι για να επηρεάσουν παγκοσμίως τα αντικείμενα JavaScript μέσω της ρύπανσης πρωτοτύπου περιλαμβάνουν:
Ρύπανση του Object.prototype
άμεσα:
Μολύνοντας το πρωτότυπο ενός κατασκευαστή για μια κοινώς χρησιμοποιούμενη δομή:
Μετά από αυτές τις λειτουργίες, κάθε αντικείμενο JavaScript μπορεί να εκτελέσει τις μεθόδους goodbye
και greet
.
Σε ένα σενάριο όπου μπορείτε να μολύνετε ένα συγκεκριμένο αντικείμενο και χρειάζεστε να φτάσετε στο Object.prototype
μπορείτε να το αναζητήσετε με κάτι σαν τον παρακάτω κώδικα:
Σημειώστε ότι καθώς μπορείτε να ρυπαίνετε τις ιδιότητες των αντικειμένων σε JS, αν έχετε πρόσβαση για να ρυπάτε έναν πίνακα μπορείτε επίσης να ρυπαίνετε τις τιμές του πίνακα που είναι προσβάσιμες μέσω δεικτών (σημειώστε ότι δεν μπορείτε να αντικαταστήσετε τιμές, οπότε πρέπει να ρυπάρετε δείκτες που χρησιμοποιούνται με κάποιον τρόπο αλλά δεν γράφονται).
Όταν δημιουργείτε ένα HTML στοιχείο μέσω JS, είναι δυνατόν να επικαλύψετε την innerHTML
ιδιότητα για να κάνετε να γράφει τυχαίο HTML κώδικα. Ιδέα και παράδειγμα από αυτή τη συγγραφή.
Μια ρύπανση πρωτοτύπου συμβαίνει λόγω ενός σφάλματος στην εφαρμογή που επιτρέπει την επαναγραφή ιδιοτήτων στο Object.prototype
. Αυτό σημαίνει ότι καθώς οι περισσότερες αντικείμενα αντλούν τις ιδιότητές τους από το Object.prototype
Το πιο απλό παράδειγμα είναι να προσθέσετε μια τιμή σε μια μη καθορισμένη ιδιότητα ενός αντικειμένου που πρόκειται να ελεγχθεί, όπως:
Αν το χαρακτηριστικό admin
είναι μη καθορισμένο είναι δυνατόν να εκμεταλλευτείτε μια PP και να το ορίσετε σε True με κάτι όπως:
Ο μηχανισμός πίσω από αυτό περιλαμβάνει την παραποίηση ιδιοτήτων έτσι ώστε αν ένας επιτιθέμενος έχει έλεγχο σε ορισμένες εισόδους, να μπορεί να τροποποιήσει το πρωτότυπο όλων των αντικειμένων στην εφαρμογή. Αυτή η παραποίηση συνήθως περιλαμβάνει την ρύθμιση της ιδιότητας __proto__
, η οποία, στη JavaScript, είναι συνώνυμη με την άμεση τροποποίηση του πρωτοτύπου ενός αντικειμένου.
Οι συνθήκες υπό τις οποίες αυτή η επίθεση μπορεί να εκτελεστεί με επιτυχία, όπως περιγράφεται σε μια συγκεκριμένη μελέτη, περιλαμβάνουν:
Εκτέλεση αναδρομικής συγχώνευσης.
Ορισμός ιδιοτήτων με βάση μια διαδρομή.
Κλωνοποίηση αντικειμένων.
Άλλες payloads:
Για περισσότερες λεπτομέρειες δείτε αυτό το άρθρο Στην jQuery, η συνάρτηση $ .extend
μπορεί να οδηγήσει σε ρύπανση πρωτοκόλλου αν η δυνατότητα βαθιάς αντιγραφής χρησιμοποιηθεί λανθασμένα. Αυτή η συνάρτηση χρησιμοποιείται συνήθως για την κλωνοποίηση αντικειμένων ή τη συγχώνευση ιδιοτήτων από ένα προεπιλεγμένο αντικείμενο. Ωστόσο, όταν είναι λανθασμένα ρυθμισμένη, οι ιδιότητες που προορίζονται για ένα νέο αντικείμενο μπορούν να ανατεθούν στο πρωτότυπο αντί αυτού. Για παράδειγμα:
Αυτή η ευπάθεια, που αναγνωρίστηκε ως CVE-2019–11358, δείχνει πώς μια βαθιά αντιγραφή μπορεί να τροποποιήσει κατά λάθος το πρωτότυπο, οδηγώντας σε πιθανούς κινδύνους ασφαλείας, όπως μη εξουσιοδοτημένη πρόσβαση διαχειριστή εάν οι ιδιότητες όπως το isAdmin
ελέγχονται χωρίς κατάλληλη επαλήθευση ύπαρξης.
Για περισσότερες λεπτομέρειες δείτε αυτό το άρθρο
Το Lodash αντιμετώπισε παρόμοιες ευπάθειες ρύθμισης πρωτοτύπου (CVE-2018–3721, CVE-2019–10744). Αυτά τα ζητήματα επιλύθηκαν στην έκδοση 4.17.11.
Server-Side-Prototype-Pollution-Gadgets-Scanner: Επέκταση του Burp Suite σχεδιασμένη για την ανίχνευση και ανάλυση ευπαθειών ρύθμισης πρωτοτύπου στον διακομιστή σε διαδικτυακές εφαρμογές. Αυτό το εργαλείο αυτοματοποιεί τη διαδικασία σάρωσης αιτημάτων για την αναγνώριση πιθανών ζητημάτων ρύθμισης πρωτοτύπου. Εκμεταλλεύεται γνωστά gadgets - μεθόδους εκμετάλλευσης της ρύθμισης πρωτοτύπου για την εκτέλεση επιβλαβών ενεργειών - εστιάζοντας ιδιαίτερα σε βιβλιοθήκες Node.js.
server-side-prototype-pollution: Αυτή η επέκταση αναγνωρίζει ευπάθειες ρύθμισης πρωτοτύπου στον διακομιστή. Χρησιμοποιεί τεχνικές που περιγράφονται στην ρύθμιση πρωτοτύπου στον διακομιστή.
Το NodeJS χρησιμοποιεί εκτενώς Δέντρα Αφηρημένης Συντακτικής (AST) στη JavaScript για λειτουργίες όπως οι μηχανές προτύπων και το TypeScript. Αυτή η ενότητα εξερευνά τις ευπάθειες που σχετίζονται με τη ρύθμιση πρωτοτύπου σε μηχανές προτύπων, συγκεκριμένα στις Handlebars και Pug.
Η μηχανή προτύπων Handlebars είναι ευάλωτη σε επίθεση ρύθμισης πρωτοτύπου. Αυτή η ευπάθεια προκύπτει από συγκεκριμένες συναρτήσεις μέσα στο αρχείο javascript-compiler.js
. Η συνάρτηση appendContent
, για παράδειγμα, συνενώνει το pendingContent
εάν είναι παρόν, ενώ η συνάρτηση pushSource
επαναφέρει το pendingContent
σε undefined
μετά την προσθήκη της πηγής.
Διαδικασία Εκμετάλλευσης
Η εκμετάλλευση εκμεταλλεύεται το AST (Δέντρο Αφηρημένης Συντακτικής) που παράγεται από τις Handlebars, ακολουθώντας τα εξής βήματα:
Manipulation of the Parser: Αρχικά, ο αναλυτής, μέσω του κόμβου NumberLiteral
, επιβάλλει ότι οι τιμές είναι αριθμητικές. Η ρύθμιση πρωτοτύπου μπορεί να παρακάμψει αυτό, επιτρέποντας την εισαγωγή μη αριθμητικών συμβολοσειρών.
Handling by the Compiler: Ο μεταγλωττιστής μπορεί να επεξεργαστεί ένα αντικείμενο AST ή ένα πρότυπο συμβολοσειράς. Εάν το input.type
ισούται με Program
, η είσοδος αντιμετωπίζεται ως προ-αναλυμένη, κάτι που μπορεί να εκμεταλλευτεί.
Injection of Code: Μέσω της χειραγώγησης του Object.prototype
, μπορεί κανείς να εισάγει αυθαίρετο κώδικα στη συνάρτηση προτύπου, κάτι που μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα.
Ένα παράδειγμα που δείχνει την εκμετάλλευση της ευπάθειας Handlebars:
Αυτός ο κώδικας δείχνει πώς ένας επιτιθέμενος θα μπορούσε να εισάγει αυθαίρετο κώδικα σε ένα πρότυπο Handlebars.
Εξωτερική Αναφορά: Ένα ζήτημα που σχετίζεται με τη ρύπανση πρωτοτύπου βρέθηκε στη βιβλιοθήκη 'flat', όπως αναφέρεται εδώ: Issue on GitHub.
Εξωτερική Αναφορά: Issue related to prototype pollution in the 'flat' library
Παράδειγμα εκμετάλλευσης ρύπανσης πρωτοτύπου σε Python:
Το Pug, μια άλλη μηχανή προτύπων, αντιμετωπίζει παρόμοιο κίνδυνο μόλυνσης πρωτοτύπων. Λεπτομερείς πληροφορίες είναι διαθέσιμες στη συζήτηση για την AST Injection στο Pug.
Παράδειγμα μόλυνσης πρωτοτύπων στο Pug:
Για να μειωθεί ο κίνδυνος μόλυνσης του πρωτοτύπου, μπορούν να εφαρμοστούν οι παρακάτω στρατηγικές:
Αμεταβλητότητα Αντικειμένων: Το Object.prototype
μπορεί να γίνει αμετάβλητο εφαρμόζοντας το Object.freeze
.
Επικύρωση Εισόδου: Οι εισροές JSON θα πρέπει να επικυρώνονται αυστηρά σύμφωνα με το σχήμα της εφαρμογής.
Ασφαλείς Συναρτήσεις Συγχώνευσης: Θα πρέπει να αποφεύγεται η μη ασφαλής χρήση αναδρομικών συναρτήσεων συγχώνευσης.
Αντικείμενα Χωρίς Πρωτότυπα: Αντικείμενα χωρίς ιδιότητες πρωτοτύπου μπορούν να δημιουργηθούν χρησιμοποιώντας το Object.create(null)
.
Χρήση Χάρτη: Αντί για το Object
, θα πρέπει να χρησιμοποιείται ο Map
για την αποθήκευση ζευγών κλειδιού-τιμής.
Ενημερώσεις Βιβλιοθηκών: Οι ενημερώσεις ασφαλείας μπορούν να ενσωματωθούν με τακτική ενημέρωση των βιβλιοθηκών.
Εργαλεία Linter και Στατικής Ανάλυσης: Χρησιμοποιήστε εργαλεία όπως το ESLint με κατάλληλα πρόσθετα για να ανιχνεύσετε και να αποτρέψετε ευπάθειες μόλυνσης του πρωτοτύπου.
Ανασκοπήσεις Κώδικα: Εφαρμόστε λεπτομερείς ανασκοπήσεις κώδικα για να εντοπίσετε και να διορθώσετε πιθανούς κινδύνους που σχετίζονται με τη μόλυνση του πρωτοτύπου.
Εκπαίδευση Ασφαλείας: Εκπαιδεύστε τους προγραμματιστές σχετικά με τους κινδύνους της μόλυνσης του πρωτοτύπου και τις βέλτιστες πρακτικές για τη συγγραφή ασφαλούς κώδικα.
Χρήση Βιβλιοθηκών με Προσοχή: Να είστε προσεκτικοί κατά τη χρήση τρίτων βιβλιοθηκών. Αξιολογήστε τη θέση ασφαλείας τους και ανασκοπήστε τον κώδικά τους, ειδικά εκείνες που χειρίζονται αντικείμενα.
Προστασία Χρόνου Εκτέλεσης: Χρησιμοποιήστε μηχανισμούς προστασίας χρόνου εκτέλεσης, όπως τη χρήση πακέτων npm που εστιάζουν στην ασφάλεια και μπορούν να ανιχνεύσουν και να αποτρέψουν επιθέσεις μόλυνσης του πρωτοτύπου.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)