XSS (DOM) — Low
Bij DOM-based XSS vindt de aanval volledig in de browser (via JavaScript) plaats. De server in de achtergrond doet er soms niet eens toe!
1. Predict (Voorspel)
Bij het openen van deze pagina, staat er een parameter in je URL: ?default=English.
De broncode van de webpagina bevat dit stukje JavaScript:
var lang = document.location.href.substring(document.location.href.indexOf("default=") + 8);
document.write("<option value='" + lang + "'>" + lang + "</option>");
Vraag: Wat gebeurt er als je het woord English in de adresbalk verandert in een stukje HTML zoals <script>alert(1)</script> ?
Antwoord
De JavaScript-code in je eigen browser pakt exact de letters achter default= uit de URL-balk en 'schrijft' dit met document.write() in de pagina. Jouw <script> tag wordt daardoor midden in de dropdown box opgebouwd en direct door de browser uitgevoerd!
2. Run & Investigate
Start de testomgeving. In DVWA zie je een dropdown voor talen.
De echte DOM-XSS test in DVWA speel je het makkelijkst door de URL-parameter aan te passen. Binnen deze lab-simulatie zul je het via de URL structuur van de iframe moeten doen, of conceptueel begrijpen.
3. Modify & Make (Aanpassen & Maken)
Omdat de tekst klakkeloos achter <option value=' wordt geplakt in de pagina, moeten we er soms eerst voor zorgen dat we de HTML-tag 'afsluiten' voordat we onze XSS payload inbrengen.
Tip
Verander de parameterwaarde in de URL (of in theorie) in: ></option><script>alert(1)</script>
Antwoord
Door de string te beginnen met ></option> sluit je de openstaande tag van de ontwikkelaar netjes af. Daarna kun je je eigen <script> openen. DOM-XSS vereist vaak een stukje "HTML-puzzelen" om de structuur weer heel te maken!
4. ✓ Wat moest je zien?
- Direct na het laden van de URL met je payload verschijnt een popup — er is niet eens een Submit-knop nodig, de DOM-mutatie gebeurt bij het opbouwen van de pagina.
- De dropdown
<select>is zichtbaar gebroken: jouw</option>-afsluiter heeft de structuur van het keuzemenu opengebroken. - In F12 Elements zie je dat je
<script>-tag daadwerkelijk in de DOM staat (niet alleen in de URL).
Geen popup? Veel moderne browsers blokkeren document.write() of inline scripts via een interne XSS-bescherming. Probeer een andere browser of een lokale DVWA-installatie.
5. Er gaat iets mis...
Je typt keurig je JavaScript-payload en... er gebeurt niets. Vaak blokkeren moderne webbrowsers document.write() als ze merken dat er plots een script uit het niets wordt geschreven. Dit is een ingebouwde browserbeveiliging. Hacken met DOM XSS is in moderne browsers extreem lastig geworden zonder complexe bypasses!