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 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 aan elkaar plakken en alsnog <script> vormen.
2. Run (Uitvoeren)โ
Start het lab en observeer het normale gedrag.
Vul een gewone naam in en klik op Submit. Bekijk hoe de pagina reageert.
3. Investigate (Onderzoeken)โ
Probeer je eerdere aanval: vul <script>alert(1);</script> in en klik op Submit.
Vraag: Wat zie je op het scherm? Wordt de alert getriggerd, of verschijnt er iets anders? Wat onthult de reactie van de pagina over het filter?
Antwoord
De tekst zegt iets als "Hello alert(1);</script>" โ het filter heeft letterlijk het <script>-tag eruit geknipt, maar de rest van de payload staat er nog. Dit onthult hoe het filter werkt: het zoekt exact naar de string <script> in kleine letters en verwijdert die. Alles wat hiervan afwijkt (andere hoofdletters, geneste tags) laat het door.
4. 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.
5. โ Wat moest je zien?โ
<SCRIPT>alert(1);</SCRIPT>triggert de pop-up โ het filter laat het door.<script>alert(1);</script>triggert gรฉรฉn pop-up โ het filter verwijdert de tags.- Het verschil bewijst dat het filter hoofdlettergevoelig is.
Werkt <SCRIPT> ook niet? Probeer de geneste variant: <scr<script>ipt>alert(1);</scr<script>ipt>.
6. 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. Hacken in software vereist constant meebewegen met kleine details.