Naar de inhoud
esif.nl, kennisbank security en intelligence

Aanvalstechnieken

Cross-site scripting (XSS)

Bijgewerkt op · Door Maarten van den Bos

Cross-site scripting (XSS) is een aanval waarbij een aanvaller kwaadaardige code, meestal JavaScript, via een kwetsbare website bij bezoekers laat uitvoeren. De browser vertrouwt de code omdat die van de website zelf lijkt te komen. Zo kan de aanvaller bijvoorbeeld sessiegegevens stelen, de inhoud van de pagina veranderen of bezoekers doorsturen naar een nepwebsite.

Wat is cross-site scripting?

Cross-site scripting, afgekort XSS, is een aanval op de bezoekers van een website via een fout in die website. OWASP, de internationale stichting voor veilige webapplicaties, omschrijft XSS als een vorm van injectie waarbij kwaadaardige scripts in verder betrouwbare websites terechtkomen. Dat kan overal waar een webapplicatie invoer van een gebruiker in haar uitvoer zet zonder die te controleren of te coderen.

Het gevaar zit in het vertrouwen van de browser. Die kan niet zien dat het script niet van de website zelf komt en voert het gewoon uit. Het script kan dan volgens OWASP bij cookies, sessietokens en andere gevoelige informatie die de browser voor die website bewaart. Het kan zelfs de inhoud van de pagina herschrijven.

In de OWASP Top 10 van 2025 valt XSS onder de categorie Injection, op plaats 5. OWASP noemt XSS een aanval die heel vaak voorkomt maar per geval minder impact heeft, met meer dan 30.000 CVE’s, publiek geregistreerde kwetsbaarheden (bron: OWASP, 2025). Ter vergelijking: voor SQL-injectie, dat de database aanvalt in plaats van de bezoeker, telt OWASP er meer dan 14.000.

Hoe werkt cross-site scripting?

Cross-site scripting werkt doordat een website invoer van buiten ongecontroleerd terugstuurt naar de browser. OWASP onderscheidt 3 soorten:

SoortWaar zit de kwaadaardige code?Hoe bereikt die het slachtoffer?
Reflected XSSIn een verzoek, zoals een link of formulierDe website kaatst de invoer direct terug, bijvoorbeeld in een zoekresultaat of foutmelding
Stored XSSOpgeslagen op de server, zoals in een reactie of berichtIedere bezoeker die de pagina opent, krijgt de code mee
DOM-based XSSIn code die in de browser zelf draaitHet script op de pagina verwerkt onveilige invoer in de browser

Volgens de OWASP-richtlijnen voor preventie is er niet 1 techniek die XSS oplost. Een combinatie werkt:

  1. Codeer alle uitvoer passend bij de plek op de pagina, zoals HTML, een attribuut, JavaScript, CSS of een URL.
  2. Gebruik een modern webframework dat automatisch escapet, en vermijd de uitzonderingen waarmee je die bescherming omzeilt.
  3. Schoon HTML op met een betrouwbare sanitizer als gebruikers opgemaakte tekst mogen invoeren.
  4. Voeg extra lagen toe, zoals een Content Security Policy en een WAF. OWASP waarschuwt dat je niet alleen op zo’n extra laag moet vertrouwen.

Voorbeeld uit de praktijk

Vanaf 11 oktober 2023 misbruikte de groep Winter Vivern een XSS-kwetsbaarheid in Roundcube, een veelgebruikte webmailtoepassing. Doelwitten waren Roundcube-servers van overheidsorganisaties en een denktank, allemaal in Europa. Het slachtoffer hoefde alleen een speciaal gemaakte e-mail in de browser te bekijken; de code in het bericht stuurde daarna e-mails door naar de aanvallers (bron: ESET, 2023).

Het lek, CVE-2023-5631, was op dat moment nog onbekend bij de makers: een zero-day. Roundcube bracht op 16 oktober 2023 updates uit. Het Amerikaanse CISA zette de kwetsbaarheid op 26 oktober 2023 op zijn lijst van actief misbruikte kwetsbaarheden, als persistent cross-site scripting.

Cross-site scripting in de praktijk van een security-professional

XSS is een klassiek onderwerp bij het testen van webapplicaties. Een ethical hacker probeert tijdens een pentest in elk invoerveld, elke parameter en elk bericht of er code terugkomt in de pagina. Dat hoort bij de basisstof van de opleiding ethical hacking.

Een security architect kiest frameworks en standaarden die XSS zoveel mogelijk voorkomen, volgens het principe van security by design. Een security consultant controleert of ontwikkelteams de OWASP-richtlijnen volgen en of kwetsbare onderdelen, zoals webmailsoftware, op tijd worden bijgewerkt.

Veelgestelde vragen

Welke soorten cross-site scripting zijn er?

OWASP onderscheidt 3 soorten. Bij reflected XSS kaatst de website kwaadaardige invoer uit een link of formulier direct terug. Bij stored XSS staat de code opgeslagen op de server, bijvoorbeeld in een reactie, en krijgt elke bezoeker die mee. Bij DOM-based XSS verwerkt een script in de browser onveilige invoer.

Hoe voorkom je cross-site scripting?

Codeer alle uitvoer passend bij de plek op de pagina en gebruik een webframework dat automatisch escapet. Schoon opgemaakte tekst van gebruikers op met een sanitizer. Een Content Security Policy en een web application firewall helpen als extra laag, maar zijn volgens OWASP geen vervanging van veilige code.

Wat is cross-site request forgery?

Cross-site request forgery (CSRF) is een aanval waarbij een ingelogde gebruiker ongemerkt een handeling uitvoert op een website, bijvoorbeeld via een link in een e-mail. Denk aan geld overmaken of een e-mailadres wijzigen. Het verschil met XSS: bij CSRF draait er geen kwaadaardige code op de website, maar misbruikt de aanvaller de actieve sessie.

Bronnen

  1. OWASP: Cross Site Scripting (XSS)
  2. OWASP Top 10:2025, A05 Injection
  3. OWASP Cheat Sheet Series: Cross Site Scripting Prevention
  4. OWASP: Cross Site Request Forgery (CSRF)
  5. ESET: Winter Vivern exploits zero-day vulnerability in Roundcube Webmail servers (2023)
  6. CISA: Known Exploited Vulnerabilities Catalog

Gerelateerde begrippen

  • SQL-injectie

    SQL-injectie is een aanval op een website of applicatie waarbij een aanvaller eigen SQL-code invoert in bijvoorbeeld een zoekveld, inlogveld of webadres. Als de applicatie die invoer niet scheidt van haar eigen databaseopdracht, voert de database de code van de aanvaller uit. Die kan dan gegevens inzien, wijzigen of verwijderen die niet voor hem bedoeld zijn.

  • WAF (web application firewall)

    WAF staat voor web application firewall: een beveiligingslaag die het HTTP-verkeer naar een website of webapplicatie controleert. Een WAF vergelijkt elk verzoek met regels en blokkeert verzoeken die lijken op bekende aanvallen, zoals SQL-injectie en cross-site scripting. Zo beschermt een WAF de applicatie ook wanneer de code zelf nog kwetsbaarheden bevat.

  • Zero-day

    Een zero-day is een kwetsbaarheid in software of hardware die aanvallers al misbruiken voordat de maker ervan weet of een beveiligingsupdate heeft uitgebracht. De naam geeft aan dat de maker 0 dagen had om het lek te dichten. Een zero-day exploit is de code of methode waarmee aanvallers zo'n onbekend lek misbruiken.

  • Security by design

    Security by design is een ontwerpprincipe waarbij beveiliging vanaf de ontwerpfase wordt meegenomen in een applicatie, product of dienst, in plaats van achteraf te worden toegevoegd. Risicoanalyse, beveiligingseisen en veilige standaardinstellingen horen dan bij elke stap van de ontwikkeling. De Europese Cyber Resilience Act maakt deze aanpak voor digitale producten verplicht.

  • Pentest

    Een pentest, voluit penetratietest, is een gecontroleerde aanval op een computersysteem, netwerk of applicatie. Een getrainde tester kruipt in de rol van aanvaller, zoekt kwetsbaarheden en probeert die uit te buiten. Zo ziet een organisatie hoe ver een echte aanvaller zou komen, voordat die het zelf probeert.