Aller au contenu principal

XSS

Cross-Site Scripting (XSS) : Comprendre et exploiter cette vulnérabilité

Notions théoriques

Le Cross-Site Scripting (XSS) est une faille de sécurité qui permet à un attaquant d’injecter du code JavaScript malveillant dans une page web consultée par d'autres utilisateurs.

Cette attaque est souvent utilisée pour :

  • voler des cookies,
  • rediriger des utilisateurs
  • ou modifier l'affichage d'une page Web.

Comment fonctionne une attaque XSS ?

  1. Injection de script : L'attaquant insère du code JavaScript dans un champ d'entrée (comme un commentaire, un formulaire ou une URL).
  2. Exécution du script : Lorsqu’un utilisateur visite la page, le script s’exécute dans son navigateur.
  3. Exploitation : L’attaquant peut récupérer des données sensibles (cookies, identifiants) ou modifier l'affichage de la page.

Types de XSS

  1. XSS stocké : Le script malveillant est enregistré dans la base de données et s'exécute à chaque affichage de la page.
  2. XSS réfléchi : Le script est injecté via une URL et s’exécute immédiatement lorsque l’utilisateur clique sur le lien.
  3. XSS basé sur le DOM : Le script est injecté et exécuté directement via le JavaScript du site sans passer par le serveur.

Exemple d'une attaque XSS

Un site affiche les commentaires des utilisateurs sans filtrer leur contenu :

<form action="commentaire.php" method="POST">
<input type="text" name="commentaire">
<button type="submit">Envoyer</button>
</form>

Si un attaquant entre :

<script>alert('XSS !');</script>

Ce script sera enregistré et exécuté par tous les visiteurs de la page.

Comment se protéger ?

  • Échapper les caractères spéciaux (<, >, ', ").
  • Utiliser htmlspecialchars() en PHP pour empêcher l’exécution de scripts.
  • Désactiver JavaScript sur les entrées utilisateur.
  • Utiliser un Content Security Policy (CSP) pour limiter l’exécution de scripts non autorisés.

Exemple pratique

Exploiter une faille XSS

Un site web affiche les noms des visiteurs sans filtrer leur contenu :

<?php
if (isset($_GET['nom'])) {
echo "Bonjour " . $_GET['nom'];
}
?>

Si un attaquant entre dans l’URL :

http://localhost/xss.php?nom=<script>alert('XSS !');</script>

Le script s’exécutera et affichera une alerte.

Correction

<?php
if (isset($_GET['nom'])) {
echo "Bonjour " . htmlspecialchars($_GET['nom'], ENT_QUOTES, 'UTF-8');
}
?>
astuce

Avec cette correction, le JavaScript ne s’exécute plus.


Test de mémorisation/compréhension


Quelle est la principale cause d'une faille XSS ?


Quel langage est utilisé dans une attaque XSS ?


Quel type de XSS est le plus dangereux ?


Que fait `htmlspecialchars()` en PHP ?


Quel est le but principal d'une attaque XSS ?


Comment un attaquant peut-il injecter un XSS réfléchi ?


Pourquoi un XSS stocké est-il plus dangereux qu'un XSS réfléchi ?


Quelle directive HTTP permet de limiter l'exécution de scripts malveillants ?


Quel élément HTML peut être utilisé pour injecter un XSS ?


Quelle est la meilleure prévention contre XSS ?



TP pour réfléchir et résoudre des problèmes

Étape 1 : Créer un fichier PHP vulnérable

Créez un fichier xss_test.php avec le code suivant :

<?php
if (isset($_GET['message'])) {
echo "Message : " . $_GET['message'];
}
?>

Lancez ce fichier sur un serveur local et testez avec l’URL :

http://localhost/xss_test.php?message=<script>alert('XSS !');</script>

Le script s’exécute.

Étape 2 : Corriger la vulnérabilité

Modifiez le fichier pour empêcher l’exécution de scripts.

Une solution

Rechargez la page et vérifiez que le script ne s’exécute plus.

Étape 3 : Tester avec différentes entrées

  • <b>Texte en gras</b>
  • <img src="x" onerror="alert('XSS')">
  • <script>document.cookie</script>