Ga naar hoofdinhoud

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.

Laden...

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?

Controle
  • 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 localhost ergens in de mapnaam (zoals /ik_ben_localhost/) passeert ook, omdat stripos alleen 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.