A systematic web application penetration test requires more than just running automated scanners. It demands a structured methodology that covers authentication, authorization, injection, business logic, and configuration — the areas where automated tools most often miss critical vulnerabilities. This checklist walks through each phase of a web app pentest aligned with the OWASP Testing Guide and the OWASP Top 10, with specific tools and commands for each step.
Pre-Engagement
Before touching the application, confirm the following:
Passive Recon (No target interaction)
Active Recon
# Subdomain enumeration
ffuf -u https://FUZZ.target.com/ \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-mc 200,301,302,403
# Directory discovery
ffuf -u https://target.com/FUZZ \
-w /usr/share/seclists/Discovery/Web-Content/raft-medium-words.txt \
-e .php,.html,.js,.txt,.bak \
-ac -mc 200,301,302,403,500
# Technology fingerprinting
whatweb https://target.com
wappalyzer https://target.com # Browser extension or CLI
Phase 2: Authentication Testing
A07 — Identification and Authentication Failures
# Hydra login brute force
hydra -l admin -P /usr/share/wordlists/rockyou.txt target.com http-post-form \
"/login:username=^USER^&password=^PASS^:Invalid credentials"
Phase 3: Session Management Testing
# Check cookie flags in Burp Suite or curl
curl -v -c cookies.txt https://target.com/login \
-d "username=admin&password=password"
Phase 4: Authorization Testing
A01 — Broken Access Control
This is the #1 OWASP vulnerability — test it thoroughly.
# Example IDOR test in Burp Repeater
GET /api/invoices/1042 → change to /api/invoices/1043
GET /api/users/profile?id=5 → change to id=1 (admin?)
# Decode JWT
echo "eyJ..." | base64 -d
# Test alg:none in jwt_tool
python3 jwt_tool.py <token> -X a
Phase 5: Injection Testing
A03 — Injection
sqlmap -u "https://target.com/page?id=1" --dbs --batch
sqlmap -u "https://target.com/login" \
--data="username=admin&password=test" --dbs
Phase 6: XSS and Client-Side Testing
A03 — Cross-Site Scripting
// Basic XSS payloads to test
<script>alert(1)</script>
"><script>alert(1)</script>
'><img src=x onerror=alert(1)>
javascript:alert(1)
Phase 7: Sensitive Data and Cryptography
A02 — Cryptographic Failures
# Test SSL configuration
testssl.sh https://target.com
nmap --script ssl-enum-ciphers -p 443 target.com
Phase 8: Security Misconfiguration
A05 — Security Misconfiguration
| Header | Expected Value |
|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains |
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY or SAMEORIGIN |
Content-Security-Policy | Restrictive policy set |
Referrer-Policy | strict-origin-when-cross-origin |
# Check headers
curl -I https://target.com
Phase 9: Business Logic Testing
Automated scanners completely miss business logic flaws. Manual testing is required:
Phase 10: API Testing
Modern apps have REST or GraphQL APIs that often have weaker security than the UI:
# Discover API endpoints
ffuf -u https://target.com/api/v1/FUZZ \
-w /usr/share/seclists/Discovery/Web-Content/api-endpoints.txt
# Test GraphQL introspection
curl -X POST https://target.com/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{__schema{types{name}}}"}'
Reporting Checklist
Every finding should include:
Severity tiers: Critical → High → Medium → Low → Informational
| Phase | Tools |
|---|
| Proxy/Manual Testing | Burp Suite Pro or Community |
| Directory Fuzzing | ffuf, gobuster |
| Vuln Scanning | Nikto, OWASP ZAP |
| SQL Injection | sqlmap |
| Subdomain Enum | subfinder, amass, ffuf |
| SSL Testing | testssl.sh |
| JS Analysis | LinkFinder, JSParser |
Summary
A thorough web application pentest is a methodical process — not a tool dump. Work through each OWASP category systematically, document every finding with evidence, and always test business logic manually. The combination of automated discovery and manual analysis is what separates a useful pentest report from a glorified Nikto scan. Always work within your authorized scope and adhere to the rules of engagement.