XSS (Stored) — Medium
De ontwikkelaar heeft gemerkt dat het "Bericht" vakje 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 & Investigate
Start het lab:
Probeer een script in te voeren in het "Name" veld (bijv. <SCRIPT>alert(1)</SCRIPT>). Wat valt je op tijdens het typen?
Je zult merken dat je niet verder kunt typen dan 10 karakters!
3. Modify & Make (Aanpassen & Maken)
De ontwikkelaar dacht slim te zijn: "Als ik de maximale lengte van het Naam-veld in de HTML op 10 zet, kunnen ze nooit een lang hack-script intypen!"
Dit heet een client-side limiet (maxlength="10").
Opdracht: Breek door de maxlength 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 invulveld 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. Kassa!
4. ✓ Wat moest je zien?
- In het Name-veld kun je dankzij de aangepaste
maxlengthveel meer dan 10 tekens typen. - Na Submit verschijnt er een popup — en bij elke verversing (F5) van het gastenboek opnieuw.
- Het Message-veld werd door
strip_tags()onschadelijk gemaakt; jouw aanval moest dus via Name lopen.
Lukt het niet? Controleer in F12 dat je daadwerkelijk het Name-veld inspecteert (niet Message) en dat maxlength op een hoger getal staat. De server kapt anders je payload na 10 karakters af.