Cross-Site Scripting (XSS) is een veelvoorkomende beveiligingskwetsbaarheid op websites waarbij een aanvaller schadelijke scripts injecteert in webpagina's die door andere gebruikers worden bekeken. Deze scripts worden meestal geschreven in JavaScript, maar kunnen ook in andere talen zoals HTML of VBScript zijn.
Het gevaar van XSS is dat het wordt uitgevoerd in de browser van de gebruiker, wat kan leiden tot:
- Diefstal van cookies en sessietokens – Dit stelt aanvallers in staat om in te loggen als de gebruiker.
- Manipulatie van webinhoud – Kwaadwillenden kunnen misleidende informatie tonen of gebruikers omleiden naar malafide websites.
- Phishing en social engineering – Gebruikers kunnen verleid worden om vertrouwelijke gegevens in te vullen op vervalste formulieren.
Hoe werkt XSS?
Een XSS-aanval gebeurt meestal wanneer een website niet goed valideert of zuivert wat gebruikers invoeren. Het schadelijke script wordt opgeslagen of weerspiegeld en uitgevoerd in de browser van een andere gebruiker.
Er zijn drie hoofdtypen XSS-aanvallen:
-
Stored XSS (Opgeslagen XSS):
- Het schadelijke script wordt permanent opgeslagen op de server, bijvoorbeeld in een database, forumcommentaar of gebruikersprofiel.
- Elke gebruiker die de geïnfecteerde pagina bekijkt, voert onbewust het script uit.
- Voorbeeld: Een aanvaller plaatst een schadelijke
<script>
-tag in een blogreactie. Elke gebruiker die de reacties bekijkt, voert dat script uit.
-
Reflected XSS (Weerspiegeld XSS):
- Het schadelijke script wordt verwerkt en teruggestuurd door de server als onderdeel van de URL of invoerveld.
- Dit gebeurt meestal via een link die het slachtoffer moet openen.
- Voorbeeld: Een aanvaller stuurt een link naar een zoekpagina met een kwaadaardig script in de URL. Wanneer het slachtoffer erop klikt, wordt het script uitgevoerd.
-
DOM-based XSS:
- Het script wordt uitgevoerd doordat de browser zelf de DOM (Document Object Model) manipuleert, zonder tussenkomst van de server.
- Voorbeeld: Een kwaadwillende manipuleert de URL of cookies, en het JavaScript op de pagina verwerkt dit zonder beveiliging.
Hoe voorkom je XSS?
-
Invoer- en uitvoer-sanitatie:
- Zuiver alle gebruikersinvoer door gevaarlijke tekens te ontsnappen (zoals
<
,>
,"
en'
). - Gebruik hiervoor functies zoals
htmlspecialchars()
in PHP ofencodeURIComponent()
in JavaScript.
- Zuiver alle gebruikersinvoer door gevaarlijke tekens te ontsnappen (zoals
-
Gebruik van Content Security Policy (CSP):
- Beperk de bronnen van scripts die mogen worden uitgevoerd.
- Dit voorkomt dat kwaadaardige scripts van onbekende bronnen worden uitgevoerd.
-
Escape data in HTML en JavaScript:
- Gebruik veilige methoden om dynamische data in HTML, JavaScript of URL's te plaatsen.
-
Geen vertrouwen op client-side validatie alleen:
- Controleer invoer altijd op de server, zelfs als je ook client-side validatie gebruikt.
-
Gebruik veilige frameworks:
- Frameworks zoals React en Angular ontsmetten automatisch de invoer als deze in de HTML wordt weergegeven.
Voorbeeld van XSS:
<!-- Onveilige code -->
<p>Welkom, <?php echo $_GET['user']; ?>!</p>
https://voorbeeld.nl/?user=<script>alert('XSS-aanval!');</script>