
A penetration test is a controlled, authorised attack on your own application, carried out to find out what a real attacker could do. This checklist follows a web application penetration test from start to finish: 14 phases and 91 checks, from the rules of engagement to the retest.
Only test systems you own or have written permission to test.
Each check shows how it is usually carried out:
58 of the 91 checks can be automated in full or in part. The rest, including the rules of engagement, chaining findings and business logic, need a skilled tester.
Nothing is tested until these are agreed in writing.
| Check | How |
|---|---|
| Signed authorisation from the system owner, naming targets and dates | Manual |
| Scope: applications, APIs, environments, IP ranges and subdomains that are in and out | Manual |
| Test type agreed: black box (no knowledge), grey box (accounts and documentation) or white box (source code) | Manual |
| Techniques that are not allowed, such as denial of service or social engineering | Manual |
| Test accounts for every role, and at least two accounts at the same level | Manual |
| Testing windows, request-rate limits and an emergency contact on both sides | Manual |
| How sensitive data found during the test will be handled and reported | Manual |
| Backups confirmed; third-party providers (hosting, cloud, WAF) notified where their terms require it | Manual |
| What counts as success, and whether a retest is included | Manual |
Learn what an outside attacker could learn, without touching the target more than needed.
| Check | How |
|---|---|
| Enumerate domains and subdomains belonging to the target | Manual |
| Check DNS records for entries that point to services no longer in use | Automated |
| Search public code repositories and paste sites for leaked credentials and keys | Manual |
| Review archived and cached versions of the site for old endpoints | Manual |
| Identify the technology stack: server, framework, CMS, libraries and versions | Automated |
| Identify cloud assets such as storage buckets linked to the application | Automated + manual review |
| Note the presence of a WAF or CDN in front of the application | Automated |
| Check | How |
|---|---|
| Crawl the whole application while logged in as each role | Automated |
| Capture background API calls (XHR/fetch) and import API definitions | Automated |
| Record multi-step journeys: registration, checkout, approvals | Automated |
| List every entry point: parameters, headers, cookies, file uploads | Automated |
| Find hidden content: robots.txt, sitemap.xml, backups, admin paths, exposed API docs | Automated |
| Build a matrix of roles against functions, to drive the authorization tests | Manual |
| Identify high-value targets: payment, personal data, admin functions | Manual |
Cover the breadth quickly, so manual time goes on depth.
| Check | How |
|---|---|
| Run an authenticated scan of the web application | Automated |
| Run a scan of every API, using its definition or captured requests | Automated |
| Check all detected software versions against known CVEs | Automated |
| Confirm the scan stayed logged in and was not blocked by the WAF | Automated |
| Review coverage: which discovered URLs were and were not scanned | Automated + manual review |
| Triage the results; discard false positives before going deeper | Manual |
| Check | How |
|---|---|
| Default and weak credentials | Automated |
| Username enumeration through login, registration and password reset | Automated |
| Brute-force and lockout controls, within the agreed limits | Automated + manual review |
| Password reset: token strength, reuse, expiry, and host-header poisoning of reset links | Automated + manual review |
| Multi-factor authentication: can a step be skipped, replayed or brute-forced? | Manual |
| JWT handling: alg none, algorithm confusion, weak keys, kid and jku abuse | Automated |
| Session fixation, predictable session IDs and sessions that never expire | Automated |
| Session still valid after logout or password change | Manual |
| OAuth, OpenID Connect and SAML flows: state, redirect URI, signature checks | Automated |
Use the role matrix from step 3 and swap between accounts.
| Check | How |
|---|---|
| Read or change another user's objects by changing an ID (IDOR / BOLA) | Automated + manual review |
| Reach admin functions as a normal user (vertical escalation) | Automated + manual review |
| Open protected pages directly without the right role (forced browsing) | Automated |
| Bypass access rules by changing the HTTP method or path encoding | Automated |
| Add fields such as role or price to requests (mass assignment) | Automated |
| Cross tenant boundaries in multi-tenant applications | Manual |
| Use a lower-privilege token on higher-privilege API endpoints | Automated + manual review |
The scanner finds and evidences these; the tester shows what they allow.
| Check | How |
|---|---|
| SQL and NoSQL injection: prove data access with a harmless query | Automated + manual review |
| OS command and code injection | Automated + manual review |
| Server-side template injection | Automated + manual review |
| XML external entities (XXE) | Automated + manual review |
| SSRF: can internal services or cloud metadata be reached? | Automated + manual review |
| Insecure deserialization | Automated + manual review |
| File upload: can an uploaded file be executed or used for stored XSS? | Automated + manual review |
| Path traversal, local and remote file inclusion | Automated + manual review |
| HTTP request smuggling and cache poisoning | Automated + manual review |
| Known CVEs in the detected components: is a public exploit applicable? | Automated + manual review |
| Check | How |
|---|---|
| Cross-site scripting: show impact using a test account, such as reading the session | Automated + manual review |
| CSRF on state-changing actions: build a proof of concept | Automated + manual review |
| Clickjacking on sensitive actions | Automated + manual review |
| CORS misconfiguration: can another origin read authenticated data? | Automated + manual review |
| Open redirects, alone and chained with OAuth or SSRF | Automated + manual review |
| Sensitive data in browser storage, JavaScript or source maps | Automated |
| Prototype pollution and unsafe postMessage handling | Automated |
This is where a human tester adds the most.
| Check | How |
|---|---|
| Change prices, quantities, discounts or currency in requests | Automated + manual review |
| Skip, repeat or reorder steps in a workflow | Automated + manual review |
| Send the same request many times in parallel (race conditions) | Automated + manual review |
| Abuse limits: trials, referrals, vouchers, rate-limited actions | Manual |
| Use a feature for something it was not designed for | Manual |
| Check | How |
|---|---|
| Object-level and function-level authorization on every endpoint | Automated + manual review |
| Excessive data in responses | Automated + manual review |
| Missing rate limits and resource limits | Automated |
| GraphQL: introspection, deep or batched queries | Automated |
| Old or undocumented API versions with weaker controls | Automated + manual review |
| Check | How |
|---|---|
| Combine lower-severity findings into a realistic attack path | Manual |
| Demonstrate impact without damaging data or affecting real users | Manual |
| Stop and report immediately if a critical issue or real customer data is found | Manual |
| Stay inside the agreed scope, even when a finding leads outside it; record the lead instead | Manual |
| Check | How |
|---|---|
| Remove test accounts, uploaded files and test data | Manual |
| Restore any settings changed during the test | Manual |
| Remove temporary WAF allow-list entries | Manual |
| Keep a log of every action taken, with times | Manual |
| Check | How |
|---|---|
| Executive summary: overall risk in plain language | Manual |
| Each finding with severity (CVSS), evidence and steps to reproduce | Automated + manual review |
| Attack narratives for the chained findings | Manual |
| Remediation guidance for each finding | Automated + manual review |
| Mapping to the frameworks the client reports against (OWASP Top 10, PCI DSS, ISO 27001, SOC 2) | Automated |
| Debrief with developers and stakeholders | Manual |
| Check | How |
|---|---|
| Fix Critical and High findings first | Manual |
| Retest each fix against the live application | Automated |
| Run a full rescan to catch regressions | Automated |
| Scan continuously between penetration tests: on releases and on a schedule | Automated |
| Plan the next penetration test, usually once or twice a year and after major changes | Manual |
A vulnerability assessment is about breadth: find and rate every weakness you can. A penetration test is about depth: exploit the weaknesses that matter and show what they lead to. If you need the breadth-first version, use the web application vulnerability assessment checklist.
.vpscan archive that carries the whole scan to another tester's machine.A vulnerability assessment finds and rates as many weaknesses as possible. A penetration test goes further: it exploits weaknesses, chains them together and shows the real impact on the business.
Usually once or twice a year, and after major changes. Many compliance frameworks, including PCI DSS, expect regular testing. Automated scanning should run between tests.
No. A scanner covers known vulnerability classes quickly and consistently. A penetration tester finds business-logic flaws and chains issues in ways a tool cannot. They work best together.
Only with written permission from the system owner. Testing systems you do not own or are not authorised to test is illegal in most countries.
Try Vooki Pro free for 7 days
Cover the automated part of your next penetration test with Vooki Pro. The trial unlocks every feature for 7 days, and scanning runs on your own machine.
Related: Web application vulnerability assessment checklist · DAST vs SAST vs penetration testing: which do you need? · Penetration testing tools: what they are and why they matter