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.