DOM-based XSS is een variant van Cross Site Scripting waarbij de kwetsbaarheid niet ontstaat door de server, maar door de manier waarop client-side JavaScript omgaat met gebruikersinvoer. In plaats van dat de server het script injecteert, gebeurt de injectie en uitvoering volledig in de browser van de gebruiker, door manipulatie van de DOM (Document Object Model).
Het proces verloopt meestal als volgt:
innerHTML of document.write te gebruiken, zonder de invoer te ontsmetten.Omdat de server niet betrokken is bij de injectie of uitvoering van het script, zijn traditionele server-side beveiligingsmaatregelen vaak niet effectief. De kwetsbaarheid zit volledig in de front-end code, waardoor deze makkelijk over het hoofd wordt gezien.
Stel je voor dat een pagina de waarde van een URL-parameter direct in de DOM plaatst:
// Onveilige verwerking van gebruikersinvoer
const params = new URLSearchParams(window.location.search);
const name = params.get('name');
document.getElementById('welcome').innerHTML = "Welkom, " + name + "!";
Als een aanvaller nu de volgende URL gebruikt:
https://voorbeeld.nl/?name=<img src=x onerror="alert('XSS')">
Dan wordt het script uitgevoerd zodra de pagina wordt geladen, omdat de invoer direct in de DOM wordt geplaatst zonder ontsmetting.
textContent of andere veilige methoden.DOM-based XSS is een subtiele maar gevaarlijke vorm van XSS die volledig in de browser plaatsvindt. Omdat de server hier geen rol in speelt, is het essentieel om ook je front-end code te beveiligen en bewust te zijn van de risico’s van onveilige DOM-manipulatie.
Natuurlijk! Hier is een codevoorbeeld van een DOM-based XSS-kwetsbaarheid in JavaScript, gevolgd door uitleg en een veilige oplossing.
Stel je hebt een pagina die een gebruikersnaam uit de URL leest en deze direct in de DOM plaatst:
// Onveilige verwerking van gebruikersinvoer
const params = new URLSearchParams(window.location.search);
const name = params.get('name');
document.getElementById('welcome').innerHTML = "Welkom, " + name + "!";
Aanval:
Een aanvaller kan nu een link sturen zoals:
https://voorbeeld.nl/?name=<img src=x onerror="alert('XSS')">
Als een slachtoffer deze link bezoekt, wordt het script uitgevoerd zodra de pagina laadt.
Gebruik altijd veilige methoden zoals textContent in plaats van innerHTML als je gebruikersinvoer in de DOM plaatst:
// Veilige verwerking van gebruikersinvoer
const params = new URLSearchParams(window.location.search);
const name = params.get('name');
document.getElementById('welcome').textContent = "Welkom, " + name + "!";
Nu wordt de invoer als gewone tekst weergegeven, en niet als HTML of script.