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="save.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 ?

Il faut désactiver le JavaScript sur les entrées utilisateur :

  • Échapper les caractères spéciaux (<, >, ', ").
  • Utiliser htmlspecialchars() en PHP pour empêcher l’exécution de scripts.
  • 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 commentaires des visiteurs sans filtrer leur contenu :

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

Si un attaquant entre dans l’URL :

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

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

Correction

<?php
if (isset($_GET['commentaire'])) {
echo "Bonjour " . htmlspecialchars($_GET['commentaire']);
}
?>
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 n°1

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

Créez un dossier tp-xss.

Dans le dossier tp-xss, créez un fichier index.php avec le code suivant :

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

Lancez ce fichier sur un serveur local, avec la commande :

php -S localhost:8000

et testez avec l’URL :

http://localhost:8000/?message=%3Cscript%3Ealert(%27XSS%20!%27);%3C/script%3E

Le script s’exécute.

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

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

Étape 3 : Ajouter un enregistrement de cookies

setcookie('nom', "Dupont");
setcookie('prenom', "Jean");
?>

Étape 4 : Tester l'affichage des cookies

  • <script>document.cookie</script>

Étape 5 : 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 6 : Tester avec différentes entrées

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

Bonnes pratiques

  1. Créer une fonction pour centraliser (factorisation) le nettoyage des données en provenance de l'utilisateur :

    function cleanDataFromUser($data) {
    // Exemple de nettoyage des données utilisateur
    $data = trim(trim($data));
    $data = htmlspecialchars(trim($data));
    $data = stripslashes($data);
    return $data;
    }
  2. Utiliser cette fonction pour chaque donnée reçue :

        if (isset($_GET['nom'])) {
    echo "Message : " . cleanDataFromUser($_GET['nom']);
    }

    if (isset($_GET['prenom'])) {
    echo "Message : " . cleanDataFromUser($_GET['prenom']);
    }


    if (isset($_GET['message'])) {
    echo "Message : " . cleanDataFromUser($_GET['message']);
    }

TP n°2

  • créer un hébergement sur Adware pour la victime
  • créer un hébergement sur InfinityFree pour l'attaquant

Voici les fichiers à déposer (et adapter) dans l'hébergement pour la victime.

Voici les fichiers à déposer (et adapter) dans l'hébergement pour l'attaquant.