Ga naar hoofdinhoud

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 &lt;script&gt; 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:

Laden...

Probeer een script in te voeren in het "Name" veld (bijv. &lt;SCRIPT&gt;alert(1)&lt;/SCRIPT&gt;). 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
  1. Druk op F12. Inspecteer het veld "Name".
  2. Verander de code maxlength="10" naar maxlength="100".
  3. Typ nu je XSS payload in het Name veld: &lt;SCRIPT&gt;alert(1)&lt;/SCRIPT&gt;.
  4. Typ een willekeurig bericht en klik Submit. Kassa!

4. ✓ Wat moest je zien?

Controle
  • In het Name-veld kun je dankzij de aangepaste maxlength veel 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.