cybercursus

XSS basée sur le DOM : quand tout se passe côté client

10 min · Intermédiaire · 7 août 2026

Sommaire
  1. Une faille sans aucun aller-retour serveur
  2. Le vocabulaire : source et sink
  3. La démonstration : tape, regarde s’exécuter

Une faille sans aucun aller-retour serveur

Les deux chapitres précédents impliquaient tous les deux un serveur : soit pour refléter une valeur reçue, soit pour la stocker et la resservir. Une XSS basée sur le DOM n’a besoin ni de l’un ni de l’autre : la faille vit entièrement dans le JavaScript qui tourne déjà dans le navigateur.

Le vocabulaire : source et sink

Deux notions suffisent à décrire n’importe quelle XSS DOM-based :

  • Une source : l’endroit d’où vient une donnée que le site ne contrôle pas (location.hash, un champ de saisie, document.referrer, un message reçu via postMessage).
  • Un sink : l’endroit où cette donnée est écrite d’une façon qui peut être interprétée comme du code actif (innerHTML, document.write, eval).
text
const valeur = champDeSaisie.value;   // source : donnee non fiable
element.innerHTML = valeur;            // sink : ecriture dangereuse

Dès qu’une donnée voyage d’une source vers un sink sans passer par un traitement qui neutralise le HTML actif, la faille existe, indépendamment de tout serveur.

La démonstration : tape, regarde s’exécuter

Contrairement aux démonstrations précédentes, celle-ci est directement pilotée par ce que tu tapes. Le champ ci-dessous écrit sa valeur dans la page en temps réel, via innerHTML :

html
<!-- HTML -->
<input type="text" id="champ" placeholder="Tape ici..." style="width:100%;box-sizing:border-box;padding:6px;" />
<div id="resultat" style="margin-top:10px;"></div>

// JS
document.getElementById('champ').addEventListener('input', function (e) {
// Sink dangereux : le texte tape est ecrit directement dans le DOM
document.getElementById('resultat').innerHTML = e.target.value;
});

Tape <img src=x onerror="console.log('XSS DOM executee')"> dans le champ : le message apparaît dans la console dès que tu termines de taper la balise, sans rechargement de page, sans aucun serveur impliqué.

Attention

Ce même code fonctionnerait à l’identique sur un site 100 % statique, hébergé sans aucun backend. C’est le piège de cette famille de XSS : l’absence de serveur applicatif ne met jamais un site à l’abri des failles côté client.

Qu'est-ce qui distingue une XSS DOM-based des deux familles précédentes ?
Dans le vocabulaire des XSS DOM-based, que désigne un « sink » ?

Pour aller plus loin

Commentaires

Recherche