Un commentaire peut-il attaquer tous les visiteurs ?
Le script intersite, ou XSS (cross-site scripting), est une faille où un site affiche un texte tapé par un visiteur comme du code. Le navigateur de chaque personne qui ouvre la page exécute alors ce code.
Aujourd'hui, tu comprends pourquoi, et tu apprends la défense : l'échappement.
À la fin de cette leçon
Remarque
Je peux repérer une faille de script intersite et la corriger par l'échappement.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| HTML | le langage qui décrit une page web | <b>gras</b> |
| Script intersite | un texte d'un visiteur qui s'exécute chez les autres | |
| Échappement | remplacer les signes spéciaux par des codes inoffensifs | |
| Entité HTML | un code qui affiche un signe sans qu'il agisse | < |
| Navigateur | le programme qui affiche les pages web |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La règle de ce lab
Important
Tu travailles seulement sur ta propre copie du lab DVWA, avec la permission de ton enseignant. Ne glisse jamais un script dans le site de quelqu'un d'autre, même une page de classe. On apprend la faille pour savoir la fermer.
Comment un commentaire devient du code
Un site de lycée affiche les commentaires des élèves sous un article. Il écrit le texte tapé directement dans la page HTML.
Si un élève tape des signes que HTML comprend, comme < et >, le navigateur ne les affiche pas : il les prend pour des balises. Un script caché dans le commentaire tournerait chez tous les lecteurs.
Exemple : ce que reçoit le navigateur
| Commentaire tapé | HTML envoyé à la page | Ce que voit le lecteur |
|---|---|---|
| Bravo ! | <p>Bravo !</p> | Bravo ! |
| <b>Bravo</b> | <p><b>Bravo</b></p> | Bravo en gras : le texte a agi comme du code |
| 5 < 8 | <p>5 < 8</p> | Un affichage cassé : le signe < est pris pour une balise |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Comment corriger : échapper le texte
Échapper un texte, c'est remplacer chaque signe spécial par une entité HTML. Le navigateur l'affiche comme un signe, sans le prendre pour une balise.
On le fait à l'écriture dans la page, pas à l'enregistrement. Et on remplace d'abord &, sinon on abîme les codes déjà écrits.
Les cinq signes à remplacer
| Signe | Entité | Pourquoi |
|---|---|---|
| & | & | Il commence les entités : à faire en premier |
| < | < | Il ouvre une balise |
| > | > | Il ferme une balise |
| " | " | Il ferme une valeur entre guillemets |
| ' | ' | Il ferme une valeur entre apostrophes |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Exemple : échapper un commentaire en Python
def echapper(texte):
# Le & d'abord, sinon les codes suivants seraient abîmés.
texte = texte.replace("&", "&")
texte = texte.replace("<", "<")
texte = texte.replace(">", ">")
return texte
# Change le commentaire et relance.
print(echapper("<b>Bravo</b> & merci"))
Une erreur fréquente
Attention
Beaucoup pensent qu'il suffit de refuser le mot « script ». Ce n'est pas assez : une page peut agir avec d'autres balises. La bonne défense est d'échapper tout ce qu'un visiteur a tapé, à chaque endroit où on l'écrit dans la page.
Avant de commencer
Remarque
Appuie sur Start the lab et attends que DVWA soit prête. Le terminal du lab peut parler à la copie de DVWA avec l'adresse http://dvwa/. Dans cette leçon, tu regardes seulement la page de connexion.
Demande la réponse de la page de connexion
curl -sI http://dvwa/login.php | head -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Demande le code de la page d'installation
curl -s -o /dev/null -w "%{http_code}\n" http://dvwa/setup.phpAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
À quoi servent les niveaux de DVWA ?
DVWA a un niveau de sécurité qu'on change dans le lab. Au niveau bas, le code affiche tout tel quel. Au niveau haut, il échappe ou filtre ce qu'on lui envoie.
Comparer les deux, dans le lab, montre à quoi ressemble du code corrigé. Tu y compareras ce que fait la page avant et après.
Pour aller plus loin : une défense en plus
Un site peut aussi dire au navigateur de refuser les scripts qui ne viennent pas de lui. Cette règle s'envoie dans les en-têtes de la réponse.
Pourquoi cette règle ne remplace-t-elle pas l'échappement ? Réponds avec les mots défense et faille.