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="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']);
}
?>
Avec cette correction, le JavaScript ne s’exécute plus.
Test de mémorisation/compréhension
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
Vous devez être connecté pour voir le contenu.
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
-
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;
} -
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.