Ga naar hoofdinhoud

XSS (Reflected) — High

Het wordt lastiger. De ontwikkelaar pakt nu de 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 &lt;script&gt; als &lt;SCRIPT&gt; en zelfs rommelige varianten zoals &lt; s c r i p t &gt; worden nu feilloos geblokkeerd. Is het toch mogelijk om JavaScript in een webpagina uit te voeren zonder de &lt;script&gt; tag te gebruiken?

Antwoord

Ja! JavaScript kan ook geactiveerd worden via zogeheten Event Handlers in compleet andere HTML elementen. Bijvoorbeeld als een afbeelding niet kan inladen (onerror), of als je met de muis over een knop beweegt (onmouseover). Bijvoorbeeld: &lt;img src="bestaatniet.jpg" onerror="alert(1)"&gt;

2. Run & Investigate

Start het lab:

Laden...

Probeer al je voorgaande hacks. Niets met het woord "script" er in lijkt nog te werken.

3. 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 je browser automatisch een stukje JavaScript uitvoeren via het onerror attribuut.

Antwoord

Vul in: &lt;img src=x onerror=alert("hacked")&gt; of &lt;svg onload=alert(1)&gt;. Zodra je dit indient, ziet de filter géén script tag, en laat de payload door. De browser probeert vervolgens afbeelding "x" te laden. Dat mislukt (want die bestaat niet), en de onerror knalt er een pop-up in!

4. ✓ Wat moest je zien?

Controle
  • Met <script> in welke vorm dan ook: niets gebeurt of de tag wordt zichtbaar weggeknipt.
  • Met <img src=x onerror=alert("hacked")> (of <svg onload=alert(1)>): er verschijnt een popup zonder dat het woord "script" überhaupt in je payload zat.
  • Op de pagina zie je een gebroken afbeeldings-icoontje (de "x" die niet bestaat) — dat is wat de onerror triggerde.

Geen popup? Controleer dat je de aanhalingstekens correct gebruikt (src=x zonder quotes werkt vaak het soepelst) en dat de payload niet binnen een ander value="…" attribuut wordt geplakt.

5. Er gaat iets mis...

Je probeert de payload &lt;body onload=alert(1)&gt;, 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 &lt;input value="..."&gt;), dan werken sommige tags (zoals &lt;body&gt;) simpelweg niet omdat browsers ze daar negeren. De &lt;img&gt; of &lt;svg&gt; trick werkt vrijwel altijd, zolang je eerst uit de eventueel omliggende aanhalingstekens breekt!