Ga naar hoofdinhoud

XSS (Reflected) — Impossible

Welkom op het hoogste niveau. Hoe pakken we XSS voor eens en voor altijd aan?

1. Predict (Voorspel)

De code is aangepast naar dit:

$name = htmlspecialchars( $_GET[ 'name' ] );
echo "Hello " . $name;

Vraag: Wat doet htmlspecialchars() en waarom stopt dit XSS?

Antwoord

htmlspecialchars() vertaalt de speciale karakters (die code vormen) naar zogeheten HTML-entiteiten. Het klein-dan teken < wordt &lt; (Less Than). Het groter-dan teken > wordt &gt; (Greater Than).

Als jij dus <script>alert(1)</script> invult, spuugt de server dit uit: &lt;script&gt;alert(1)&lt;/script&gt;. Jouw browser ziet deze entiteiten en denkt: "Ah, de gebruiker wil letterlijk dat ik een pijltje-teken teken!" De browser tekent het als veilige tekst op het scherm, in plaats van het uit te voeren als code.

2. Run & Investigate

Start het lab.

Laden...

Probeer elke XSS truc die je kent. Je zult zien dat de tekst exact op je scherm wordt afgedrukt zoals je het hebt getypt, zonder dat de browser het uitvoert.

3. ✓ Wat moest je zien?

Controle
  • Welke payload je ook intypt (<script>, <img onerror>, <svg>): geen enkele popup.
  • Op de pagina zie je je payload letterlijk als tekst terug, inclusief de < en > (in de broncode worden die &lt; en &gt;).
  • In F12 Elements zie je dat je input is omgezet naar HTML-entiteiten — de browser ziet platte tekst, geen tags.

Krijg je tóch een popup? Controleer dat het level rechtsboven op Impossible staat.

Wat heb je geleerd?

  • Blacklisting werkt niet: Het proberen weg te filteren van <script> of andere specifieke elementen faalt altijd, omdat HTML en browsers te veel alternatieve ontsnappingsroutes bieden (onerror, <svg>, hoofdletters, encoderen).
  • Escapen is de oplossing: Voordat je data van een gebruiker op het scherm toont, moet je dit altijd escapen. Functies zoals htmlspecialchars() zorgen ervoor dat de browser weet dat het platte tekst is, en geen code.