API Security
Test API endpoints for security vulnerabilities across REST, GraphQL, WebSocket, and LLM-integrated APIs.
Techniques
| Type |
Key Vectors |
| GraphQL |
Introspection, batching attacks, nested query DoS, field suggestion |
| REST API |
BOLA/IDOR, mass assignment, rate limiting, auth bypass, versioning |
| WebSocket |
Cross-site hijacking, message manipulation, auth flaws |
| Web-LLM |
Prompt injection via API, excessive agency, data exfiltration |
Workflow
- Discover API endpoints and documentation (Swagger, GraphQL schema)
- Map authentication and authorization mechanisms
- Test per API type using appropriate techniques
- Validate data exposure and access control flaws
- Capture evidence with HTTP request/response logs
API at scale (offline corpus / fixture-driven)
For a large or offline API surface — a 2000+ path Swagger, a Postman corpus, a HAR capture — do NOT hand-build the coverage machinery per engagement. Drive it deterministically:
- Ingest the corpus → per-endpoint fixtures:
python3 tools/fixture_ingest.py <openapi|postman|har> -o fixtures.json normalizes every operation into a request template (method, url with path params filled, sampled body, object_ref for id-like path params, security requirement) and STRIPS baked-in auth (the harness injects tokens). This is what turns a large (thousands-of-operations) OpenAPI/Postman corpus into a resumable matrix instead of an untested pile.
- Acquire per-role sessions: via
authenticated-session-acquisition (MFA/OTP/SRP → reusable tokens) into the harness's token store.
- Replay the per-role authz matrix:
python3 tools/auth_replay_harness.py --requests fixtures.json --tokens tokens.json [--proxy <vantage>] replays every endpoint under every role (and cross-tenant), flags BOLA/BFLA where a role got authorized on an object/action it should not, and logs an evidence_id per (endpoint × role). Egress-route via the provisioned vantage for allowlisted APIs.
- Protocol-specific authz: OData (
odata-deep-authz.md), Cognito (cognito-unauth-and-srp.md), authenticated WebSocket (authenticated-per-role-authz.md).
The batch is resumable (checkpoint the harness results) so flapping auth never zeroes the run — the recurring at-scale gap. Run the FULL matrix so a clean result is an evidenced negative, not an untested surface.
Reference
reference/graphql*.md - GraphQL attack techniques and labs
reference/scenarios/rest/*.md - REST API security testing (BOLA/BOPLA, mass assignment, SSPP, content-type confusion)
scenarios/rest/odata-deep-authz.md - OData $metadata enum + $filter/$orderby/$expand cross-tenant BOLA & injection
scenarios/rest/cognito-unauth-and-srp.md - Cognito UNSIGNED unauthenticated posture (self-signup/enumeration) + SRP authenticated session
reference/websockets*.md - WebSocket vulnerability testing
scenarios/websocket/authenticated-per-role-authz.md - authenticated per-role relay: BOLA/BFLA/channel-authz over the socket
reference/web-llm*.md - Web-LLM attack techniques and labs
1---2name: api-security3description: API security testing - GraphQL, REST API, WebSocket, and Web-LLM attack techniques.4---5
6# API Security
7
8Test API endpoints for security vulnerabilities across REST, GraphQL, WebSocket, and LLM-integrated APIs.
9
10## Techniques
11
12| Type | Key Vectors |
13|------|-------------|
14| **GraphQL** | Introspection, batching attacks, nested query DoS, field suggestion |
15| **REST API** | BOLA/IDOR, mass assignment, rate limiting, auth bypass, versioning |
16| **WebSocket** | Cross-site hijacking, message manipulation, auth flaws |
17| **Web-LLM** | Prompt injection via API, excessive agency, data exfiltration |
18
19## Workflow
20
211. Discover API endpoints and documentation (Swagger, GraphQL schema)
222. Map authentication and authorization mechanisms
233. Test per API type using appropriate techniques
244. Validate data exposure and access control flaws
255. Capture evidence with HTTP request/response logs
26
27## API at scale (offline corpus / fixture-driven)
28
29For a large or offline API surface — a 2000+ path Swagger, a Postman corpus, a HAR capture — do NOT hand-build the coverage machinery per engagement. Drive it deterministically:
30
311. **Ingest the corpus → per-endpoint fixtures:** `python3 tools/fixture_ingest.py <openapi|postman|har> -o fixtures.json` normalizes every operation into a request template (method, url with path params filled, sampled body, `object_ref` for id-like path params, security requirement) and STRIPS baked-in auth (the harness injects tokens). This is what turns a large (thousands-of-operations) OpenAPI/Postman corpus into a resumable matrix instead of an untested pile.
322. **Acquire per-role sessions:** via [`authenticated-session-acquisition`](../authenticated-session-acquisition/SKILL.md) (MFA/OTP/SRP → reusable tokens) into the harness's token store.
333. **Replay the per-role authz matrix:** `python3 tools/auth_replay_harness.py --requests fixtures.json --tokens tokens.json [--proxy <vantage>]` replays every endpoint under every role (and cross-tenant), flags BOLA/BFLA where a role got `authorized` on an object/action it should not, and logs an `evidence_id` per (endpoint × role). Egress-route via the provisioned vantage for allowlisted APIs.
344. **Protocol-specific authz:** OData ([`odata-deep-authz.md`](reference/scenarios/rest/odata-deep-authz.md)), Cognito ([`cognito-unauth-and-srp.md`](reference/scenarios/rest/cognito-unauth-and-srp.md)), authenticated WebSocket ([`authenticated-per-role-authz.md`](reference/scenarios/websocket/authenticated-per-role-authz.md)).
35
36The batch is resumable (checkpoint the harness results) so flapping auth never zeroes the run — the recurring at-scale gap. Run the FULL matrix so a clean result is an evidenced negative, not an untested surface.
37
38## Reference
39
40- `reference/graphql*.md` - GraphQL attack techniques and labs
41- `reference/scenarios/rest/*.md` - REST API security testing (BOLA/BOPLA, mass assignment, SSPP, content-type confusion)
42 - [`scenarios/rest/odata-deep-authz.md`](reference/scenarios/rest/odata-deep-authz.md) - OData `$metadata` enum + `$filter`/`$orderby`/`$expand` cross-tenant BOLA & injection
43 - [`scenarios/rest/cognito-unauth-and-srp.md`](reference/scenarios/rest/cognito-unauth-and-srp.md) - Cognito UNSIGNED unauthenticated posture (self-signup/enumeration) + SRP authenticated session
44- `reference/websockets*.md` - WebSocket vulnerability testing
45 - [`scenarios/websocket/authenticated-per-role-authz.md`](reference/scenarios/websocket/authenticated-per-role-authz.md) - authenticated per-role relay: BOLA/BFLA/channel-authz over the socket
46- `reference/web-llm*.md` - Web-LLM attack techniques and labs