Horizontal IDOR
Accessing another user’s data at the same privilege level, someone else’s invoice, profile, or order instead of your own.
Vertical IDOR
Accessing data or functionality meant for a higher privilege level, an admin-only object or action, without actually having that role.
Finding the Reference Point
Start by identifying every place an object reference shows up, not just the obvious URL parameter.Where else object references hide
Where else object references hide
- POST body fields:
{"user_id": 1042, "action": "view"} - Custom headers:
X-User-ID: 1042 - Cookies: a session or preference cookie carrying a raw user/account ID
- File paths:
/invoices/INV-1042.pdf,/uploads/1042/profile.jpg - Hidden form fields: an
<input type="hidden">carrying an account or object ID - API responses and page source: a GUID or internal ID leaked in a JS variable, an API response’s metadata, or an email notification link
Testing Numeric IDs
Simple increment/decrement is the first thing to try, sequential integer IDs are still extremely common.Bypassing Non-Sequential IDs
GUIDs / UUIDs in use instead of integers
GUIDs / UUIDs in use instead of integers
A random-looking GUID isn’t guessable by incrementing, but it’s rarely actually unguessable, it’s just not visible in the current request. Check everywhere else the same object’s GUID might already be exposed: another API response, a notification email, page source, or a different endpoint that happens to list GUIDs alongside more guessable data (like a username).
App checks role instead of ownership
App checks role instead of ownership
A common flawed implementation: the backend checks “is this user an authenticated member” rather than “does this user own this specific object.” If horizontal IDOR (same role, different user) fails, try vertical: does a regular user’s token work against an endpoint clearly meant for a different role, just because the role check itself is missing rather than the object-ownership check?
Content-Type / format switching
Content-Type / format switching
An authorization check implemented for the JSON endpoint sometimes isn’t mirrored on an XML or form-encoded version of the same endpoint. Try sending the identical request with
Content-Type: application/xml or application/x-www-form-urlencoded instead of application/json, and see if the authorization logic still applies.Parameter pollution and array wrapping
Parameter pollution and array wrapping
Sending the same parameter twice, or wrapping it in an array, sometimes causes the backend’s authorization check and its actual data fetching logic to read different values of the “same” parameter.
Mass assignment alongside the ID
Mass assignment alongside the ID
If an update endpoint accepts a JSON body, try adding fields beyond what the form actually exposes, a
role, isAdmin, or balance field the client never sends but the backend might still bind.Blind IDOR
Not every IDOR gives you a response to read, deleting, disabling, or modifying another user’s object often returns a generic success message either way. Confirm impact out-of-band instead of relying on the response body.1
Perform the action against a known victim ID
E.g. attempt to cancel or modify an object belonging to your second test account.
2
Check from the victim's side
Log back in as the victim account (or have a teammate check) to confirm whether the state actually changed, a generic “Success” response from account A proves nothing on its own.
Tooling
- Burp Suite
- FFUF
- Postman
Autorize (extension) automates exactly the two-account comparison this vulnerability class needs: it replays every request you make as a low-privileged user’s session and flags any that still return data, catching IDOR and broken access control across an entire app as you browse normally.Intruder works for straightforward numeric ID brute forcing, same idea as the FFUF command above, just inside Burp if you’re already working there.
Quick Reference Tools
Hackviser: IDOR
Reference used for this page.
HackTricks: IDOR
Deeper dive into additional bypass tricks.
Autorize
Burp extension automating authorization/IDOR testing across an entire browsing session.

