View all services
Talk to QA Advisor
Browse the Knowledge Hub56 resources
/Test Cases/OWASP Top 10 test cases

Test cases

OWASP Top 10 test cases, starting with the one that finds the most

Twenty eight cases covering broken access control on every method, privilege escalation through mass assignment and editable tokens, injection across every input surface, stored payloads rendered in admin views, credential stuffing, server side session invalidation, upload content inspection, server side request forgery, exposed secrets and hardening of the deployed configuration.

28cases/10risk categories/26high priority/FreeCSV download

All 28 test cases, ready to copy

Free to use and adapt, no sign-up. Download as CSV or Markdown, or copy it straight into your own tooling.

Last updated

28 worked examples

SEC-01

Request another account record by identifier

TypeSecurityPriorityHigh
Test data
Authenticate as one user and substitute another user record identifier in the request
Expected result
Refused, ideally with 404 so existence is not disclosed. This single check finds more real defects than every other case in the set combined.
SEC-02

Repeat the ownership check on every method

TypeSecurityPriorityHigh
Test data
The same foreign identifier used with GET, PATCH, PUT and DELETE
Expected result
All refused. An ownership check present on read and absent on write is extremely common because the read path is the one that gets tested.
SEC-03

Access an administrative function as a standard user

TypeSecurityPriorityHigh
Test data
Administrative routes and API endpoints requested directly with a standard credential
Expected result
Refused on the server. A function protected only by hiding its navigation is reachable by anyone who knows or guesses the path.
SEC-04

Escalate privilege through a client supplied field

TypeSecurityPriorityHigh
Test data
Add role, permissions, owner and account identifier to a profile update payload
Expected result
Server controlled fields are ignored or rejected. Mass assignment is the quietest privilege escalation because the request looks entirely legitimate.
SEC-05

Escalate privilege by editing a client side token or cookie

TypeSecurityPriorityHigh
Test data
A role value held in a cookie, a token payload or local storage, altered and replayed
Expected result
Refused. Authorisation is decided from server side state or a signed token whose signature is verified, never from a value the client can edit.
SEC-06

Inject into every input surface

TypeSecurityPriorityHigh
Test data
Query syntax in body fields, query string parameters, path segments, headers and a sort parameter
Expected result
Treated as literal data everywhere. Headers, path segments and sort parameters are the surfaces most often left unvalidated.
SEC-07

Detect injection through error and timing differences

TypeSecurityPriorityHigh
Test data
Payloads designed to produce a conditional response or a measurable delay
Expected result
No difference in behaviour or timing that reveals query structure, and no database error text reaches the response.
SEC-08

Store and render user content without executing it

TypeSecurityPriorityHigh
Test data
Script and event handler payloads in a name, a comment, a filename and a rich text field, then view them everywhere they appear
Expected result
Rendered as text in every location including admin views, notifications and exports. Output encoding is applied at render rather than only at input.
SEC-09

Reject an unsafe redirect target

TypeSecurityPriorityHigh
Test data
Redirect parameters pointing at an external host, a protocol relative URL and a script protocol
Expected result
Each refused against an allow list of internal paths, so a trusted domain cannot be used to launder a phishing destination.
SEC-10

Refuse a state changing request from another origin

TypeSecurityPriorityHigh
Test data
A form post from a third party page using a live session cookie
Expected result
Refused through an anti forgery token or an origin check, and the protection covers every state changing method rather than only the main form.
SEC-11

Restrict cross origin access correctly

TypeSecurityPriorityHigh
Test data
Preflight requests from a permitted origin, an unknown origin and a null origin
Expected result
Only permitted origins are reflected and credentials are never allowed alongside a wildcard, which is the configuration that undoes the whole policy.
SEC-12

Enforce password strength and check against known breaches

TypeSecurityPriorityHigh
Test data
A short password, a common one, one matching the email address, and one from a known breach list
Expected result
Each refused with useful guidance, and length is favoured over composition rules that push users toward predictable substitutions.
SEC-13

Resist credential stuffing and brute force

TypeSecurityPriorityHigh
Test data
Repeated failures on one account, then one attempt each against many accounts from one source
Expected result
Both are throttled. Per account lockout alone does not stop a spread attempt across many accounts, which is how stuffing actually runs.
SEC-14

Reveal nothing through authentication responses

TypeSecurityPriorityHigh
Test data
Sign in and password reset with a registered and an unregistered address
Expected result
Identical wording, identical status and comparable timing, so the endpoints cannot be used to enumerate accounts.
SEC-15

Handle password reset tokens safely

TypeSecurityPriorityHigh
Test data
Reuse a token, use an expired one, use one after requesting a newer one, and alter a character
Expected result
Each refused, existing sessions are invalidated on a successful reset, and the token is long and random rather than derived from account data.
SEC-16

Invalidate sessions on the server at sign out

TypeSecurityPriorityHigh
Test data
Capture the session token and refresh token, sign out, then replay both
Expected result
Both refused. A session cleared only in the browser is not invalidated, and the captured token continues to authorise every request.
SEC-17

Restrict file upload by content rather than extension

TypeSecurityPriorityHigh
Test data
A script renamed to a permitted extension, a file with a double extension, and a document containing an embedded payload
Expected result
Refused on content inspection, stored outside the web root with a generated name, and never served in a context where it could execute.
SEC-18

Refuse a server side request to an internal address

TypeSecurityPriorityHigh
Test data
A URL input pointing at localhost, a private range, a cloud metadata endpoint and a hostname that resolves to a private address
Expected result
Each refused after resolution rather than only by inspecting the string, so a public hostname resolving privately is also blocked.
SEC-19

Parse untrusted documents without resolving external entities

TypeSecurityPriorityHigh
Test data
An uploaded document declaring an external entity, and a deeply nested structure
Expected result
External entity resolution is disabled and nesting depth is bounded, so parsing cannot read local files or exhaust memory.
SEC-20

Deserialise only expected types

TypeSecurityPriorityHigh
Test data
A serialised payload declaring an unexpected type, and an oversized nested object
Expected result
Refused against an expected schema rather than reconstructing arbitrary types, and size and depth limits are enforced before parsing completes.
SEC-21

Leak nothing in error responses or client bundles

TypeSecurityPriorityHigh
Test data
Force a server error, then inspect responses, page source, source maps and client bundles
Expected result
No stack trace, query text, internal hostname, path or key. Client bundles and source maps contain no secret, which is where they most often appear.
SEC-22

Confirm no secret is committed or exposed in configuration

TypeSecurityPriorityHigh
Test data
Repository history, container images, build logs and any publicly reachable configuration path
Expected result
No credential or key is present, and any historic secret has been rotated rather than only removed from the current revision.
SEC-23

Enforce transport security everywhere

TypeSecurityPriorityHigh
Test data
A request over plain HTTP, one to an alternative port, and inspection of the certificate chain
Expected result
Redirected or refused, strict transport security is declared, and no page or asset is served insecurely on any path.
SEC-24

Set security response headers

TypeSecurityPriorityMedium
Test data
Inspect headers on a page, an API response and an error response
Expected result
Content type options, frame options or frame ancestors, referrer policy and a content security policy without an unsafe inline allowance for scripts.
SEC-25

Verify dependencies for known vulnerabilities

TypeSecurityPriorityHigh
Test data
The full dependency tree including transitive packages and base container images
Expected result
No known exploitable vulnerability in a reachable component, and the inventory is generated automatically rather than maintained by hand.
SEC-26

Confirm the deployed configuration is hardened

TypeSecurityPriorityHigh
Test data
Default credentials, directory listing, debug endpoints, admin consoles and verbose error modes
Expected result
Each disabled or removed in the deployed environment, and the check runs against the deployed configuration rather than the repository defaults.
SEC-27

Verify integrity of updates and third party code

TypeSecurityPriorityHigh
Test data
An externally hosted script, a package from an unexpected source, and an unsigned update artefact
Expected result
Third party code is pinned with integrity verification, packages resolve from the expected registry, and artefacts are signed and verified before use.
SEC-28

Log and alert on security relevant events

TypeSecurityPriorityHigh
Test data
Repeated failed sign ins, a privilege change, an authorisation refusal and an administrative action
Expected result
Each is logged with actor, timestamp and outcome, logs are tamper resistant and contain no credential, and the pattern raises an alert rather than sitting unread.

What goes in each field

ID

Required

Stable identifier, prefixed by module.

Test case

Required

What is being verified, in one line.

Type

Functional, negative, boundary, security, state, performance, accessibility or compatibility. Use it to check coverage is spread rather than clustered on the happy path.

Priority

Risk based. Anything that grants access to another account, escalates privilege, or exposes credentials or personal data is High. Run these only against systems you are authorised to test.

Test data

The specific values, including the invalid and boundary ones.

Expected result

Required

The precise observable outcome, including message text where the wording itself is the requirement.

How To Use This

Swap the identifier and send it again

Run these only against systems you are authorised to test. These four checks find the majority of real findings in a typical application.

Substitute another account identifier

Authenticate as one user, request another user record. This one check finds more genuine defects than everything else in the set combined, and it takes a minute.

Repeat it on write, not just read

Try the same foreign identifier with PATCH, PUT and DELETE. Ownership checks present on the read path and missing on writes are extremely common, because reads get tested.

Send the fields you should not own

Put role, permissions and owner into a profile update. Mass assignment is the quietest escalation available because the request looks completely legitimate in every log.

Keep the token, then sign out

Replay the session and refresh tokens afterwards. A session cleared only in the browser was never invalidated, and the captured token keeps working.

What Most Sets Miss

Why access control findings dominate

Broken access control is the largest category in practice and the cheapest to test, which is why it leads this set. The core test is trivial: authenticate legitimately, then reference a resource that belongs to somebody else. What makes it productive is repeating it across every HTTP method and every route, because the ownership check is usually written on the read path where it gets exercised, and quietly omitted on update and delete. The administrative variant is equally common: a function protected by hiding its navigation link is fully reachable by anyone who requests the path directly.

Privilege escalation rarely looks like an attack. Mass assignment sends a request that is valid in every respect except that it includes a field the client should not control, so it appears in logs as an ordinary profile update. The same applies to a role held in a cookie, a token payload or local storage: if authorisation is decided from a value the client can edit, then editing it is not exploitation so much as using the feature. Both are single request checks and both are frequently absent from test plans that cover injection thoroughly.

Injection testing usually covers the obvious surface and misses the rest. Body fields get tested because they are visible in the interface. Path segments, headers, and especially sort and filter parameters are commonly passed into queries unchecked, because they feel like internal plumbing rather than user input. Stored payloads need the same breadth on output: a script stored in a display name is often correctly encoded on the page where it was entered and rendered raw in an admin view, a notification email or an export, because encoding was applied at input in one place rather than at render everywhere.

Finally, a large share of real findings are configuration rather than code. Secrets in a repository history, in a container image, in a build log or in a client bundle with source maps published. Debug endpoints and verbose error modes left enabled in a deployed environment. Default credentials on a management console. Dependencies with known exploitable vulnerabilities in a reachable path. None of these require a clever payload, all of them are found by looking, and the check has to run against the deployed configuration rather than against what the repository says the configuration should be.

Suggest an improvement

Need penetration testing rather than a checklist?

QAble runs authorised security engagements combining manual testing with automated scanning, and reports findings with reproduction steps, impact and remediation guidance.

VAPT and penetration testing

More test case sets

View all

Test cases for a login page

Test cases
25 cases across functional, negative, boundary, security, session and accessibility paths, including account enumeration and lockout.

Test cases for a registration form

Test cases
28 cases covering validation, duplicate accounts, email verification, password rules and the enumeration leak most signup forms ship with.

Test cases for search functionality

Test cases
28 cases across relevance, partial and fuzzy matching, filters, pagination, empty states, injection attempts and performance under load.

Test cases for a shopping cart

Test cases
27 cases on quantity limits, price recalculation, stock changes, coupon stacking, guest to account merge and cart persistence.

Test cases for checkout and payment

Test cases
30 cases including 3D Secure, declines, timeouts, duplicate charges, idempotency, refunds and partial captures.

Test cases for file upload

Test cases
28 cases on size and type limits, spoofed content types, malicious filenames, progress, resume, virus scanning and storage limits.

Test cases for forgot password

Test cases
26 cases on reset token expiry, single use enforcement, session invalidation and the enumeration and rate limit gaps that are routine here.

Test cases for OTP verification

Test cases
26 cases on expiry, resend throttling, attempt limits, code reuse, delivery failure and the brute force window teams forget to close.

Test cases for user roles and permissions

Test cases
26 cases on horizontal and vertical privilege checks, direct object access, role changes mid-session and permission inheritance.

Test cases for form validation

Test cases
27 rules-based cases on required fields, length and numeric boundaries, client and server parity, hidden field tampering and error accessibility.

Test cases for a date picker

Test cases
26 cases on timezone shifts, ambiguous day and month order, impossible dates, min and max limits, leap years and keyboard operation.

Test cases for pagination

Test cases
24 cases on ordering stability, records changing mid-session, page size caps, deep offset cost, permission-filtered totals and state restore.

Test cases for push notifications

Test cases
26 cases on app states, deep link routing, token release on sign out, lock screen privacy, preferences, provider failures and platform differences.

Test cases for reports and data export

Test cases
25 cases on permission filtering in the file, spreadsheet formula injection, encoding, typed numbers and dates, row limits and audit logging.

Test cases for a chatbot

Test cases
28 cases on paraphrased intents, context, fallback loops, human handoff, policy grounding, prompt injection and data scoping.

Test cases for net banking transactions

Test cases
28 cases on duplicate debits from a retried request, concurrent transfers against one balance, daily limits across channels, beneficiary cooling periods, second factor binding and reconciliation.

Test cases for wallet and UPI payments

Test cases
28 cases on payments that time out with no response, idempotency on retry, racing balances, caps across devices, collect request fraud, mandates and refunds.

Test cases for insurance claim submission

Test cases
28 cases on coverage at the date of loss, waiting periods, deductibles and sub limits, exclusions and riders, duplicate claims and settlement reconciliation.

Test cases for patient records in an EHR

Test cases
28 cases on duplicate detection and merge, wrong patient entry, units of measure, allergy and interaction alerting, break glass access and audit of reads.

Test cases for CRM lead management

Test cases
28 cases on duplicate leads under concurrency, routing and the unrouted fallback, round robin races, territory visibility, conversion and bulk import.

Test cases for an ERP purchase order

Test cases
28 cases on approval thresholds, amendments that must reset approval, budget commitment races, over receipt tolerance, three-way match and duplicate invoices.

Test cases for OTT video playback

Test cases
28 cases on bitrate recovery after a dip, DRM renewal mid stream, concurrent stream limits and leaked slots, resume conflicts, ad cue points and offline expiry.

Test cases for game level progression

Test cases
28 cases on save corruption during a crash write, cloud save conflicts, offline queue replay, unlock gating, currency exploits and purchase restore.

Test cases for a REST API

Test cases
28 cases on status code correctness, cross tenant resource access, mass assignment, idempotent retries, cursor pagination, rate limits and contract drift.

Test cases for SSO and social login

Test cases
28 cases on linking an account on an unverified email, state and code replay, redirect allow lists, token signature and issuer, deprovisioning and session rotation.

Test cases for subscription and billing

Test cases
28 cases on mid cycle proration, duplicate and out of order webhooks, renewal double charges, dunning and grace, trials, coupons, metered usage and tax.

Test cases for data tables, filters and sorting

Test cases
28 cases on unstable sorts across pages, filters that must reset pagination, selection surviving a filter change, bulk action scope and export fidelity.

Test cases for session timeout and concurrent login

Test cases
28 cases on tokens that survive sign out, refresh token reuse, idle against absolute lifetime, multi tab expiry, session limits and remote revocation.

Test cases for a multi step form wizard

Test cases
28 cases on values lost to back navigation, refresh and session expiry, step skipping, server side revalidation, duplicate submission and conditional branches.

Test cases for email verification

Test cases
28 cases on token reuse and expiry, invalidating earlier links, account enumeration, header injection, safe address change and mail scanner prefetching.

Test cases for dashboards and analytics widgets

Test cases
28 cases on reconciling against source rows, widgets that disagree, timezone aggregation, zero baselines, no data shown as zero and permission leaks in aggregates.

Test cases for booking and reservation

Test cases
28 cases on concurrent bookings for the last slot, inventory holds that leak, payment without a booking, cancellation boundaries and channel sync.

Test cases for mobile app install and update

Test cases
28 cases on migration chains across skipped versions, crashes during post upgrade migration, forced update lockouts, deep links and clean reinstall.

Test cases for accessibility (WCAG 2.2 AA)

Test cases
28 cases on keyboard only completion, focus management, live region announcements, contrast, reflow at 320 pixels, target size and screen reader verification.

Test cases for performance and load

Test cases
28 cases on spikes with no ramp, recovery after peak, soak and leak detection, pool exhaustion, cold caches, retry storms and data correctness under load.

Test cases for cross browser compatibility

Test cases
28 cases on storage that throws in private mode, blocked third party cookies, engine date parsing, mobile viewport units, in app browsers and ad blockers.

Test cases for database and data integrity

Test cases
28 cases on uniqueness under concurrency, lost updates, counter races, orphaned rows, migration and backfill safety, replica lag and verified restores.

Test cases for localisation and multi language support

Test cases
28 cases on text expansion, concatenated sentences, plural rules, locale date parsing, decimal separators, right to left layout, collation and encoding.

Want your security posture proven, not assumed?

QAble covers access control, injection, authentication and configuration with certified security engineers. Start with a free security audit.

Talk to QA Advisor