Web App Pentest Roadmap — OWASP Top 10
Version: 1.0 Reference: OWASP Top 10 (2021) Scope: Full web application — from recon to reporting
Legend
| Symbol | Meaning |
|---|---|
| ✅ | Safe to run in production |
| ⚠️ PROD-WARNING | Risk in production — use a staging/test environment |
| 🔴 PROD-FORBIDDEN | Never run in production without explicit written authorization |
| 🛠️ | Recommended tooling |
Phase 0 — Preparation & Scope
Before a single request is sent, the legal and technical boundaries must be locked in.
- [ ] Written authorization (Rules of Engagement) signed
- [ ] Scope defined: domains, IP ranges, out-of-scope endpoints
- [ ] Test environment identified (staging vs. production)
- [ ] Client contact person available during the test
- [ ] Burp Suite Pro configured (proxy, scope filter, upstream proxy if needed)
- [ ] VPN/connection to the target network active if applicable
- [ ] A notes structure set up (e.g. Obsidian, MkDocs draft)
Phase 1 — Reconnaissance & Mapping
1.1 Passive Reconnaissance (OSINT)
✅ Safe — no direct interaction with the target environment
- [ ] WHOIS lookup of domains and IP ranges
- [ ] DNS enumeration: A, MX, TXT, SPF, DMARC, CAA records
- [ ] Subdomain discovery via
subfinder,amass,dnsx, SecurityTrails - [ ] Certificate Transparency logs (
crt.sh) - [ ] Google Dorks:
site:,inurl:,filetype:,intitle: - [ ] Shodan / Censys: open ports, banners, TLS information
- [ ] Wayback Machine / web archive: historical endpoints and parameters
- [ ] GitHub/GitLab dorking: leaked credentials, API keys, internal code
🛠️ subfinder, amass, dnsx, gau, waybackurls, SecurityTrails, Shodan
1.2 Active Mapping
⚠️ PROD-WARNING — Increased network traffic visible in logs
- [ ] Crawl the application via Burp Suite Spider / OWASP ZAP
- [ ] Directory and file enumeration:
ffuf,feroxbuster,gobuster - [ ] JavaScript analysis: extract endpoints, API routes, tokens
- Tools:
LinkFinder,JSParser, manually in DevTools - [ ] Technology fingerprinting: frameworks, CMS, libraries, versions
- Tools:
Wappalyzer,whatweb, Burp response headers - [ ] API schema discovery:
/api/docs,/swagger.json,/openapi.yaml, GraphQL introspection - [ ] Test HTTP methods per endpoint (OPTIONS, PUT, DELETE, PATCH)
- [ ] Analyze sitemap.xml and robots.txt
🛠️ Burp Suite Pro, ffuf, feroxbuster, LinkFinder, whatweb
Phase 2 — A01: Broken Access Control
OWASP #1 — The most common critical vulnerability
2.1 Horizontal Privilege Escalation (IDOR)
✅ Testable in production provided you use your own test accounts
- [ ] Identify object references in URLs, POST bodies, cookies (IDs, UUIDs, slugs)
- [ ] Swap your own ID for another user's
- [ ] Test both sequential and UUID-based identifiers
- [ ] Check whether API responses leak data not shown in the UI
2.2 Vertical Privilege Escalation
✅ Testable with your own accounts at different roles
- [ ] Test admin endpoints from a low-privilege account
- [ ] Force-browse to
/admin,/dashboard,/config,/manage - [ ] Remove or manipulate role-based parameters in requests
- [ ] Test whether UI-based restrictions are also enforced server-side
2.3 Access Control on HTTP Methods
✅ Testable in production
- [ ] Try write operations (PUT, DELETE, PATCH) on read-only endpoints
- [ ] Test whether
HEADrequests expose filtered data
2.4 Path Traversal / Directory Traversal
⚠️ PROD-WARNING — Can read the filesystem; be careful with payloads
- [ ] Test file references in parameters:
?file=,?path=,?include= - [ ] Payloads:
../../etc/passwd,....//....//etc/passwd, URL-encoded variants - [ ] Test Windows paths where applicable:
..\..\windows\system32\ - [ ] Check for ZIP-slip in upload functionality
🛠️ Burp Intruder, ffuf, PortSwigger path traversal labs
Phase 3 — A02: Cryptographic Failures
✅ Largely observational — safe in production
- [ ] Check the TLS version and cipher suites via
testssl.shor SSL Labs - Look for: SSLv3, TLS 1.0/1.1, RC4, NULL ciphers, EXPORT ciphers
- [ ] Check the HSTS header is present and configured correctly
- [ ] Mixed content: HTTP resources on HTTPS pages
- [ ] Sensitive data in URL parameters (passwords, tokens, session IDs)
- [ ] Sensitive data in browser history, logs, referer headers
- [ ] Passwords stored in plaintext (test via account reset flows)
- [ ] Cookies: is the
Secureflag present on sensitive cookies - [ ] Weak hashing: MD5/SHA1 for passwords (check via data breaches or error messages)
- [ ] JWT analysis:
alg: none, weak secrets, RS256→HS256 algorithm confusion
🛠️ testssl.sh, SSL Labs, jwt_tool, Burp Suite, hashid
Phase 4 — A03: Injection
4.1 SQL Injection
⚠️ PROD-WARNING — Destructive payloads (DROP, DELETE) are forbidden in production
- [ ] Identify every input point: forms, URL params, headers, cookies, JSON body
- [ ] Test for error messages with
',",--,# - [ ] Check for blind SQLi via time-based:
'; WAITFOR DELAY '0:0:5'-- - [ ] Boolean-based blind:
' AND 1=1--vs' AND 1=2-- - [ ] Out-of-band SQLi (DNS exfil via Burp Collaborator)
- [ ] Test for ORM injections (HQL, JPQL, LINQ)
- [ ] Automated scan with sqlmap (staging only)
🔴 PROD-FORBIDDEN — sqlmap --dump, DROP TABLE, DELETE FROM in production
🛠️ Burp Intruder, sqlmap (staging), manual payloads
4.2 Command Injection
🔴 PROD-FORBIDDEN — Never run destructive OS commands in production
- [ ] Test input points that invoke OS functions (ping, nslookup, file conversion)
- [ ] Payloads:
; id,| whoami,`id`,$(id) - [ ] Out-of-band detection via Burp Collaborator (DNS/HTTP pingback)
- [ ] Blind command injection via time delay:
; sleep 5
⚠️ PROD-WARNING — OOB detection via Collaborator is safe; direct command execution is not
4.3 LDAP / XML / XPath Injection
⚠️ PROD-WARNING — Test with non-destructive payloads
- [ ] LDAP:
*)(uid=*))(|(uid=* - [ ] XML/XPath injection in SOAP/XML APIs
- [ ] XXE (see also A05 below)
Phase 5 — A04: Insecure Design
✅ Largely architectural — safe to observe
- [ ] Analyze business logic flows (order processes, discount codes, balances)
- [ ] Test rate limiting on critical functions (login, password reset, OTP)
- [ ] Check for multi-step process bypass (reaching step 2 without step 1)
- [ ] Test for "negative price" or integer overflow in e-commerce
- [ ] Analyze the threat model: is defense-in-depth missing?
- [ ] Check whether sensitive functions are only reachable via the UI flow or also directly via the API
Phase 6 — A05: Security Misconfiguration
✅ Observational — safe in production
- [ ] Test default credentials on management interfaces (admin/admin, admin/password)
- [ ] Unnecessary HTTP headers:
Server,X-Powered-By,X-AspNet-Version - [ ] Missing security headers:
Content-Security-PolicyX-Frame-Optionsorframe-ancestorsX-Content-Type-OptionsReferrer-PolicyPermissions-Policy- [ ] CORS misconfiguration: wildcards, reflection of
Origin,nullorigin - [ ] Directory listing active on the web server
- [ ] Error pages: stack traces, DB versions, internal paths visible
- [ ] Cloud storage: publicly accessible S3 buckets, Azure Blob containers
- [ ] Debug mode active (
?debug=true,FLASK_ENV=development) - [ ] Hidden admin interfaces via directory enumeration (see Phase 1.2)
XXE (XML External Entities)
⚠️ PROD-WARNING — Use OOB techniques, no file-reading payloads in production
- [ ] Identify XML-processing endpoints
- [ ] Test with an external entity pointing to Burp Collaborator
- [ ] Test for SSRF via XXE (
<!ENTITY xxe SYSTEM "http://169.254.169.254/">)
🛠️ Burp Suite, nuclei (misconfig templates)
Phase 7 — A06: Vulnerable and Outdated Components
✅ Safe to run — purely informational
- [ ] Inventory all client-side libraries (JavaScript): versions via DevTools / Wappalyzer
- [ ] Check npm/yarn lock files if available (e.g. via GitHub)
- [ ] Server-side frameworks: version from headers, error pages or
/readme,/changelog - [ ] Compare versions against CVE databases: NVD, Snyk, OSV
- [ ] CMS-specific: WordPress plugin/theme versions, Drupal modules
- [ ] Check for known exploits for the identified versions
🛠️ retire.js, npm audit, Snyk, wappalyzer, NVD
Phase 8 — A07: Identification and Authentication Failures
✅ Testable with your own accounts in production
- [ ] Password policy: minimum complexity, maximum length
- [ ] Account lockout after X failed attempts
- [ ] Username enumeration via error messages or timing differences
- [ ] The "forgot password" flow: token length, validity, reuse
- [ ] MFA implementation: bypass via response manipulation, code reuse
- [ ] "Remember me" functionality: token analysis, lifetime
- [ ] OAuth2/OIDC flows: is the state parameter present, token leakage via referer
Session Management
- [ ] Session token entropy and length (minimum 128 bit)
- [ ] Session invalidation on logout (server-side)
- [ ] Session invalidation on password change
- [ ] Session fixation: does the token change after login?
- [ ] Cookie attributes:
HttpOnly,Secure,SameSite
🛠️ Burp Suite, ffuf (credential stuffing on staging), jwt_tool
Phase 9 — A08: Software and Data Integrity Failures
9.1 File Upload
⚠️ PROD-WARNING — Don't upload real web shells; use EICAR or harmless PoCs
- [ ] Check which file types are accepted
- [ ] Bypass the content-type check: change the
Content-Typeheader - [ ] Double extension:
shell.php.jpg,shell.php%00.jpg - [ ] Magic bytes manipulation
- [ ] Upload to a publicly accessible location?
- [ ] Filename sanitization (path traversal via filename)
- [ ] SVG upload: embedded XSS or SSRF
🔴 PROD-FORBIDDEN — Do not upload functional web shells in production
9.2 CI/CD & Supply Chain
✅ Observational
- [ ] Check whether CDN resources are loaded with SRI hashes
- [ ] Analyze whether external packages are pinned to specific versions
- [ ] Look for insecure deserialization indicators (Java serialized objects, pickle, PHP serialize)
Phase 10 — A09: Security Logging and Monitoring Failures
✅ Safe to test — observational
- [ ] Deliberately generate failed login attempts — do you get an alert?
- [ ] Check whether suspicious activity (SQLi strings, XSS) is logged
- [ ] Look for sensitive data in logs (passwords, tokens, PII)
- [ ] Check the availability of
/logs,/log,/debug,/traceendpoints - [ ] Are error messages low on information for users (no stack traces)?
- [ ] Is there a demonstrable incident response process?
Phase 11 — A10: Server-Side Request Forgery (SSRF)
⚠️ PROD-WARNING — Use Burp Collaborator for OOB detection; don't run internal scans in production
- [ ] Identify parameters that process URLs or hostnames (
url=,webhook=,redirect=,load=,fetch=) - [ ] Test for internal network access:
http://127.0.0.1,http://localhost - [ ] Cloud metadata endpoint:
http://169.254.169.254/latest/meta-data/ - [ ] SSRF via indirect inputs: PDF generators, image processors, import functions
- [ ] Blind SSRF detection via Burp Collaborator (DNS/HTTP callback)
- [ ] Protocol switching:
file://,dict://,gopher:// - [ ] SSRF filter bypass:
http://127.0.0.1#@evil.com, decimal IP notation, IPv6[::1]
🔴 PROD-FORBIDDEN — Do not run an internal port scan via SSRF in production
🛠️ Burp Collaborator, ssrfmap, manual payloads
Phase 12 — Cross-Site Scripting (XSS)
Not a separate category in the OWASP Top 10 2021, but falls under A03 Injection
12.1 Reflected XSS
✅ Testable in production provided there's no persistence
- [ ] Identify input points that reflect input back in the response
- [ ] Test in URL parameters, search fields, error messages
- [ ] Check the HTML context, attribute context, JavaScript context, URL context
12.2 Stored XSS
⚠️ PROD-WARNING — Use unique, recognizable payloads; remove them immediately after confirmation
- [ ] Identify storage points: comments, profile fields, message forms
- [ ] Test for a stored payload that renders for other users
- [ ] Check admin panels: stored XSS that hits admins is critical
12.3 DOM-Based XSS
✅ Testable in production — client-side only
- [ ] Analyze JavaScript:
document.location,innerHTML,eval(),document.write() - [ ] Test
#fragment-based injection - [ ] Use browser DevTools and
DOM Invader(Burp Suite)
🛠️ Burp Suite DOM Invader, dalfox, manual analysis
Phase 13 — CSRF
✅ Testable in production with your own account
- [ ] Check for the presence of a CSRF token on state-changing requests
- [ ] Check whether the CSRF token is validated server-side (remove/empty the token)
- [ ] Test the
SameSitecookie attribute as a CSRF mitigation - [ ] Test for JSON CSRF (Content-Type: text/plain attacks)
- [ ] Check for predictable or static CSRF tokens
Phase 14 — API-Specific Tests
⚠️ PROD-WARNING — Rate limiting and mass assignment can mutate data
- [ ] REST API: test all CRUD operations per endpoint
- [ ] GraphQL: introspection query, batch queries, mutation testing
- [ ] Mass assignment: send extra fields in POST/PUT (
role,isAdmin,balance) - [ ] API versioning: test outdated versions (
/v1/alongside/v2/) - [ ] Check whether internal API endpoints are reachable without authentication
- [ ] JWT validation:
alg: none, algorithm confusion (RS256→HS256), expired tokens - [ ] API rate limiting and quota bypass
🛠️ Burp Suite, Postman, graphql-cop, jwt_tool
Phase 15 — Business Logic Testing
✅ Testable with your own accounts
- [ ] Force negative values (quantities, prices, discounts)
- [ ] Test workflow bypass: go straight to step 3 without steps 1 and 2
- [ ] Test for race conditions on critical actions (payment, activation, limit checks)
- [ ] Coupon/discount code: use multiple times, stack, negative discounts
- [ ] Test role switching mid-session
Race Conditions
🔴 PROD-FORBIDDEN — Race condition attacks on financial transactions in production
- [ ] Use Burp Suite "Send group in parallel" for simultaneous requests
- [ ] Test for TOCTOU (Time-of-Check to Time-of-Use) vulnerabilities
Phase 16 — Infrastructure & Network (if in scope)
⚠️ PROD-WARNING — Port scanning is visible in logs and can trigger IDS/IPS
- [ ] Port scan:
nmap -sV -sC --top-ports 1000 - [ ] Service fingerprinting: versions, banners
- [ ] Check SSL/TLS on all services
- [ ] Open ports that aren't in scope: document and report
- [ ] Firewall rule testing: reachability of internal services
🔴 PROD-FORBIDDEN — Aggressive scans (-T5, --script vuln) without explicit authorization
🛠️ nmap, masscan (staging only)
Phase 17 — Reporting
- [ ] Findings ordered by risk (Critical → High → Medium → Low → Informational)
- [ ] Per finding: description, reproduction steps, impact, CVSS score, recommendation
- [ ] Evidence: screenshots, Burp requests/responses, video where relevant
- [ ] Executive summary for management
- [ ] Technical report for the development team
- [ ] Remediation advice that is concrete and actionable
- [ ] A retest scheduled after fixes
Production-Warning Summary
| Test | Production status |
|---|---|
| Passive OSINT | ✅ Always safe |
| Directory enumeration | ⚠️ Increased traffic |
| SQL Injection detection (error messages) | ⚠️ Be careful |
SQLi with DROP/DELETE |
🔴 Forbidden |
| Command injection detection (OOB) | ⚠️ Only via Collaborator |
| Command injection execution | 🔴 Forbidden |
| XSS reflected | ✅ Safe |
| XSS stored | ⚠️ Remove immediately after testing |
| SSRF detection (Collaborator) | ⚠️ Safe via OOB |
| SSRF internal scan | 🔴 Forbidden |
| Web shell upload | 🔴 Forbidden |
| Race conditions (financial) | 🔴 Forbidden |
| Aggressive port scans | 🔴 Forbidden without authorization |
| Path traversal payloads | ⚠️ Read only, not write |