mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
210 lines
15 KiB
Markdown
210 lines
15 KiB
Markdown
# 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 <a href="#id-9523" id="id-9523"></a>
|
||
|
||
<figure><img src="../images/image (1255).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg</a></p></figcaption></figure>
|
||
|
||
1. Αγνοήστε οτιδήποτε μετά το %00 στο όνομα παραμέτρου.
|
||
2. Χειριστείτε το name\[] ως πίνακα.
|
||
3. \_GET δεν σημαίνει μέθοδο GET.
|
||
4. Προτιμήστε την τελευταία παράμετρο.
|
||
|
||
### Ruby 3.3.5 and WEBrick 1.8.2
|
||
|
||
<figure><img src="../images/image (1257).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg</a></p></figcaption></figure>
|
||
|
||
1. Χρησιμοποιεί τους διαχωριστές & και ; για να διαχωρίσει τις παραμέτρους.
|
||
2. Δεν αναγνωρίζεται το name\[].
|
||
3. Προτιμήστε την πρώτη παράμετρο.
|
||
|
||
### Spring MVC 6.0.23 AND Apache Tomcat 10.1.30 <a href="#dd68" id="dd68"></a>
|
||
|
||
<figure><img src="../images/image (1258).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg</a></p></figcaption></figure>
|
||
|
||
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 <a href="#id-6d72" id="id-6d72"></a>
|
||
|
||
<figure><img src="../images/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
|
||
|
||
1. Αναγνωρίζεται το name\[].
|
||
2. Συγκεντρώστε παραμέτρους π.χ. first,last.
|
||
|
||
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
|
||
|
||
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
|
||
|
||
1. ΔΕΝ αναγνωρίζεται το name\[].
|
||
2. Προτιμήστε την πρώτη παράμετρο.
|
||
|
||
### Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3 <a href="#b853" id="b853"></a>
|
||
|
||
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
|
||
|
||
1. ΔΕΝ αναγνωρίζεται το name\[].
|
||
2. Προτιμήστε την πρώτη παράμετρο.
|
||
|
||
### Python 3.12.6 AND Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
|
||
|
||
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
|
||
|
||
1. ΔΕΝ αναγνωρίζεται το name\[].
|
||
2. Προτιμήστε την τελευταία παράμετρο.
|
||
|
||
### Python 3.12.6 AND Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
|
||
|
||
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
|
||
|
||
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}}
|