Strobesstrobes
Platform
Solutions
Resources
Customers
Company
Pricing
Book a Demo
Strobesstrobes

Strobes connects every exposure signal to autonomous action, so security teams fix what matters, prove what works, and stop chasing noise.

Book a DemoTalk to an expert
ISO 27001SOC 2CREST
  • Platform
  • Platform Overview
  • Agentic Exposure Management
  • AI Agents
  • Integrations
  • API & Developers
  • Workflows & Automation
  • Analytics & Reporting
  • Solutions
  • Exposure Assessment (EAP)
  • Attack Surface Management
  • Application Security Posture
  • Risk-Based Vulnerability Management
  • Adversarial Exposure Validation (AEV)
  • AI Pentesting
  • Pentesting as a Service
  • CTEM Framework
  • By Industry
  • Financial Institutions
  • Technology
  • Retail
  • Healthcare
  • Manufacturing
  • By Roles
  • CISOs
  • Security Directors
  • Cloud Security Leaders
  • App Sec Leaders
  • Resources
  • Quick Agentic Pentest
  • Blog
  • Customer Stories
  • eBooks
  • Datasheets
  • Videos & Demos
  • Exposure Management Academy
  • CTEM Maturity Assessment
  • Pentest Health Check
  • Security Tool ROI Calculator
  • Company
  • About Strobes
  • Meet the Team
  • Trust & Security
  • Contact Us
  • Careers
  • Become a Partner
  • Technology Partner
  • Partner Deal Registration
  • Press Release

Weekly insight for security leaders

CTEM research, agentic AI trends, and what's actually moving the needle.

© 2026 Strobes Security Inc. All rights reserved.

Privacy PolicyTerms of ServiceCookie PolicyAccessibilitySitemap
Back to Blog
API Penetration Testing Checklist
Application SecurityPenetration Testing

API Penetration Testing Checklist

Likhil ChekuriNovember 11, 20246 min read

Table of Contents

  • What does the checklist cover, and why this order?
  • Discovery: you can only test what you can see
  • How do you test authentication and JWT handling?
  • How do you test authorization (BOLA and BFLA)?
  • How do you test input handling and business logic?
  • Findings, fixes, and the rate-limit phase
  • Frequently asked questions
  • Sources and references

Authors

L
Likhil Chekuri

Share

Table of Contents

  • What does the checklist cover, and why this order?
  • Discovery: you can only test what you can see
  • How do you test authentication and JWT handling?
  • How do you test authorization (BOLA and BFLA)?
  • How do you test input handling and business logic?
  • Findings, fixes, and the rate-limit phase
  • Frequently asked questions
  • Sources and references

Authors

L
Likhil Chekuri

Share

TL;DR
  • ✓Order is the whole point: Discovery feeds Authentication, which feeds Authorization, which feeds Input, Logic, and Rate limiting. Skip a phase and the next one guesses.
  • ✓Authorization is where the money is. Test BOLA and BFLA with two or more accounts on every object and admin endpoint.
  • ✓Build a complete inventory first, including old versions and undocumented routes, before sending a single payload.
  • ✓Confirm every finding with a paired request and response. A 200 to the wrong principal is your proof, not a tool alert.
  • ✓Map each test to an OWASP API Security Top 10 (2023) category and pair it with a config-level fix, not 'use strong passwords'.

The order you test an API in decides what you find, and most checklists get it wrong by organizing around tools instead of phases. You cannot test authorization before you have an endpoint inventory, and you cannot tell a real BOLA from an expired session before you understand the auth model. So this checklist runs in six dependent phases, each handing structured output to the next: Discovery, Authentication, Authorization, Input, Business logic, and Rate limiting.

Every item maps to the OWASP API Security Top 10 (2023), the taxonomy that ranks Broken Object Level Authorization as the number-one API risk. Below you get the full checklist as a working document, then the requests and command output that prove each phase, a report-style findings table, and the configuration changes that actually close the gaps.

Table of contents
  1. What does the checklist cover, and why this order?
  2. Discovery: you can only test what you can see
  3. How do you test authentication and JWT handling?
  4. How do you test authorization (BOLA and BFLA)?
  5. How do you test input handling and business logic?
  6. Findings, fixes, and the rate-limit phase

What does the checklist cover, and why this order?

Six phases, each targeting a different slice of the OWASP API Top 10, run in strict dependency order. Discovery builds the attack surface. The two auth phases catch the most damaging access-control bugs. Input and logic catch injection and abuse. Rate limiting catches resource exhaustion.

The sequence is not cosmetic. Discovery hands Authorization a list of object-bearing endpoints to attack; Authentication hands it the tokens to attack them with. Reverse the order and you waste a day fuzzing inputs on a route that turns out to be unauthenticated anyway. The checklist below is the short form, where each item is something you actively send a request to verify, never a box you tick from documentation. Pair it with the fundamentals of API pentesting and the OWASP API methodology for the reasoning behind each test.

API penetration testing checklist by phase
Discovery
  • ✓Import OpenAPI/Swagger and Postman collections
  • ✓Proxy web + mobile clients (Burp / mitmproxy)
  • ✓Brute-force routes with ffuf / Kiterunner (right verb)
  • ✓Find old versions and exposed docs (API9)
Authentication (API2)
  • ✓JWT: alg:none, signature strip, weak HMAC secret
  • ✓Test lockout, token reuse, and expiry
  • ✓Check OAuth flows and refresh-token handling
Authorization (API1 / API5)
  • ✓BOLA: swap object IDs across two accounts
  • ✓BFLA: call admin functions as a low-priv user
  • ✓Run Burp Autorize across two roles, both directions
Input (API3)
  • ✓SQLi / NoSQLi on every parameter and JSON key
  • ✓Mass-assign hidden fields (role, tenantId, balance)
  • ✓Excessive data exposure in responses
  • ✓SSRF on URL/host/file parameters
Business logic
  • ✓Tamper price, quantity, and coupon fields
  • ✓Skip steps in multi-stage flows
  • ✓Race concurrent requests on shared state
Rate limiting (API4)
  • ✓Brute login/OTP/reset for 429 or lockout
  • ✓Request oversized pages and payloads
  • ✓Test GraphQL query depth and alias/batch limits

Discovery: you can only test what you can see

Enumerate every endpoint, version, and parameter the backend accepts, from documented and undocumented sources alike, because old versions (API9) are a frequent foothold. Record three things per endpoint: the HTTP method, whether it takes an object ID in the path or body, and whether it requires authentication. Object-bearing endpoints are your BOLA candidates, admin-looking 403s are your BFLA worklist, and unauthenticated state-changers are immediate findings.

The fastest way to surface the undocumented surface is to fuzz with an API-aware tool that fires the correct method, then diff against the spec:

$ kr scan https://api.target.com -w routes-large.kite

GET    200  /api/v2/users/me
GET    403  /api/v2/admin/users            # <- exists, gated: BFLA target
POST   200  /api/v2/internal/users         # <- undocumented, writable: chase this
GET    401  /api/v1/accounts/{id}          # <- old version still live: API9

The 403 and the undocumented 200 are the lines that matter. A path-only fuzzer firing GETs would mark that POST route as 405 and discard it; Kiterunner finds it because it replays Assetnote's route database with the right verb. The most common mistake in this phase is testing only what the client documents, so always diff live mobile traffic against the OpenAPI file and chase every delta.

How do you test authentication and JWT handling?

Attack the token before you attack the data, because a token the server mis-validates is a master key. JWTs fail in a handful of repeatable ways, each with a direct test: alg:none acceptance, an unverified signature (flip a byte, look for 200), kid injection for key confusion, and a weak HMAC secret. The last one is mechanical once you capture a token:

$ hashcat -a 0 -m 16500 token.jwt rockyou.txt   # -m 16500 = JWT

eyJhbGciOiJIUzI1NiJ9...<snip>:Summer2021!        # <- secret cracked
Status...........: Cracked

With the secret you re-sign the token carrying "role":"admin" and replay it. Then test the boring failures that matter just as much: no account lockout after repeated failures, tokens reused across services, and tokens that never expire. jwt_tool automates the alg and kid checks so you spend your time on the claims worth tampering with.

How do you test authorization (BOLA and BFLA)?

This is the core of the engagement, and it needs at least two accounts, ideally at two privilege levels. Authorization is where BOLA (API1) and BFLA (API5) live, the bugs behind the largest API breaches. The technique is simple: replay the same request as a different principal and watch the status code.

PUT /api/v1/users/501/email HTTP/1.1
Authorization: Bearer <low-priv-user-token>   # token for user 88, not 501
Content-Type: application/json

{ "email": "attacker@evil.com" }

--- response ---
HTTP/1.1 200 OK                               # <- expected 403: you just took over user 501

The telltale is a 200 or 204 where a 403 belongs. To run this across hundreds of requests without hand-replaying each one, Burp's Autorize extension does the two-account diff for you:

[Autorize] replaying with second account's token...

 GET  /api/v1/orders/1043     Bypassed!     # <- BOLA confirmed
 GET  /api/v1/users/501       Enforced      # 403 as it should be
 DELETE /api/v1/admin/users/77 Bypassed!    # <- BFLA confirmed

Every "Bypassed!" row is a finding. Always test both directions: low-to-high (a standard user reaching an admin function) and lateral (user A reaching user B's object).

Strobes insight
If you have time for only one phase, do authorization with two accounts. BOLA and BFLA are the most common critical findings on API engagements, and no automated scanner reliably catches either one.

How do you test input handling and business logic?

Test every parameter for injection and mass assignment, then attack the workflow itself. APIs trust the request body, so the property level (BOPLA, API3) is rich ground. For breadth, drive the spec through Schemathesis to flush out 500s and contract breaks before you go hunting by hand:

$ schemathesis run https://api.target.com/openapi.json \
    --checks all -H "Authorization: Bearer <token>"

FAILED  GET /api/v1/search   status_code_conformance  # 500 on empty q
FAILED  POST /api/v1/orders  response_schema           # leaks internal_cost field
2 passed, 2 failed                                     # <- both worth manual follow-up

Then go manual where judgment is required:

  • Mass assignment: diff a write response against the documented model, then add the fields the model has but the request omitted: role, isAdmin, tenantId, verified, credit. If the server echoes your value, it bound it. See mass assignment attacks.
  • Excessive data exposure: inspect responses for hashes, internal IDs, and PII the UI hides.
  • SSRF: any parameter taking a URL, host, or file path.
  • Logic: tamper price, quantity, and coupon fields; skip steps (jump to /checkout/confirm); race concurrent requests against one balance using Repeater's parallel send or Turbo Intruder's single-packet attack.

A coupon that survives ten simultaneous redemptions is a logic bug worth real money, and no scanner will ever construct that test.

Findings, fixes, and the rate-limit phase

The last phase confirms that sensitive and expensive endpoints enforce throttling, pagination caps, and payload limits, because missing limits (API4) enable credential stuffing, enumeration, and denial of service. Hammer login, OTP, password-reset, and search for any 429 or lockout; request oversized pages with ?limit=1000000; send deeply nested or aliased GraphQL queries to probe cost limits. The catch every scanner misses: a per-IP limit looks fine to DAST but falls to a rotating X-Forwarded-For or a GraphQL alias batch, so test the limit by identity.

On a recent assessment of a logistics SaaS, the API looked tidy until the rate-limit phase: their password-reset endpoint had no per-identity throttle, so we enumerated valid accounts at thousands of requests per minute, then chained that into a BOLA on shipment records to map their entire customer list. Each gap below pairs with a config fix, not advice. The table is what a report excerpt looks like.

For teams that want this running continuously instead of once a year, our agentic pentesting approach automates the repetitive discovery and rate-limit checks so testers focus on logic.

Findings table (report excerpt)
FindingSeverity (CVSS)EvidenceFix
BOLA on PUT /users/{id}/emailCritical (9.1)User 88 token changed user 501 email, HTTP 200Ownership check in controller, not gateway
JWT weak HMAC secretCritical (9.8)hashcat -m 16500 recovered 'Summer2021!'Rotate to RS256; 256-bit random secret
Mass assignment of roleHigh (8.1)Injected role:admin echoed in 200 responseAllow-list writable properties
No throttle on /auth/resetHigh (7.5)Account enumeration at thousands req/minPer-identity rate limit + generic responses
Old /api/v1/ live with weak authMedium (6.5)Deprecated path returned data v2 blocksDecommission; inventory all versions (API9)

Frequently asked questions

What should be on an API penetration testing checklist?
At minimum: endpoint discovery and inventory, authentication tests (JWT and token handling), authorization tests for BOLA and BFLA across multiple accounts, input and injection tests including mass assignment, business-logic tampering, and rate-limit checks. Each item should map to an OWASP API Security Top 10 (2023) category and carry a config-level fix.
How many accounts do you need for an API pentest?
At least two accounts of the same role to test BOLA, and ideally accounts at different privilege levels to test BFLA. Without a second principal you cannot prove that one user reaches another user's objects or functions, which are the highest-impact findings. More roles means more coverage of the authorization matrix.
What is the difference between BOLA and BFLA?
BOLA (API1) is about data: a user reaching another user's object by changing an ID. BFLA (API5) is about functionality: a low-privilege user invoking an admin or elevated function. Both are authorization failures, just at different levels, and a good checklist tests both directions explicitly.
How do you test JWT security in an API?
Test whether the server accepts alg:none, whether it verifies the signature at all (flip a byte and look for 200), whether the kid header can be manipulated for key confusion, and whether a weak HMAC secret cracks with hashcat mode 16500. Also check expiry, reuse across services, and whether claims like user_id or role can be tampered with.
How do you find hidden API endpoints?
Combine spec diffing (documented endpoints versus live traffic), proxy capture from web and mobile clients, and route brute-forcing with ffuf or Kiterunner against API-specific wordlists using the correct HTTP method. Always probe older versions like /api/v1/ and exposed docs such as /swagger.json and /openapi.json.
Why do scanners miss authorization bugs?
A DAST scanner has no concept of tenancy or ownership, so it cannot tell that a 200 returned someone else's object. BOLA and BFLA require comparing responses across two authenticated principals, which is judgment a scanner does not have. That is why two-account authorization testing is mandatory and cannot be skipped.

Sources and references

  • OWASP API Security Top 10 (2023)
  • Kiterunner (Assetnote)
  • PortSwigger Autorize
L
Likhil Chekuri
Application Security Engineer, Strobes
Likhil Chekuri is an AppSec engineer at Strobes who has run hundreds of web, mobile, and cloud penetration tests for regulated industries.
Tags
API SecurityPenetration TestingChecklist

Stop chasing vulnerabilities Start reducing exposure

See how Strobes AI agents validate and fix your most critical exposures automatically.

Book a Demo
Continue Reading

Related Posts

Vulnerability validation: why most of your scanner backlog is noise - Strobes
Exposure ValidationApplication Security

Vulnerability Validation: Why Most of Your Scanner Backlog Is Noise

Vulnerability validation proves which scanner findings are real, reachable, and exploitable. Why manual triage fails and how agentic validation scales.

Jun 9, 202619 min
How to pentest single-page applications - React, Angular and Vue SPA security testing guide
Penetration TestingApplication Security

How to Pentest Single-Page Applications (React, Angular, Vue)

Learn how to pentest React, Angular, and Vue SPAs. Covers DOM XSS, client-side routing bypass, JS bundle secrets, and why traditional DAST scanners fail.

Jun 4, 202623 min
Bug bounty vs pentesting vs AI pentesting comparison featured image
Penetration TestingApplication Security

Bug Bounty vs. Pentesting vs. AI Pentesting: Which Model Fits Your AppSec Program?

Bug bounty vs pentesting vs AI pentesting: compare costs, coverage, compliance, and when to use each model. Build a layered AppSec testing strategy.

Jun 4, 202621 min