XSS vs CSRF
In dit gedeelte leggen we de verschillen uit tussen XSS en CSRF, en bespreken we of CSRF-tokens kunnen helpen om XSS-aanvallen te voorkomen.
Wat is het verschil tussen XSS en CSRF?
Cross-site scripting (of XSS) stelt een aanvaller in staat om willekeurige JavaScript uit te voeren in de browser van een slachtoffer gebruiker.
Cross-site request forgery (of CSRF) stelt een aanvaller in staat een slachtoffer te verleiden tot het uitvoeren van acties die niet de bedoeling zijn.
De gevolgen van XSS-kwetsbaarheden zijn over het algemeen ernstiger dan die van CSRF-kwetsbaarheden:
- CSRF is vaak alleen van toepassing op een subset van acties die een gebruiker kan uitvoeren. Veel applicaties implementeren CSRF verdediging in het algemeen, maar zien één of twee acties over het hoofd die worden blootgesteld. Omgekeerd kan een succesvolle XSS-exploit een gebruiker normaal gesproken aanzetten tot het uitvoeren van elke actie die de gebruiker kan uitvoeren, ongeacht de functionaliteit waarin de kwetsbaarheid zich voordoet.
- CSRF kan worden omschreven als een eenrichtingskwetsbaarheid, in die zin dat een aanvaller het slachtoffer er wel toe kan brengen een HTTP-verzoek in te dienen, maar niet het antwoord op dat verzoek kan ophalen. XSS daarentegen is “tweerichtings” kwetsbaar, in die zin dat het geïnjecteerde script van de aanvaller willekeurige verzoeken kan doen, de antwoorden kan lezen en gegevens kan exfiltreren naar een extern domein naar keuze van de aanvaller.
Kunnen CSRF-tokens XSS-aanvallen voorkomen?
Sommige XSS-aanvallen kunnen inderdaad worden voorkomen door een effectief gebruik van CSRF-tokens. Neem een eenvoudige gereflecteerde XSS-kwetsbaarheid die op triviale wijze als volgt kan worden uitgebuit:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
Stel nu dat de kwetsbare functie een CSRF-token bevat:
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>
Ervan uitgaande dat de server het CSRF-token correct valideert en verzoeken zonder geldig token afwijst, voorkomt het token wel degelijk de exploitatie van het XSS-kwetsbaarheid. De aanwijzing hier zit in de naam: “cross-site scripting”, tenminste in zijn gereflecteerde vorm, impliceert een cross-site verzoek. Door te voorkomen dat een aanvaller een cross-site request vervalst, voorkomt de applicatie triviale exploitatie van de XSS kwetsbaarheid.
Hier rijzen enkele belangrijke kanttekeningen:
- Als een gereflecteerde XSS-kwetsbaarheid ergens anders op de site bestaat binnen een functie die niet wordt beschermd door een CSRF-token, dan kan die XSS op de normale manier worden uitgebuit.
- Als er ergens op een site een XSS-kwetsbaarheid bestaat die kan worden uitgebuit, dan kan die kwetsbaarheid worden gebruikt om een slachtoffer acties te laten uitvoeren, zelfs als die acties zelf beschermd zijn door CSRF-tokens. In deze situatie kan het script van de aanvaller de relevante pagina opvragen om een geldig CSRF token te verkrijgen, en vervolgens het token gebruiken om de beschermde actie uit te voeren.
- CSRF-tokens bieden geen bescherming tegen opgeslagen XSS-kwetsbaarheden. Als een pagina die wordt beschermd door een CSRF-token ook het uitvoerpunt is voor een opgeslagen XSS-kwetsbaarheid, dan kan die XSS-kwetsbaarheid op de gebruikelijke manier worden uitgebuit, en de XSS payload zal worden uitgevoerd wanneer een gebruiker de pagina bezoekt.