XSS (Stored) â Medium
De ontwikkelaar heeft gemerkt dat het berichtveld wordt misbruikt en voegt een filter toe.
1. Predict (Voorspel)â
De code op de backend is deels aangepast:
$message = strip_tags( addslashes( $_POST['txtMessage'] ) );
$name = str_replace( '<script>', '', $_POST['txtName'] );
Vraag: Het bericht (message) is nu muurvast beveiligd met strip_tags() (haalt alle HTML weg). Maar zie je een zwakte in de beveiliging van het $name-veld?
Antwoord
De variabele $name wordt wÊl nog met XSS-kwetsbare functies behandeld. De str_replace haalt alleen exacte <script>-tags weg. Dit lek zagen we eerder bij Reflected XSS: we kunnen dit eenvoudig omzeilen met hoofdletters of andere HTML-tags.
2. Run (Uitvoeren)â
Start het lab en bekijk het gastenboek.
Vul een onschuldige naam en een normaal bericht in. Klik op Submit en observeer dat het bericht netjes verschijnt.
3. Investigate (Onderzoeken)â
Probeer <script>alert(1);</script> in het Name-veld te typen. Let op wat er tijdens het typen al gebeurt.
Vraag: Wat valt je op? Kun je meer dan 10 tekens typen? Wat onthult dit over de beveiliging?
Antwoord
Je kunt maximaal 10 tekens typen â er zit een maxlength="10"-attribuut op het invoerveld. Dit is een client-side beperking in de HTML. De server heeft ook een filter op <script> in kleine letters. Dit onthult twee zwaktes: (1) de maxlength zit in de HTML en is via F12 te verwijderen, en (2) het filter is hoofdlettergevoelig.
4. Modify & Make (Aanpassen & Maken)â
Breek door de maxlength-beperking heen en injecteer je payload via het Name-veld.
Tip
Client-side beveiligingen kunnen worden uitgeschakeld. Gebruik F12 (Developer Tools) om de eigenschappen van het HTML-invoerveld te wijzigen.
Antwoord
- Druk op F12. Inspecteer het veld "Name".
- Verander de code
maxlength="10"naarmaxlength="100". - Typ nu je XSS-payload in het Name-veld:
<SCRIPT>alert(1);</SCRIPT>. - Typ een willekeurig bericht en klik Submit. De pop-up verschijnt.
5. â Wat moest je zien?â
- Na het aanpassen van
maxlengthnaar100kun je de volledige payload typen. <SCRIPT>alert(1);</SCRIPT>triggert een pop-up â het filter laat het door.- Na een paginaverversing verschijnt de pop-up opnieuw â het is opgeslagen.
Lukt het niet? Controleer of je het juiste HTML-element hebt aangepast (het <input name="txtName"> veld, niet het berichtveld).