# Parameter Pollution | JSON Injection ## Parameter Pollution {{#include ../banners/hacktricks-training.md}} ## HTTP Parameter Pollution (HPP) Overview Η HTTP Parameter Pollution (HPP) είναι μια τεχνική όπου οι επιτιθέμενοι χειρίζονται τις παραμέτρους HTTP για να αλλάξουν τη συμπεριφορά μιας διαδικτυακής εφαρμογής με μη αναμενόμενους τρόπους. Αυτή η χειραγώγηση γίνεται προσθέτοντας, τροποποιώντας ή διπλασιάζοντας παραμέτρους HTTP. Η επίδραση αυτών των χειρισμών δεν είναι άμεσα ορατή στον χρήστη, αλλά μπορεί να αλλάξει σημαντικά τη λειτουργικότητα της εφαρμογής στην πλευρά του διακομιστή, με παρατηρήσιμες επιπτώσεις στην πλευρά του πελάτη. ### Example of 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. #### **Technology-Specific Parameter Parsing** - Ο τρόπος που οι παράμετροι αναλύονται και προτεραιοποιούνται εξαρτάται από την υποκείμενη διαδικτυακή τεχνολογία, επηρεάζοντας το πώς μπορεί να εκμεταλλευτεί η HPP. - Εργαλεία όπως το [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) βοηθούν στην αναγνώριση αυτών των τεχνολογιών και των συμπεριφορών ανάλυσής τους. ### PHP and HPP Exploitation **Περίπτωση Χειραγώγησης OTP:** - **Συγκείμενο:** Ένας μηχανισμός σύνδεσης που απαιτεί έναν Κωδικό Μίας Χρήσης (OTP) εκμεταλλεύτηκε. - **Μέθοδος:** Με την παρεμβολή του αιτήματος OTP χρησιμοποιώντας εργαλεία όπως το Burp Suite, οι επιτιθέμενοι διπλασίασαν την παράμετρο `email` στο αίτημα HTTP. - **Αποτέλεσμα:** Ο OTP, που προοριζόταν για την αρχική διεύθυνση email, στάλθηκε αντί αυτού στη δεύτερη διεύθυνση email που καθορίστηκε στο χειραγωγημένο αίτημα. Αυτή η αδυναμία επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προοριζόμενο μέτρο ασφαλείας. Αυτό το σενάριο αναδεικνύει μια κρίσιμη παράλειψη στην υποδομή της εφαρμογής, η οποία επεξεργάστηκε την πρώτη παράμετρο `email` για την παραγωγή OTP αλλά χρησιμοποίησε την τελευταία για την παράδοση. **Περίπτωση Χειραγώγησης API Key:** - **Σενάριο:** Μια εφαρμογή επιτρέπει στους χρήστες να ενημερώνουν το API key τους μέσω μιας σελίδας ρυθμίσεων προφίλ. - **Διαδρομή Επίθεσης:** Ένας επιτιθέμενος ανακαλύπτει ότι προσθέτοντας μια επιπλέον παράμετρο `api_key` στο αίτημα POST, μπορεί να χειραγωγήσει το αποτέλεσμα της λειτουργίας ενημέρωσης του API key. - **Τεχνική:** Χρησιμοποιώντας ένα εργαλείο όπως το Burp Suite, ο επιτιθέμενος δημιουργεί ένα αίτημα που περιλαμβάνει δύο παραμέτρους `api_key`: μία νόμιμη και μία κακόβουλη. Ο διακομιστής, επεξεργαζόμενος μόνο την τελευταία εμφάνιση, ενημερώνει το API key στην τιμή που παρέχεται από τον επιτιθέμενο. - **Αποτέλεσμα:** Ο επιτιθέμενος αποκτά έλεγχο στη λειτουργικότητα API του θύματος, ενδεχομένως αποκτώντας ή τροποποιώντας ιδιωτικά δεδομένα χωρίς εξουσιοδότηση. Αυτό το παράδειγμα υπογραμμίζει περαιτέρω την αναγκαιότητα για ασφαλή χειρισμό παραμέτρων, ειδικά σε λειτουργίες τόσο κρίσιμες όσο η διαχείριση API key. ### Parameter Parsing: Flask vs. PHP Ο τρόπος που οι διαδικτυακές τεχνολογίες χειρίζονται διπλές παραμέτρους HTTP διαφέρει, επηρεάζοντας την ευαισθησία τους σε επιθέσεις HPP: - **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, προτεραιοποιώντας την αρχική εμφάνιση σε σχέση με τις επόμενες διπλές. - **PHP (σε Apache HTTP Server):** Αντίθετα, προτεραιοποιεί την τελευταία τιμή παραμέτρου, επιλέγοντας `a=2` στο δεδομένο παράδειγμα. Αυτή η συμπεριφορά μπορεί ακούσια να διευκολύνει τις εκμεταλλεύσεις HPP τιμώντας την παραμετροποιημένη παράμετρο του επιτιθέμενου αντί της αρχικής. ## Parameter pollution by technology There results were taken from [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) ### PHP 8.3.11 AND Apache 2.4.62

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

1. Αγνοήστε οτιδήποτε μετά το %00 στο όνομα παραμέτρου. 2. Χειριστείτε το name\[] ως πίνακα. 3. \_GET δεν σημαίνει μέθοδο GET. 4. Προτιμήστε την τελευταία παράμετρο. ### Ruby 3.3.5 and WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

1. Χρησιμοποιεί τους διαχωριστές & και ; για να διαχωρίσει τις παραμέτρους. 2. Δεν αναγνωρίζεται το name\[]. 3. Προτιμήστε την πρώτη παράμετρο. ### Spring MVC 6.0.23 AND Apache Tomcat 10.1.30

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping. 2. POST RequestMapping & PostMapping αναγνωρίζουν το name\[]. 3. Προτιμήστε το name αν το name και το name\[] υπάρχουν. 4. Συγκεντρώστε παραμέτρους π.χ. first,last. 5. POST RequestMapping & PostMapping αναγνωρίζουν παραμέτρους ερωτήματος με Content-Type. ### **NodeJS** 20.17.0 **AND** Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

1. Αναγνωρίζεται το name\[]. 2. Συγκεντρώστε παραμέτρους π.χ. first,last. ### GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

1. ΔΕΝ αναγνωρίζεται το name\[]. 2. Προτιμήστε την πρώτη παράμετρο. ### Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

1. ΔΕΝ αναγνωρίζεται το name\[]. 2. Προτιμήστε την πρώτη παράμετρο. ### Python 3.12.6 AND Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

1. ΔΕΝ αναγνωρίζεται το name\[]. 2. Προτιμήστε την τελευταία παράμετρο. ### Python 3.12.6 AND Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

1. ΔΕΝ αναγνωρίζεται το name\[]. 2. Προτιμήστε την τελευταία παράμετρο. ## JSON Injection ### Duplicate keys ```ini obj = {"test": "user", "test": "admin"} ``` Η διεπαφή χρήστη μπορεί να πιστεύει την πρώτη εμφάνιση ενώ το backend χρησιμοποιεί τη δεύτερη εμφάνιση του κλειδιού. ### Σύγκρουση Κλειδιών: Συντομεύσεις Χαρακτήρων και Σχόλια Ορισμένοι χαρακτήρες δεν θα ερμηνευτούν σωστά από την διεπαφή χρήστη, αλλά το backend θα τους ερμηνεύσει και θα χρησιμοποιήσει αυτά τα κλειδιά, αυτό θα μπορούσε να είναι χρήσιμο για **να παρακαμφθούν ορισμένοι περιορισμοί**: ```json {"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`. Αυτό μπορεί επίσης να χρησιμοποιηθεί για να παρακαμφθούν οι περιορισμοί τιμών όπως: ```json {"role": "administrator\[raw \x0d byte]"} {"role":"administrator\ud800"} {"role": "administrator""} {"role": "admini\strator"} ``` ### **Χρησιμοποιώντας την Τεχνική Σύντμησης Σχολίων** ```ini obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */} ``` Εδώ θα χρησιμοποιήσουμε τον σειριαστή από κάθε αναλυτή για να δούμε την αντίστοιχη έξοδό του. Serializer 1 (π.χ., GoLang's GoJay library) θα παράγει: - `description = "Duplicate with comments"` - `test = 2` - `extra = ""` Serializer 2 (π.χ., Java's JSON-iterator library) θα παράγει: - `description = "Duplicate with comments"` - `extra = "/*"` - `extra2 = "*/"` - `test = 1` Εναλλακτικά, η απλή χρήση σχολίων μπορεί επίσης να είναι αποτελεσματική: ```ini obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/} ``` Η βιβλιοθήκη GSON της Java: ```json { "description": "Comment support", "test": 1, "extra": "a" } ``` Η βιβλιοθήκη simdjson της Ruby: ```json { "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" } ``` ### **Ασυνεπής Προτεραιότητα: Αποσυμπίεση έναντι Συμπίεσης** ```ini obj = {"test": 1, "test": 2} obj["test"] // 1 obj.toString() // {"test": 2} ``` ### Float και Ακέραιος Ο αριθμός ```undefined 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 ``` μπορεί να αποκωδικοποιηθεί σε πολλές αναπαραστάσεις, συμπεριλαμβανομένων: ```undefined 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 9.999999999999999e95 1E+96 0 9223372036854775807 ``` Ποιες μπορεί να δημιουργήσουν ασυνέπειες ## Αναφορές - [https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654](https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654) - [https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution) - [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) - [https://bishopfox.com/blog/json-interoperability-vulnerabilities](https://bishopfox.com/blog/json-interoperability-vulnerabilities) {{#include ../banners/hacktricks-training.md}}