Les attaques de type Cross-Site Scripting (XSS) consistent à injecter des scripts malveillants dans les pages web. Ces attaques sont exploitables sur des sites qui affichent les données entrées par l'utilisateur sans filtration appropriée.
Exemple de faille XSS
Pour comprendre l'impact de cette faille imaginons que le code suivant est utilisé pour générer le retour HTML.
response.write(`<h1>${comment.content}</h1>`)
Si l'utilisateur poste un message contenant de l'HTML, ce code HTML sera interprété par le navigateur. Ainsi si on injecte un commentaire avec le message Je fais une injection <img src="/xxx" onerror="window.location.href = 'https://grafikart.fr'">
le rendu HTML sera le suivant.
<h1>
Je fais une injection
<img
src="/xxx"
onerror="window.location.href = 'https://grafikart.fr'">
</h1>
Si un utilisateur charge la page avec ce commentaire il sera automatiquement redirigé vers le site et il n'est plus possible de voir la page.
C'est un exemple simple mais cette faille peut être exploiter pour injecter du JavaScript beaucoup plus malicieux :
- Ecouter les frappes du clavier sur le site pour récupérer des identifiants / code de paiements.
- Récupérer des cookies (non HTTP) et le contenu du localStorage.
- Rediriger vers un site de phishing ou déclencher le téléchargement de virus.
Comment se protéger ?
Pour éviter cette faille il faut assainir les chaînes de caractères lorsqu'on les injecte dans la page en remplaçant les caractères spéciaux par leur entité html.
htmlspecialchars("<strong>") // "<strong>"
De cette manière la page n'interprètera pas l'HTML et affichera bien le texte <strong>
. Dans certains langages des fonctions sont disponibles nativement (comme htmlspecialchars dans PHP) mais dans d'autres vous devrez créer une fonction pour faire cette conversion.
Les moteurs de template
On notera que la plupart des moteurs de template (Twig, Blade, Jinja, Eta) échappent les caractères HTML et vous protège donc par défaut contre ce genre d'attaque. Aussi, si vous utilisez un framework il y a de forte chance que vous soyez déjà protégé contre ce type d'attaques (pensez tout de même à vérifier que cela soit bien le cas).
Tester son site
Si vous voulez tester votre site contre ce type d'attaque vous pouvez utiliser XSStrike (nécessite python) qui est un outil capable de tester une URL ou tout un site contre les failles XSS les plus répandues.