Démo pédagogique : attaques Cross‑Site Scripting (XSS)

Caractéristique XSS Réfléchi
(Reflected)
XSS Stocké
(Stored)
XSS DOM‑based
(Client‑side)
Source du payload Paramètre URL (query string) Base de données / stockage serveur (commentaires, profils…) Fragment d’URL (location.hash), localStorage, etc. qui n'est pas envoyé au serveur mais uniquement chargé en local
Implication du serveur Renvoie et « réfléchit » directement le payload Stocke et distribue le payload à chaque chargement Ne voit pas le payload – page servie « propre »
Mécanisme d’injection innerHTML ou insertion directe du paramètre non échappé Lecture du contenu stocké et injection dans le HTML sans échappement Script client lit location.hash, tout ce qui suit “#” ajouré à l'URL du site, et injecte via innerHTML
Moment d’exécution Au clic sur le lien piégé À chaque affichage de la page Au chargement / interaction côté client
Persistance Temporaire : nécessite un nouveau clic Persistant tant que stocké en base Temporaire : vit dans l’URL/hash ou session
Exemple typique Chaîne de requête ajoutée à l'URL du site ?q=<script>alert(1)</script> Commentaire blog : <script>alert('XSS')</script> URL : #<img src=x onerror=alert(1)>
Prévention Échap. des query params, validation serveur, CSP Échap./sanitization, validation, CSP Assainir tout usage de location.*, CSP

1. XSS stocké (Stored XSS)

Exemple

Entrez un commentaire (HTML/JS autorisé car non échappé) par exemple <script>alert('XSS attack')</script> et envoyez. Le script malveillant est enregistré une fois sur le serveur puis il est servi pour toutes les requêtes utilisateurs qui suivront.

Commentaires affichés ici

2. XSS réfléchi (Reflected XSS)

Exemple

Cliquez ici pour déclencher l'attaque réfléchie

3. XSS basé sur le DOM (DOM-based XSS)

Exemple

Cliquez ici pour insérer un diagramme non désiré dans la page.