Webapp Pentest Stappenplan — OWASP Top 10
Versie: 1.0
Referentie: OWASP Top 10 (2021)
Scope: Volledige webapplicatie — van recon tot rapportage
Legende
| Symbool | Betekenis |
|---|---|
| ✅ | Veilig uitvoerbaar in productie |
| ⚠️ PROD-WARNING | Risico in productie — gebruik staging/testomgeving |
| 🔴 PROD-VERBODEN | Nooit uitvoeren in productie zonder expliciete schriftelijke toestemming |
| 🛠️ | Aanbevolen tooling |
Fase 0 — Voorbereiding & Scope
Voordat ook maar één request verstuurd wordt, moeten de juridische en technische kaders vastliggen.
- [ ] Schriftelijke toestemming (Rules of Engagement) ondertekend
- [ ] Scope gedefinieerd: domeinen, IP-ranges, uit-scope endpoints
- [ ] Testomgeving geïdentificeerd (staging vs. productie)
- [ ] Contactpersoon klant beschikbaar tijdens test
- [ ] Burp Suite Pro geconfigureerd (proxy, scope filter, upstream proxy indien nodig)
- [ ] VPN/verbinding naar doelnetwerk actief indien van toepassing
- [ ] Notities-structuur aangemaakt (bijv. Obsidian, MkDocs draft)
Fase 1 — Reconnaissance & Mapping
1.1 Passieve verkenning (OSINT)
✅ Veilig — geen directe interactie met de doelomgeving
- [ ] WHOIS-lookup domeinen en 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 poorten, banners, TLS-informatiehttps://chromaweb.cromax.com
- [ ] Wayback Machine / web archief: historische endpoints en parameters
- [ ] GitHub/GitLab dorking: gelekte credentials, API keys, intern code
🛠️ subfinder, amass, dnsx, gau, waybackurls, SecurityTrails, Shodan
1.2 Actieve mapping
⚠️ PROD-WARNING — Verhoogd netwerkverkeer zichtbaar in logs
- [ ] Crawl applicatie via Burp Suite Spider / OWASP ZAP
- [ ] Directory- en bestandsenumeration:
ffuf,feroxbuster,gobuster - [ ] JavaScript-analyse: endpoints, API-routes, tokens extraheren
- Tools:
LinkFinder,JSParser, handmatig in DevTools - [ ] Technologie-fingerprinting: frameworks, CMS, libraries, versies
- Tools:
Wappalyzer,whatweb, Burp response headers - [ ] API-schema discovery:
/api/docs,/swagger.json,/openapi.yaml, GraphQL introspection - [ ] HTTP-methoden testen per endpoint (OPTIONS, PUT, DELETE, PATCH)
- [ ] Sitemap.xml en robots.txt analyseren
🛠️ Burp Suite Pro, ffuf, feroxbuster, LinkFinder, whatweb
Fase 2 — A01: Broken Access Control
OWASP #1 — Meest voorkomende kritieke kwetsbaarheid
2.1 Horizontale privilege escalatie (IDOR)
✅ Testbaar in productie mits eigen testaccounts gebruikt worden
- [ ] Identificeer object-referenties in URLs, POST-bodies, cookies (IDs, UUIDs, slugs)
- [ ] Vervang eigen ID door dat van een andere gebruiker
- [ ] Test op sequentiële én UUID-gebaseerde identifiers
- [ ] Controleer of API-responses data lekken die niet getoond worden in de UI
2.2 Verticale privilege escalatie
✅ Testbaar met eigen accounts op verschillende rollen
- [ ] Test admin-endpoints vanuit laagbevoegd account
- [ ] Forceer browsing naar
/admin,/dashboard,/config,/manage - [ ] Verwijder of manipuleer rolegebaseerde parameters in requests
- [ ] Test of UI-gebaseerde beperkingen ook server-side gehandhaafd worden
2.3 Access control op HTTP-methoden
✅ Testbaar in productie
- [ ] Probeer schrijfoperaties (PUT, DELETE, PATCH) op read-only endpoints
- [ ] Test of
HEADrequests gefilterde data blootleggen
2.4 Path traversal / Directory traversal
⚠️ PROD-WARNING — Kan bestandssysteem lezen; voorzichtig met payloads
- [ ] Test bestandsreferenties in parameters:
?file=,?path=,?include= - [ ] Payloads:
../../etc/passwd,....//....//etc/passwd, URL-encoded varianten - [ ] Test op Windows-paden indien van toepassing:
..\..\windows\system32\ - [ ] Controleer op ZIP-slip bij upload-functionaliteit
🛠️ Burp Intruder, ffuf, PortSwigger path traversal labs
Fase 3 — A02: Cryptographic Failures
✅ Grotendeels observationeel — veilig in productie
- [ ] Controleer TLS-versie en cipher suites via
testssl.shof SSL Labs - Zoek naar: SSLv3, TLS 1.0/1.1, RC4, NULL ciphers, EXPORT ciphers
- [ ] Controleer HSTS-header aanwezig en correct geconfigureerd
- [ ] Mixed content: HTTP-resources op HTTPS-pagina's
- [ ] Gevoelige data in URL-parameters (wachtwoorden, tokens, sessie-IDs)
- [ ] Gevoelige data in browser history, logs, referer headers
- [ ] Wachtwoorden in plaintext opgeslagen (test via account reset flows)
- [ ] Cookies:
Secure-flag aanwezig op gevoelige cookies - [ ] Zwakke hashing: MD5/SHA1 voor wachtwoorden (controleer bij datalekken of via foutmeldingen)
- [ ] JWT-analyse:
alg: none, zwakke secrets, RS256→HS256 algorithm confusion
🛠️ testssl.sh, SSL Labs, jwt_tool, Burp Suite, hashid
Fase 4 — A03: Injection
4.1 SQL Injection
⚠️ PROD-WARNING — Destructieve payloads (DROP, DELETE) zijn verboden in productie
- [ ] Identificeer alle invoerpunten: formulieren, URL-params, headers, cookies, JSON-body
- [ ] Test op foutmeldingen met
',",--,# - [ ] Controleer op 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 op ORM-injecties (HQL, JPQL, LINQ)
- [ ] Automatische scan met sqlmap (staging only)
🔴 PROD-VERBODEN — sqlmap --dump, DROP TABLE, DELETE FROM in productie
🛠️ Burp Intruder, sqlmap (staging), handmatige payloads
4.2 Command Injection
🔴 PROD-VERBODEN — Nooit destructieve OS-commando's in productie uitvoeren
- [ ] Test invoerpunten die OS-functies aanroepen (ping, nslookup, file conversie)
- [ ] Payloads:
; id,| whoami,`id`,$(id) - [ ] Out-of-band detectie via Burp Collaborator (DNS/HTTP pingback)
- [ ] Blind command injection via tijdvertraging:
; sleep 5
⚠️ PROD-WARNING — OOB-detectie via Collaborator is veilig; directe commando-uitvoer niet
4.3 LDAP / XML / XPath Injection
⚠️ PROD-WARNING — Test met niet-destructieve payloads
- [ ] LDAP:
*)(uid=*))(|(uid=* - [ ] XML/XPath injectie in SOAP/XML APIs
- [ ] XXE (zie ook A05 hieronder)
Fase 5 — A04: Insecure Design
✅ Grotendeels architecturaal — veilig observeerbaar
- [ ] Analyseer business logic flows (bestelprocessen, kortingscodes, saldo's)
- [ ] Test rate limiting op kritieke functies (login, wachtwoordreset, OTP)
- [ ] Controleer op multi-step process bypass (stap 2 bereiken zonder stap 1)
- [ ] Test op "negative price" of integer overflow in e-commerce
- [ ] Analyseer threat model: ontbreekt defence-in-depth?
- [ ] Controleer of gevoelige functies enkel via UI-flow bereikbaar zijn of ook direct via API
Fase 6 — A05: Security Misconfiguration
✅ Observationeel — veilig in productie
- [ ] Default credentials testen op beheerinterfaces (admin/admin, admin/password)
- [ ] Overbodige HTTP-headers:
Server,X-Powered-By,X-AspNet-Version - [ ] Ontbrekende security headers:
Content-Security-PolicyX-Frame-Optionsofframe-ancestorsX-Content-Type-OptionsReferrer-PolicyPermissions-Policy- [ ] CORS-misconfiguratie: wildcards, reflection van
Origin,nullorigin - [ ] Directory listing actief op webserver
- [ ] Error pages: stack traces, DB-versies, interne paden zichtbaar
- [ ] Cloud storage: publiek toegankelijke S3-buckets, Azure Blob containers
- [ ] Debug-modus actief (
?debug=true,FLASK_ENV=development) - [ ] Verborgen beheerinterfaces via directory enumeration (zie Fase 1.2)
XXE (XML External Entities)
⚠️ PROD-WARNING — Gebruik OOB-technieken, geen bestandslees-payloads in productie
- [ ] Identificeer XML-verwerkende endpoints
- [ ] Test met externe entiteit naar Burp Collaborator
- [ ] Test op SSRF via XXE (
<!ENTITY xxe SYSTEM "http://169.254.169.254/">)
🛠️ Burp Suite, nuclei (misconfig templates)
Fase 7 — A06: Vulnerable and Outdated Components
✅ Veilig uitvoerbaar — puur informatief
- [ ] Inventariseer alle client-side libraries (JavaScript): versies via DevTools / Wappalyzer
- [ ] Controleer npm/yarn lock files indien beschikbaar (bijv. via GitHub)
- [ ] Server-side frameworks: versie uit headers, foutpagina's of
/readme,/changelog - [ ] Vergelijk versies met CVE-databases: NVD, Snyk, OSV
- [ ] CMS-specifiek: WordPress plugins/themes versies, Drupal modules
- [ ] Controleer op bekende exploits voor geïdentificeerde versies
🛠️ retire.js, npm audit, Snyk, wappalyzer, NVD
Fase 8 — A07: Identification and Authentication Failures
✅ Testbaar met eigen accounts in productie
- [ ] Wachtwoordbeleid: minimale complexiteit, maximale lengte
- [ ] Account lockout na X mislukte pogingen
- [ ] Username enumeration via foutmeldingen of timing-verschil
- [ ] "Forgot password" flow: token-lengte, geldigheid, hergebruik
- [ ] MFA-implementatie: bypass via response manipulatie, hergebruik van codes
- [ ] "Remember me" functionaliteit: token-analyse, levensduur
- [ ] OAuth2/OIDC flows: state-parameter aanwezig, token-lekkage via referer
Sessie-management
- [ ] Sessitoken entropie en lengte (minimum 128 bit)
- [ ] Sessie-invalidatie bij logout (server-side)
- [ ] Sessie-invalidatie bij wachtwoordwijziging
- [ ] Session fixation: token verandert na login?
- [ ] Cookie-attributen:
HttpOnly,Secure,SameSite
🛠️ Burp Suite, ffuf (credential stuffing op staging), jwt_tool
Fase 9 — A08: Software and Data Integrity Failures
9.1 Bestandsupload
⚠️ PROD-WARNING — Upload geen echte webshells; gebruik EICAR of onschadelijke PoC's
- [ ] Controleer welke bestandstypen geaccepteerd worden
- [ ] Bypass content-type check: verander
Content-Typeheader - [ ] Dubbele extensie:
shell.php.jpg,shell.php%00.jpg - [ ] Magic bytes manipulatie
- [ ] Upload naar publiek toegankelijke locatie?
- [ ] Bestandsnaam sanitisatie (path traversal via filename)
- [ ] SVG-upload: embedded XSS of SSRF
🔴 PROD-VERBODEN — Geen functionele webshells uploaden in productie
9.2 CI/CD & Supply Chain
✅ Observationeel
- [ ] Controleer of CDN-resources geladen worden met SRI-hashes
- [ ] Analyseer of externe packages gepind zijn op specifieke versies
- [ ] Zoek naar onveilige deserialisatie-indicatoren (Java serialized objects, pickle, PHP serialize)
Fase 10 — A09: Security Logging and Monitoring Failures
✅ Veilig testbaar — observationeel
- [ ] Genereer bewust falende loginpogingen — ontvang je een alert?
- [ ] Controleer of verdachte activiteit (SQLi-strings, XSS) gelogd wordt
- [ ] Zoek naar gevoelige data in logs (wachtwoorden, tokens, PII)
- [ ] Controleer beschikbaarheid van
/logs,/log,/debug,/traceendpoints - [ ] Zijn foutmeldingen voor gebruikers informatiearm (geen stack traces)?
- [ ] Is er een incident response proces aantoonbaar?
Fase 11 — A10: Server-Side Request Forgery (SSRF)
⚠️ PROD-WARNING — Gebruik Burp Collaborator voor OOB-detectie; geen interne scans uitvoeren in productie
- [ ] Identificeer parameters die URL's of hostnamen verwerken (
url=,webhook=,redirect=,load=,fetch=) - [ ] Test op interne netwerktoegang:
http://127.0.0.1,http://localhost - [ ] Cloud metadata endpoint:
http://169.254.169.254/latest/meta-data/ - [ ] SSRF via indirecte inputs: PDF-generators, afbeeldingsprocessors, importfuncties
- [ ] Blind SSRF detectie via Burp Collaborator (DNS/HTTP callback)
- [ ] Protocol-switching:
file://,dict://,gopher:// - [ ] SSRF filter bypass:
http://127.0.0.1#@evil.com, decimale IP-notatie, IPv6[::1]
🔴 PROD-VERBODEN — Geen interne portscan via SSRF uitvoeren in productie
🛠️ Burp Collaborator, ssrfmap, handmatige payloads
Fase 12 — Cross-Site Scripting (XSS)
Niet in de OWASP Top 10 2021 als aparte categorie, maar valt onder A03 Injection
12.1 Reflected XSS
✅ Testbaar in productie mits geen persistentie
- [ ] Identificeer invoerpunten die input terugspiegelen in de response
- [ ] Test in URL-parameters, zoekvelden, foutmeldingen
- [ ] Controleer HTML-context, attribuut-context, JavaScript-context, URL-context
12.2 Stored XSS
⚠️ PROD-WARNING — Gebruik unieke, herkenbare payloads; verwijder ze onmiddellijk na bevestiging
- [ ] Identificeer opslagpunten: commentaren, profielvelden, berichtenformulieren
- [ ] Test op opgeslagen payload die bij andere gebruikers renderen
- [ ] Controleer admin-panels: stored XSS die admins raken is kritiek
12.3 DOM-based XSS
✅ Testbaar in productie — enkel client-side
- [ ] Analyseer JavaScript:
document.location,innerHTML,eval(),document.write() - [ ] Test
#fragment-gebaseerde injection - [ ] Gebruik browser DevTools en
DOM Invader(Burp Suite)
🛠️ Burp Suite DOM Invader, dalfox, handmatige analyse
Fase 13 — CSRF
✅ Testbaar in productie met eigen account
- [ ] Controleer aanwezigheid van CSRF-token op state-wijzigende requests
- [ ] Controleer of CSRF-token server-side gevalideerd wordt (verwijder/leeg het token)
- [ ] Test
SameSite-cookie attribuut als CSRF-mitigatie - [ ] Test op JSON CSRF (Content-Type: text/plain aanvallen)
- [ ] Controleer op voorspelbare of statische CSRF-tokens
Fase 14 — API-specifieke tests
⚠️ PROD-WARNING — Rate limiting en mass assignment kunnen data muteren
- [ ] REST API: test alle CRUD-operaties per endpoint
- [ ] GraphQL: introspection query, batch queries, mutation testing
- [ ] Mass assignment: stuur extra velden mee in POST/PUT (
role,isAdmin,balance) - [ ] API-versioning: test verouderde versies (
/v1/naast/v2/) - [ ] Controleer of interne API-endpoints bereikbaar zijn zonder authenticatie
- [ ] JWT-validatie:
alg: none, algorithm confusion (RS256→HS256), expired tokens - [ ] API rate limiting en quota bypass
🛠️ Burp Suite, Postman, graphql-cop, jwt_tool
Fase 15 — Business Logic Testing
✅ Testbaar met eigen accounts
- [ ] Forceer negatieve waarden (hoeveelheden, prijzen, kortingen)
- [ ] Test workflow-bypass: ga rechtstreeks naar stap 3 zonder stap 1 en 2
- [ ] Test op race conditions bij kritieke acties (betaling, activatie, limiet-controles)
- [ ] Coupon/kortingscode: meerdere keren gebruiken, stapelen, negatieve kortingen
- [ ] Test rolwisseling mid-sessie
Race Conditions
🔴 PROD-VERBODEN — Race condition aanvallen op financiële transacties in productie
- [ ] Gebruik Burp Suite "Send group in parallel" voor simultane requests
- [ ] Test op TOCTOU (Time-of-Check to Time-of-Use) kwetsbaarheden
Fase 16 — Infrastructuur & Netwerk (indien in scope)
⚠️ PROD-WARNING — Poortscannen is zichtbaar in logs en kan IDS/IPS triggeren
- [ ] Portscan:
nmap -sV -sC --top-ports 1000 - [ ] Service fingerprinting: versies, banners
- [ ] SSL/TLS op alle diensten controleren
- [ ] Open poorten die niet in scope zijn: documenteer en meld
- [ ] Firewall rule testing: bereikbaarheid van interne services
🔴 PROD-VERBODEN — Aggressieve scans (-T5, --script vuln) zonder expliciete toestemming
🛠️ nmap, masscan (staging only)
Fase 17 — Rapportage
- [ ] Bevindingen geordend op risico (Kritiek → Hoog → Gemiddeld → Laag → Informatief)
- [ ] Per bevinding: beschrijving, stappen om te reproduceren, impact, CVSS-score, aanbeveling
- [ ] Bewijsmateriaal: screenshots, Burp requests/responses, video indien relevant
- [ ] Executive summary voor management
- [ ] Technisch rapport voor development team
- [ ] Remediatie-adviezen concreet en actionable
- [ ] Herbeoordeling (retest) ingepland na fixes
Productie-warning Samenvatting
| Test | Productie-status |
|---|---|
| Passieve OSINT | ✅ Altijd veilig |
| Directory enumeration | ⚠️ Verhoogd verkeer |
| SQL Injection detectie (foutmeldingen) | ⚠️ Voorzichtig |
SQLi met DROP/DELETE |
🔴 Verboden |
| Command injection detectie (OOB) | ⚠️ Enkel via Collaborator |
| Command injection uitvoering | 🔴 Verboden |
| XSS reflected | ✅ Veilig |
| XSS stored | ⚠️ Direct verwijderen na test |
| SSRF detectie (Collaborator) | ⚠️ Veilig via OOB |
| SSRF interne scan | 🔴 Verboden |
| Webshell upload | 🔴 Verboden |
| Race conditions (financieel) | 🔴 Verboden |
| Agressieve poortscans | 🔴 Verboden zonder toestemming |
| Path traversal payloads | ⚠️ Enkel read, niet write |