Wat is XSS (Cross-Site Scripting)?
Cross-Site Scripting, of XSS, is een beveiligingsfout in websites die aanvallers in staat stelt schadelijke scripts aan webpagina’s toe te voegen. Meestal worden deze scripts geschreven in JavaScript.
Als iemand een pagina bezoekt die door XSS is aangetast, voert hun browser het script van de aanvaller uit. Dit kan resulteren in gestolen cookies, gekaapte sessies of acties die zonder toestemming van de gebruiker worden uitgevoerd.
XSS, net als SQL Injection, wordt regelmatig vermeld in de OWASP Top 10 als een van de meest voorkomende kwetsbaarheden van webapplicaties.
Hoe werkt XSS?
XSS richt zich vaak op webapplicaties die gebruikersinvoer niet correct controleren en opschonen.
Bijvoorbeeld, als een commentaarvak ruwe HTML of JavaScript toestaat zonder enige filtering, kan een aanvaller code zoals deze toevoegen:
<script>alert('Hacked!');</script>
Wanneer slachtoffers de pagina bekijken, wordt de schadelijke code in hun browser uitgevoerd.
Waarom XSS belangrijk is in cybersecurity
XSS kan leiden tot een grotere inbreuk:
- Accountovername (sessiecookies stelen om gebruikers te imiteren)
- Diefstal van gegevens (vastleggen van formulierinvoer zoals wachtwoorden of creditcards)
- Phishing-aanvallen (injecteren van nep-inlogformulieren)
- Malwarelevering (gebruikers omleiden naar kwaadaardige websites)
Types XSS
- DOM-gebaseerde XSS
- De aanval vindt volledig plaats in de browser door het manipuleren van het Document Object Model (DOM) zonder de server erbij te betrekken.
- Opgeslagen XSS
- Kwaadaardig script wordt permanent opgeslagen op de server, zoals in de database of profielpagina.
- Gereflecteerde XSS
- Script wordt gereflecteerd van een webserver (bijv. in URL of foutmelding), het script wordt uitgevoerd wanneer het slachtoffer op een door aanvallers vervaardigde link klikt.
Hoe XSS te voorkomen
- Invoersanering & uitvoerencoding: altijd gebruikersinvoer schoonmaken voordat deze verwerkt wordt, gebruikersinvoer transformeren naar een veilig formaat
- Gebruik Content Security Policy (CSP): beperkt welke scripts in de browser kunnen worden uitgevoerd.
- Vermijd eval() en inline JavaScript: om injectierisico’s te verminderen.
- Beveiligingstesten (DAST/IAST): voer beveiligingstesten uit om kwetsbaarheden vroegtijdig te detecteren
Voorbeeld in de echte wereld - Samy worm (MySpace, 2005)
Wat er gebeurde: Samy Kamkar publiceerde een MySpace-profiel dat een stored XSS-payload bevatte. Wanneer andere gebruikers het profiel bekeken, werd de payload in hun browsers uitgevoerd, waarbij het (a) Samy als vriend toevoegde, (b) de zin “Samy is mijn held” aan hun profielen toevoegde, en (c) zichzelf repliceerde naar de profielpagina’s van die gebruikers.
Impact: De worm verspreidde zichzelf naar ~1 miljoen gebruikers binnen ~20 uur, waardoor MySpace tijdelijk offline ging.
Waarom het werkte: MySpace stond ongeëscapete HTML/attributen toe in profielvelden, waardoor opgeslagen scriptuitvoering in de browsers van bezoekers mogelijk was.
Lessen / oplossing: Correcte uitvoercodering, invoersanering, verwijdering van HTML in profielvelden en snelle patching. Samy kreeg later juridische gevolgen, en MySpace implementeerde filters.
Gerelateerde termen
- SQL-injectie
- DAST (Dynamic Application Security Testing)
- OWASP Top 10
- CSRF (Cross-Site Request Forgery)