Modern applications are APIs. The frontend is a thin client; authorization, data, and business logic live in the API layer — and that is where the risk lives.
No HTML links to crawl. Endpoints come from documentation (OpenAPI, GraphQL introspection), traffic capture, source code, or wordlist probing.
Per-endpoint, per-object — not per-page. Every request is independent and must be authorized on its own merits.
Bearer tokens (often JWTs), API keys, OAuth flows, mTLS. The token's contents and lifecycle matter as much as the request.
"The frontend hides this button" is not a control. The same API is reachable from a mobile app, a partner integration, or a raw curl.
OpenAPI / Swagger / GraphQL schema files are attack input (telling the tester what exists) and a defensive artefact when enforced server-side.
v1 and v2 often coexist with different security postures. Both are in scope.
/openapi.json, /swagger.json, /v1/api-docs, /redoc — sometimes leaked accidentally/api/v1/, /internal/, /v2/)is_admin: true on an update) with excessive data exposure (reading other users' private fields in responses).
These categories are a taxonomy for organising findings — not a sequential workflow for executing tests.
JWT is the most attack-rich authentication artefact in API testing. A correctly-implemented system validates all of these:
alg: none; reject algorithm changes in the headerHS256 accepted with the public RSA key as HMAC secret — crackable or forgeablehashcat -m 16500kid pointing to attacker-controlled file; jku pointing to attacker-controlled key URLTesting approach: intercept the real client in traffic; replay the authorization-code flow; probe each step with modified parameters.
Tools: oauth.tools, Postman; intercept the real client for production testing.
The structural failure: an authorization check that should run on every request fails to run on some.
GET /api/v1/users/{id} may authorize correctly; GET /api/v1/users/{id}/preferences may not. Sub-resources are a classic gap.
DELETE and UPDATE analogues; test the same auth controls as REST write operationsTools: graphql-cop, clairvoyance, InQL, Burp GraphQL extensions.
The transport (HTTP/2 + protobuf) does not change the underlying authorization or business-logic risks — only the discovery problem is harder.
Tools: Burp WebSocket support, websocat.
Platforms: Kong, AWS API Gateway, Azure API Management, Apigee, Tyk.
| Category | Tools |
|---|---|
| Interception / proxy | Burp Suite Professional (with API extensions), mitmproxy, OWASP ZAP, Caido |
| API-aware fuzzing | ffuf, Burp Intruder, Postman + Newman (scripted), kiterunner (content discovery) |
| JWT | jwt_tool, Burp JWT Editor |
| GraphQL | graphql-cop, clairvoyance, InQL, Burp GraphQL extensions |
| gRPC | grpcurl, evans, Postman gRPC |
| OpenAPI-driven | 42Crunch (commercial), Spectral (linting), Schemathesis (property-based) |
| OAuth | oauth.tools, Postman; intercept the real client for production |
| Auth comparison | Burp Autorize, Burp AuthMatrix |
| WebSocket | Burp WebSocket support, websocat |
A REST API has 200 endpoints. You have a low-privileged test account. How do you systematically test for BOLA across the surface — without 200 individual manual tests?
Identify endpoint patterns from documentation or traffic. For each pattern, locate the object ID parameter. Script a comparison test: vary only the ID across two accounts and record the response. Rank by response divergence — identical responses indicate a possible BOLA. Manually inspect divergent cases. Tools like Autorize / AuthMatrix automate the multi-account comparison and flag discrepancies automatically.
Master the API layer and you master the most consequential attack surface in modern application security.