XSS (DOM) — Medium
De backend ontwikkelaar probeert de DOM kwetsbaarheid in het Medium level te patchen door op de server in te grijpen.
1. Predict (Voorspel)
Voordat de webpagina aan de browser wordt gegeven, voert de webserver deze PHP code uit op de opgevraagde URL-parameter:
if (stripos ($_GET['default'], "<script") !== false) {
header ("location: ?default=English");
exit;
}
Vraag: Wat doet dit server-side filter, en is hiermee de DOM-XSS kwetsbaarheid écht verdwenen?
Antwoord
Het filter controleert of het woordje <script in de adresbalk staat. Zo ja, stuurt hij je direct terug naar de standaard Engelse versie.
Het is echter niet volledig! Net als bij eerdere kwetsbaarheden wordt hier alleen de <script> tag afgevangen. We kunnen nog steeds afbeeldingen, iFrames en SVG-elementen misbruiken om JavaScript te injecteren in de DOM!
2. Run & Investigate
Start het lab.
Probeer conceptueel de originele <script>alert(1)</script> te gebruiken (dit zal mislukken of omgeleid worden).
3. Modify & Make (Aanpassen & Maken)
Schrijf een payload die de server-side controle omzeilt en via de client-side DOM alsnog zijn werk doet.
Tip
Net als in de eerdere Low opdracht moet je eerst uit de <select> dropdown breken. Sluit de select tag af (></select>) en voeg dan een afbeelding met het onerror attribuut in.
Antwoord
Plaats dit achteraan in de adresbalk (als waarde voor default=):
English></select><img src="x" onerror="alert(1)">
De frontend JavaScript plakt dit in de DOM. Omdat de tag geen script bevat, laat de backend-server het netjes door!
4. ✓ Wat moest je zien?
- Bij
<script>-payloads word je teruggestuurd naar?default=English— de backend filter heeft je geweigerd. - Bij de
<img onerror>-payload verschijnt een popup zonder dat de server iets blokkeert. - In F12 Elements zie je de gebroken
<select>-tag en het<img>element naast elkaar in de DOM.
Krijg je nog steeds een redirect of geen popup? Controleer dat je payload niet het woord "script" bevat — de backend zoekt case-insensitive op die letters.