CSRF — Medium
De backend heeft in de gaten dat er valse linkjes worden gestuurd vanuit e-mails of externe forums. Tijd voor een verdediging.
1. Predict (Voorspel)
De server voert nu een extra controle uit op de binnenkomende requests:
if ( stripos( $_SERVER[ 'HTTP_REFERER' ], $_SERVER[ 'SERVER_NAME' ]) !== false ) {
// Wachtwoord succesvol gewijzigd
} else {
// Fout! Je probeert dit vanaf een andere site!
}
Vraag: Waar kijkt de server in deze code precies naar om te bepalen of het verzoek betrouwbaar is?
Antwoord
De server bekijkt de HTTP Referer header. Dit is een regeltje data die elke browser meestuurt om aan te geven "Vanaf welke URL klikte deze persoon op de link?"
De code controleert of de referer overeenkomt met de eigen server (SERVER_NAME). Hij weigert wachtwoordwijzigingen als de gebruiker vanaf een andere website kwam!
2. Run & Investigate
Start het lab.
3. Modify & Make (Aanpassen & Maken)
Is het controleren van de Referer een onbreekbare verdediging? Nee!
Kijk goed naar de specifieke code: stripos( $_SERVER[ 'HTTP_REFERER' ], $_SERVER[ 'SERVER_NAME' ]) !== false.
Dit betekent: als de originele domeinnaam (server_name, bijv: website.nl) maar ergens voorkomt in de Referer URL, wordt het goedgekeurd.
Hoe kun je (in theorie) als hacker dit lek misbruiken om alsnog de Referer check te passeren vanaf je eigen kwaadaardige website?
Tip
Stel, jouw kwaadaardige website heet boos.nl. Hoe kun je jouw URL zó aanpassen dat de server denkt dat website.nl in de verwijzing staat?
Antwoord
Een hacker kan zijn kwaadaardige pagina opslaan op een adres dat de naam van het slachtoffer-domein imiteert. Bijvoorbeeld een folder:
http://boos.nl/ik_ben_stiekem_website.nl/index.html
Als het slachtoffer hierop klikt, is de Referer: http://boos.nl/ik_ben_stiekem_website.nl/.
De backend code checkt of website.nl erin staat. Ja hoor! De controle wordt omzeild en de CSRF aanval slaagt alsnog.
4. ✓ Wat moest je zien?
- Met een directe URL-aanval (zoals op Low) krijg je nu "That request didn't look correct." — de Referer-check blokkeert de poging.
- Vanuit een pagina op de DVWA-server zelf (bijvoorbeeld via een ander DVWA-tabblad) werkt dezelfde URL wel: de Referer bevat dan de servernaam.
- Conceptueel: een aanvalspagina met
localhostergens in de mapnaam (zoals/ik_ben_localhost/) passeert ook, omdatstriposalleen een substring zoekt.
Krijg je het werkend van een externe pagina? Vergeet niet dat moderne browsers steeds vaker geen Referer meer meesturen (privacybeleid). DVWA verwacht hier een klassiek browsergedrag.
5. Er gaat iets mis...
Je probeert CSRF via het veranderen van HTTP Headers met tools, maar het slaagt niet. Let op: bij een CSRF aanval forceer je de browser van de gebruiker om het verzoek te sturen. Je kunt vanuit een HTML script niet zomaar de headers (zoals de Referer) vervalsen in de browser van het slachtoffer. Daarom maken we gebruik van creatieve mapnamen op onze eigen server om de URL te imiteren.