BOLA is the most common API vulnerability – and one of the easiest to miss. It doesn’t trigger errors, break functionality, or leave obvious traces in logs. Instead, it quietly returns valid data to the wrong user.
Most teams don’t lack awareness of BOLA, but they do lack reliable ways to find it. This guide shows you how to detect BOLA in practice, with a complete, step-by-step methodology.

Detecting BOLA is fundamentally different from testing for injection or input validation issues. A successful attack produces a normal 200 OK response with valid data, making it invisible to traditional scanning approaches. Effective detection requires testing from multiple user perspectives and verifying whether access control is enforced at the object level.
The sections that follow provide a complete, practitioner-focused methodology for identifying BOLA vulnerabilities, from manual testing workflows and authorization matrix design to API-specific edge cases and automated proof-based detection.
Broken object level authorization (BOLA) is an API security vulnerability where an application fails to verify whether an authenticated user is allowed to access a specific object, such as a user record, order, or document. This allows attackers to access or manipulate data that belongs to other users by changing object identifiers in API requests.
BOLA consistently ranks as the number one OWASP API Security Top 10 risk because it is easy to exploit and remarkably easy to miss. The Spoutible social platform authenticated every request correctly – and still exposed user data including password hashes because it never checked whether the requesting user owned the specific data being returned. Attackers simply incremented user IDs. A widely reported Grafana vulnerability followed the same pattern, allowing cross-organization access through manipulated identifiers (from authenticated users in a different organization).
What makes BOLA difficult to detect is that it does not behave like other vulnerabilities. Every request is authenticated. Every response is valid. There are no errors, no payloads, and no obvious anomalies. From the API’s perspective, everything appears to be working correctly.
BOLA only becomes visible when you test from the perspective of a different user. Detection depends entirely on context – specifically, whether the data returned belongs to someone else.
This guide covers the full methodology for detecting BOLA in practice, including manual testing workflows, authorization matrix construction, API-specific nuances, and how automated proof-based scanning validates real findings at scale.
Detecting BOLA requires testing whether an authenticated user can access objects that belong to another user by manipulating object identifiers in API requests. Because successful exploitation returns a normal 200 OK response with valid data, there is no signature to detect. Effective detection requires explicit cross-user testing with multiple authenticated sessions and a clear understanding of ownership boundaries.
Most vulnerability scanners look for abnormal behavior – malformed responses, error messages, or execution of injected payloads. BOLA produces none of these signals:
The only difference is who receives the data. This creates three structural challenges for testing:
Without multi-session context, automated tools cannot distinguish between legitimate and unauthorized access.
BOLA testing requires multiple real user accounts with distinct data ownership, ideally three or four:
These must be real application accounts with actual data. Fabricated or nonexistent identifiers can produce misleading 404 responses and hide authorization flaws.
Identify all endpoints that accept object identifiers, for instance:
/orders/{id}?userId=123{ "accountId": "abc" }user(id: "...")Where possible, derive this inventory from OpenAPI specifications. In their absence, build coverage from captured traffic or automated discovery using various API discovery methods. Mature teams continuously update this inventory as APIs evolve rather than treating it as a one-time exercise.
Use an intercepting proxy such as Burp Suite or OWASP ZAP:
Tools like Burp Autorize can automate cross-session replay and highlight differences between responses. These tools compare responses across sessions and can optionally include unauthenticated comparisons, but coverage still depends on the traffic you capture.
Document every endpoint that accepts identifiers, including parameter location and data type. This defines your test scope. In mature environments, this mapping is generated from OpenAPI specifications and maintained automatically as APIs change.
Interact with the application as User A and collect identifiers returned in API responses:
Trace how identifiers flow between endpoints. Many APIs pass identifiers from one response into subsequent requests, creating chains that must be tested end to end.
Replay requests using User B’s session:
GET /api/orders/USER_A_ORDER_ID
Authorization: Bearer USER_B_TOKENEvaluate responses carefully, since BOLA does not always present as a clear success or failure:
200 OK with full object data – confirmed BOLA200 OK with partial data – potential field-level authorization gap200 OK with empty or null data – possible silent authorization failure pattern403 or 404 – authorization enforcedA 200 OK with empty or null data does not always indicate correct behavior. Some APIs suppress unauthorized results instead of returning an error. If the same request returns populated data for the owning user but empty data for another user, this may indicate inconsistent authorization logic rather than proper enforcement.
The key is comparison across sessions. Always validate how the same request behaves for different users and follow up with write operations to confirm whether access control is consistently enforced.
BOLA is not limited to read operations. Test write and destructive actions:
DELETE /api/documents/USER_A_DOCUMENT_ID
Authorization: Bearer USER_B_TOKENAlso test multi-step workflows:
Many BOLA issues only appear in stateful workflows where authorization checks are inconsistent across steps.
Use lower-privilege accounts to access higher-privilege objects:
GET /api/admin/settings/ADMIN_ID
Authorization: Bearer USER_B_TOKENVertical BOLA is a form of vertical privilege escalation, where a lower-privilege user accesses resources belonging to a higher-privilege role. These issues often carry higher impact because they cross both ownership and privilege boundaries.
Test beyond simple ID substitution:
Also consider:
Security controls that obscure identifiers do not eliminate BOLA – they only make exploitation less obvious.
Ad hoc testing does not scale and is not consistent. An authorization matrix defines expected behavior across endpoints and user roles, showing at a glance who should be able to access what – and who should not. By mapping API operations against roles and expected responses, it turns implicit access control assumptions into an explicit, testable model that can be applied consistently across the entire API surface.
Here’s a basic authorization matrix:
This matrix serves two purposes:
Each cell where access should be denied becomes a test case.
In reality, the matrix isn’t created manually (which would be impractical anyway). Start from your OpenAPI or Swagger definition:
{id}, userId, accountId)For example:
paths:
/orders/{orderId}:
get:
parameters:
- name: orderId
in: pathThis becomes a row in your matrix. You then define expected responses per role, turning API design into an explicit authorization model.
Each matrix cell translates directly into a test:
GET /orders/{id} → expected 403DELETE /orders/{id} → expected 403This creates a complete and repeatable set of BOLA test cases across all endpoints and roles.
Mature AppSec teams use the matrix as a living artifact:
This ensures that new endpoints and code changes do not introduce silent authorization gaps.
The authorization matrix provides three key advantages:
This is the difference between ad hoc testing and a repeatable AppSec control. Instead of relying on manual exploration, teams can systematically validate that object-level authorization behaves as intended across the entire API surface.
GraphQL API testing introduces additional complexity because authorization is often implemented at the resolver or field level rather than at the endpoint level:
query {
user(id: "USER_A_ID") {
email
paymentMethods {
cardNumber
}
}
}Key risks include:
A query may correctly restrict access to the top-level object but still expose nested fields without validation. Effective testing requires validating each layer independently.
Use introspection to enumerate all queryable types and arguments, then systematically test cross-user access for both queries and mutations.
WebSocket APIs operate through persistent connections and message payloads rather than discrete HTTP requests. Detection requires:
Because connections are stateful, inconsistencies in authorization can occur across message sequences rather than individual requests.
In microservices architectures, authorization is often assumed rather than enforced. One service validates access, and downstream services trust that validation without re-checking ownership.
This creates gaps where internal services process requests without verifying authorization boundaries. Testing for this requires:
These issues are common in distributed systems and can persist unnoticed without targeted testing.
Traditional scanners detect anomalies – but BOLA produces none. Without multi-session context, they cannot identify cross-user access.
Tools like Burp Autorize replay requests using a second session and compare responses across users. They can optionally compare against unauthenticated responses to highlight differences. These tools are effective but limited:
Invicti’s API DAST scanner performs automated multi-session testing:
The key difference is validation. Instead of flagging every identifier-based endpoint as a “potential BOLA” risk, the scanner confirms which vulnerabilities are actually exploitable through cross-user testing.
This distinction is critical in practice. Pattern-based approaches generate large volumes of theoretical findings, while proof-based detection focuses on confirmed authorization failures that developers can immediately reproduce and fix. By reducing false positives, it aligns with a DAST-first approach that prioritizes validated risk over theoretical findings.
DELETE request to /api/dashboards/uid/{uid} with a valid dashboard UID. The API verified that the user was authenticated but failed to enforce organization-level ownership checks and treated cross-organization deletion requests as authorized without verifying ownership. This is a classic cross-tenant BOLA scenario where authentication is correct but object-level authorization is missing. A simple test using two accounts from different organizations and replaying the delete request with the same dashboard UID would have exposed the issue. Not all cross-user access indicates a vulnerability. Common false positives include:
A true BOLA exists only when access violates the intended ownership model. The key confirmation test is whether the application’s data model defines the resource as private to a user and that restriction fails in practice.
Manual testing can uncover BOLA vulnerabilities, but it does not scale across modern API environments with hundreds of endpoints and continuous deployment cycles.
Invicti’s proof-based BOLA detection automates multi-session testing, confirms exploitability with real request and response evidence, and integrates directly into development workflows. This allows teams to focus on fixing vulnerabilities that attackers can actually use rather than chasing theoretical risks.
Get a demo to see how automated BOLA detection works in practice on the Invicti Platform.
Use at least two authenticated users. Collect object identifiers from one user, then replay requests using another user’s session. If unauthorized access occurs, BOLA is confirmed.
For full BOLA detection coverage, use API DAST tools with multi-session testing capability such as Invicti. For semi-automated testing, tools like Burp Suite with Autorize can be used.
Horizontal BOLA involves cross-user access at the same privilege level. Vertical BOLA is vertical privilege escalation, where lower-privilege users access higher-privilege resources.
Because BOLA is a business logic flaw that produces no anomalies for a pattern-based scanner to recognize. Detection requires comparing responses across different authenticated users.
It is a structured model mapping endpoints to user roles and expected responses, used to generate systematic test cases.
Use introspection to identify queries and arguments, then test cross-user access at both object and field levels.
Public resources, admin visibility, aggregated data, and shared objects can appear as BOLA but reflect intended behavior.
Invicti uses stateful, multi-session API DAST to substitute identifiers across users and confirm unauthorized access with proof-based results.
