Ga naar hoofdinhoud

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.

Laden...

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?

Controle
  • <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.