XSS (Reflected) — Medium
Op het Medium niveau is een beveiliging toegevoegd om de <script> tags tegen te houden.
1. Predict (Voorspel)
De programmeur gebruikt nu de str_replace() functie om het probleem op te lossen:
// Haal het woord <script> weg uit de naam
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
echo "Hello " . $name;
Vraag: Waarom is dit geen sluitende oplossing? Kun je een manier bedenken om alsnog JavaScript op de pagina te krijgen, zónder dat het exacte woordje <script> (alles in kleine letters) wordt gebruikt?
Antwoord
De functie str_replace is hoofdlettergevoelig. Het filtert wél <script>, maar kijkt helemaal niet naar <SCRIPT> of <Script>. HTML en browsers zijn echter heel flexibel: een browser snapt <SCRIPT> net zo goed!
Een andere truc is het nesten van scripts: <scr<script>ipt>. Het filter haalt het binnenste woordje weg, waardoor de buitenste letters tegen elkaar plakken en alsnog <script> vormen!
2. Run & Investigate
Start het lab:
Probeer je oude aanval (<script>alert(1);</script>). Wat zie je?
De tekst zegt "Hello alert(1);</script>". Het filter heeft letterlijk het eerste woordje <script> eruit geknipt!
3. Modify & Make (Aanpassen & Maken)
Bedenk nu een manier om het filter te slim af te zijn en alsnog je pop-up te laten verschijnen.
Tip
Maak gebruik van de hoofdlettergevoeligheid van het filter.
Antwoord
Vul in: <SCRIPT>alert(1);</SCRIPT>. Omdat het filter alleen naar kleine letters zoekt, wordt dit volledig genegeerd. De browser voert het keurig uit!
4. ✓ Wat moest je zien?
- Met
<script>...</script>in kleine letters: de tekst verschijnt half geknipt op het scherm en er is géén popup. - Met
<SCRIPT>alert(1);</SCRIPT>(of<scr<script>ipt>): er verschijnt wel een popup — het filter is omzeild. - De pagina toont na de popup
Hellozonder zichtbare scripttekst — de hoofdletter-variant heeft het filter compleet gepasseerd.
Werkt <SCRIPT> niet? Probeer dan de nesting-truc <scr<script>ipt>alert(1)</scr</script>ipt> — sommige varianten van DVWA filteren wél case-insensitive maar nog steeds maar één keer.
5. Er gaat iets mis...
Soms gebruik je <SCRIPT> en werkt het nog steeds niet. In veel moderne backend talen wordt de input stiekem eerst omgezet naar kleine letters (strtolower) voordat er bewerkingen worden uitgevoerd, wat de truc ongedaan maakt. Hakken in software vereist constant meebewegen met kleine details!