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 ?
- Injection de script : L'attaquant insère du code JavaScript dans un champ d'entrée (comme un commentaire, un formulaire ou une URL).
- Exécution du script : Lorsqu’un utilisateur visite la page, le script s’exécute dans son navigateur.
- Exploitation : L’attaquant peut récupérer des données sensibles (cookies, identifiants) ou modifier l'affichage de la page.
Types de XSS
- XSS stocké : Le script malveillant est enregistré dans la base de données et s'exécute à chaque affichage de la page.
- XSS réfléchi : Le script est injecté via une URL et s’exécute immédiatement lorsque l’utilisateur clique sur le lien.
- 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');
}
?>
Avec cette correction, le JavaScript ne s’exécute plus.
Test de mémorisation/compréhension
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
Vous devez être connecté pour voir le contenu.
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>