Parameter Pollution | JSON Injection
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.
Επισκόπηση HTTP Parameter Pollution (HPP)
Το HTTP Parameter Pollution (HPP) είναι μια τεχνική όπου οι επιτιθέμενοι χειραγωγούν παραμέτρους HTTP για να αλλάξουν τη συμπεριφορά μιας web εφαρμογής με ανεπιθύμητους τρόπους. Αυτή η χειραγώγηση γίνεται με την προσθήκη, τροποποίηση ή διπλασιασμό παραμέτρων HTTP. Το αποτέλεσμα αυτών των χειραγωγήσεων δεν είναι άμεσα ορατό στον χρήστη, αλλά μπορεί να αλλάξει σημαντικά τη λειτουργικότητα στην πλευρά του server, με εμφανείς επιπτώσεις στην πλευρά του client.
Παράδειγμα HTTP Parameter Pollution (HPP)
Ένα URL συναλλαγής σε τραπεζική εφαρμογή:
- Αρχικό URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Με την εισαγωγή πρόσθετης παραμέτρου from:
- Παραποιημένο URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
Η συναλλαγή μπορεί να χρεωθεί λανθασμένα στον accountC αντί για τον accountA, επιδεικνύοντας τη δυνατότητα του HPP να χειραγωγεί συναλλαγές ή άλλες λειτουργίες όπως επαναφορά κωδικών, ρυθμίσεις 2FA ή αιτήματα API key.
Παρσάρισμα παραμέτρων ανά τεχνολογία
- Ο τρόπος με τον οποίο γίνεται το parsing και η ιεράρχηση των παραμέτρων εξαρτάται από την υποκείμενη web τεχνολογία, επηρεάζοντας τον τρόπο που μπορεί να εκμεταλλευτεί το HPP.
- Εργαλεία όπως Wappalyzer βοηθούν στον εντοπισμό αυτών των τεχνολογιών και της συμπεριφοράς parsing τους.
Εκμετάλλευση PHP και HPP
Παράδειγμα χειραγώγησης OTP:
- Πλαίσιο: Εκμεταλλεύτηκε ένας μηχανισμός σύνδεσης που απαιτούσε One-Time Password (OTP).
- Μέθοδος: Με την υποκλοπή του αιτήματος OTP χρησιμοποιώντας εργαλεία όπως το Burp Suite, οι επιτιθέμενοι διπλασίασαν την παράμετρο
emailστο HTTP request. - Αποτέλεσμα: Το OTP, που προοριζόταν για το αρχικό email, στάλθηκε στη δεύτερη διεύθυνση email που αναφερόταν στο παραποιημένο αίτημα. Αυτό το σφάλμα επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προβλεπόμενο μέτρο ασφαλείας.
Αυτό το σενάριο υπογραμμίζει μια κρίσιμη παράληψη στο backend της εφαρμογής, που επεξεργαζόταν την πρώτη παράμετρο email για τη δημιουργία του OTP αλλά χρησιμοποιούσε την τελευταία για την παράδοσή του.
Παράδειγμα χειραγώγησης API key:
- Σενάριο: Μια εφαρμογή επιτρέπει στους χρήστες να ενημερώνουν το API key τους μέσω σελίδας ρυθμίσεων προφίλ.
- Δίαυλος επίθεσης: Ο επιτιθέμενος ανακαλύπτει ότι με το να προσθέσει μια επιπλέον παράμετρο
api_keyστο POST request, μπορεί να χειραγωγήσει το αποτέλεσμα της λειτουργίας ενημέρωσης του API key. - Τεχνική: Χρησιμοποιώντας ένα εργαλείο όπως το Burp Suite, ο επιτιθέμενος δημιουργεί ένα αίτημα που περιλαμβάνει δύο παραμέτρους
api_key: μία νόμιμη και μία κακόβουλη. Ο server, επεξεργαζόμενος μόνο την τελευταία εμφάνιση, ενημερώνει το API key με την τιμή που παρείχε ο επιτιθέμενος. - Αποτέλεσμα: Ο επιτιθέμενος αποκτά έλεγχο πάνω στη λειτουργικότητα API του θύματος, ενδεχομένως αποκτώντας ή τροποποιώντας ιδιωτικά δεδομένα χωρίς εξουσιοδότηση.
Αυτό το παράδειγμα υπογραμμίζει περαιτέρω την ανάγκη για ασφαλή χειρισμό παραμέτρων, ειδικά σε λειτουργίες τόσο κρίσιμες όσο η διαχείριση API key.
Παρσάρισμα παραμέτρων: Flask vs. PHP
Ο τρόπος που οι web τεχνολογίες χειρίζονται διπλότυπες παραμέτρους HTTP διαφέρει, επηρεάζοντας την ευπάθειά τους σε επιθέσεις HPP:
- Flask: Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως
a=1σε ένα query stringa=1&a=2, προτεραιοποιώντας την αρχική εμφάνιση σε σχέση με τις επακόλουθες. - PHP (on Apache HTTP Server): Αντίθετα, προτεραιοποιεί την τελευταία τιμή παραμέτρου, επιλέγοντας
a=2στο παράδειγμα. Αυτή η συμπεριφορά μπορεί να διευκολύνει ανεπιθύμητα εκμεταλλεύσεις HPP, δίνοντας προτεραιότητα στην παραποιημένη παράμετρο του επιτιθέμενου έναντι της αρχικής.
Σημειώσεις δοκιμών HPP (OWASP WSTG)
- Τα HTTP standards δεν ορίζουν πώς να ερμηνευτούν πολλαπλές παράμετροι με το ίδιο όνομα, οπότε η συμπεριφορά διαφέρει ανά στοίβα και συστατικά.
- Όταν δοκιμάζετε server-side HPP, διπλασιάστε κάθε παράμετρο σε query strings ή bodies και παρατηρήστε εάν η εφαρμογή συνενώνει τιμές, χρησιμοποιεί first/last, ή επιστρέφει σφάλμα.
- Για client-side HPP, εγχύστε ένα URL-encoded
&σε μια τιμή παραμέτρου που ανακλάται (π.χ.%26HPP_TEST) και ψάξτε για απο-κωδικοποιημένες εμφανίσεις όπως&HPP_TESTή&HPP_TESTμέσα σε παραγόμενα links ή form actions.
Server-Side Parameter Pollution (SSPP) σε εσωτερικά APIs
Κάποιες εφαρμογές ενσωματώνουν είσοδο χρήστη σε server-side αιτήματα προς internal APIs. Εάν αυτή η είσοδος δεν κωδικοποιηθεί σωστά, μπορείτε να εισάγετε ή να υπερισχύσετε παραμέτρους στο εσωτερικό αίτημα. Δοκιμάστε οποιαδήποτε είσοδο χρήστη, συμπεριλαμβανομένων query parameters, form fields, headers και URL path parameters.
Συνήθεις δοκιμές:
- Προσθέστε μια νέα παράμετρο με
%26(URL-encoded&). - Κόψτε το downstream query με
%23(URL-encoded#). - Υπερισχύστε μια υπάρχουσα παράμετρο διπλασιάζοντάς την.
Παράδειγμα:
GET /userSearch?name=peter%26name=carlos&back=/home
Πιθανώς έχει ως αποτέλεσμα ένα server-side request όπως:
GET /users/search?name=peter&name=carlos&publicProfile=true
Parameter pollution ανά τεχνολογία
Τα αποτελέσματα προέρχονται από https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 ΚΑΙ Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Αγνόησε οτιδήποτε μετά το %00 στο όνομα της παραμέτρου .
- Αντιμετωπίζει name[] ως πίνακα .
- _GET δεν σημαίνει Μέθοδο GET .
- Προτιμά την τελευταία παράμετρο .
Ruby 3.3.5 και WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Χρησιμοποιεί τα διαχωριστικά & και ; για να διαχωρίσει τις παραμέτρους .
- Δεν αναγνωρίζει name[] .
- Προτιμά την πρώτη παράμετρο .
Spring MVC 6.0.23 ΚΑΙ Apache Tomcat 10.1.30
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping .
- POST RequestMapping & PostMapping αναγνωρίζουν name[] .
- Προτιμά το name αν υπάρχουν name και name[] .
- Συνενώνει τις παραμέτρους π.χ. first,last .
- POST RequestMapping & PostMapping αναγνωρίζουν query parameter με Content-Type .
NodeJS 20.17.0 ΚΑΙ Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Αναγνωρίζει name[] .
- Συνενώνει τις παραμέτρους π.χ. first,last .
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- Δεν αναγνωρίζει name[] .
- Προτιμά την πρώτη παράμετρο .
Python 3.12.6 ΚΑΙ Werkzeug 3.0.4 ΚΑΙ Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- Δεν αναγνωρίζει name[] .
- Προτιμά την πρώτη παράμετρο .
Python 3.12.6 ΚΑΙ Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- Δεν αναγνωρίζει name[] .
- Προτιμά την τελευταία παράμετρο .
Python 3.12.6 ΚΑΙ Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- Δεν αναγνωρίζει name[] .
- Προτιμά την τελευταία παράμετρο .
JSON Injection
Διπλά κλειδιά
obj = {"test": "user", "test": "admin"}
Το front-end μπορεί να εμπιστευτεί την πρώτη εμφάνιση ενώ το backend θα χρησιμοποιήσει τη δεύτερη εμφάνιση του κλειδιού.
Key Collision: Περικοπή χαρακτήρων και σχόλια
Ορισμένοι χαρακτήρες δεν θα ερμηνευτούν σωστά από το front-end, αλλά το backend θα τους ερμηνεύσει και θα χρησιμοποιήσει αυτά τα κλειδιά — αυτό μπορεί να είναι χρήσιμο για να παρακαμφθούν ορισμένοι περιορισμοί:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Σημειώστε πώς σε αυτές τις περιπτώσεις το front end μπορεί να νομίζει ότι test == 1 και το backend θα νομίζει ότι test == 2.
Αυτό μπορεί επίσης να χρησιμοποιηθεί για να παρακαμφθούν περιορισμοί τιμών όπως:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Χρήση Comment Truncation
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Εδώ θα χρησιμοποιήσουμε τον serializer από κάθε parser για να δούμε την αντίστοιχη έξοδό του.
Serializer 1 (π.χ. GoLang’s GoJay library) θα παράγει:
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (π.χ. Java’s JSON-iterator library) θα παράγει:
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
Εναλλακτικά, απλή χρήση σχολίων μπορεί επίσης να είναι αποτελεσματική:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Java’s GSON βιβλιοθήκη:
{ "description": "Comment support", "test": 1, "extra": "a" }
Η βιβλιοθήκη simdjson του Ruby:
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
Ασυνεπής Προτεραιότητα: Deserialization vs. Serialization
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Πραγματικός (Float) και Ακέραιος (Integer)
Ο αριθμός
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
μπορεί να αποκωδικοποιηθεί σε πολλαπλές αναπαραστάσεις, συμπεριλαμβανομένων:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Που μπορεί να δημιουργήσει ασυνέπειες
Αναφορές
-
https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654
-
https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution
-
https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
-
https://bishopfox.com/blog/json-interoperability-vulnerabilities
-
https://portswigger.net/web-security/api-testing/server-side-parameter-pollution
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.


