XSS (Reflected) â High
Het wordt lastiger. De ontwikkelaar pakt nu reguliere expressies (regex) erbij om alle script-tags te blokkeren.
1. Predict (Voorspel)â
De beveiligingscode ziet er nu als volgt uit:
// Het /i vlaggetje betekent 'case-insensitive' (hoofdletterongevoelig)
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
echo "Hello " . $name;
Vraag: Zowel <script> als <SCRIPT> en zelfs rommelige varianten zoals < s c r i p t > worden nu feilloos geblokkeerd. Is het toch mogelijk om JavaScript in een webpagina uit te voeren zonder de <script>-tag te gebruiken?
Antwoord
Ja. JavaScript kan ook geactiveerd worden via Event Handlers in andere HTML-elementen. Bijvoorbeeld als een afbeelding niet kan inladen (onerror), of als je met de muis over een knop beweegt (onmouseover).
Bijvoorbeeld: <img src="bestaatniet.jpg" onerror="alert(1)">
2. Run (Uitvoeren)â
Start het lab en observeer het normale gedrag.
Vul een gewone naam in en klik op Submit. Bevestig dat de applicatie normaal werkt.
3. Investigate (Onderzoeken)â
Probeer achtereenvolgens <script>alert(1);</script> en <SCRIPT>alert(1);</SCRIPT> in het veld. Kijk ook eens wat er gebeurt als je <img src=x> invoert.
Vraag: Worden alle script-varianten geblokkeerd? Wat verschijnt er wel op de pagina als je een <img>-tag invoert?
Antwoord
Alle varianten met het woord "script" worden verwijderd. Maar de <img>-tag verschijnt wÊl â de browser probeert afbeelding x in te laden. Die bestaat niet, maar de tag zelf werd niet gefilterd. Dit onthult dat het filter specifiek zoekt naar het woord "script" en andere HTML-elementen ongemoeid laat. Event Handlers zoals onerror zijn een manier om JavaScript uit te voeren via zo'n ongefilterde tag.
4. Modify & Make (Aanpassen & Maken)â
Jouw taak is om een XSS-aanval te bouwen zonder de string "script" te gebruiken.
Tip
Laad een nep-afbeelding in. Als een afbeelding crasht, kan de browser automatisch een stukje JavaScript uitvoeren via het onerror-attribuut.
Antwoord
Vul in: <img src=x onerror=alert("hacked")> of <svg onload=alert(1)>.
Zodra je dit indient, ziet het filter gÊÊn "script"-tag, en laat de payload door. De browser probeert afbeelding "x" te laden. Dat mislukt (want die bestaat niet), en de onerror-handler triggert een pop-up.
5. â Wat moest je zien?â
<img src=x onerror=alert("hacked")>triggert de pop-up ondanks het script-filter.<script>alert(1);</script>en<SCRIPT>worden beide geblokkeerd.- De pop-up bewijst dat JavaScript via een andere HTML-tag werd uitgevoerd.
Geen pop-up? Controleer of je de aanhalingstekens correct hebt â sommige browsers accepteren ook onerror=alert(1) zonder aanhalingstekens.
6. Er gaat iets mis...â
Je probeert de payload <body onload=alert(1)>, maar er gebeurt niets.
Let op waar de payload wordt gereflecteerd in de pagina. Als jouw payload midden in een bestaande HTML-tag wordt geplakt (bijvoorbeeld binnen een <input value="...">), dan werken sommige tags (zoals <body>) simpelweg niet omdat browsers ze daar negeren. De <img> of <svg>-truc werkt vrijwel altijd, zolang je eerst uit de eventueel omliggende aanhalingstekens breekt.