Qu'est-ce qu'une faille Cross-Site Scripting ?


Une XSS (aussi appelée Cross-Site Scripting) est une faille permettant l'injection de code (tout langage interprété par un navigateur) dans un site Web afin de modifier sa manière d'afficher. Elle provient majoritairement d'erreurs de programmation ou d'une trop grande confiance accordée aux entrées d’un utilisateur.
Il existe deux types de failles XSS : Reflected XSS (ou non persistante) et Stored XSS (ou persistante).

Une faille XSS permettrait à un individu de :


  • Faire des redirections dans le but de faire du phising

  • Voler des informations (Cookies, sessions, …)

  • Faire des actions sur le site vulnérable et à l’insu de la victime


Reflected XSS (ou non persistante)


Elle est dite non-persistante car elle n'est pas stockée dans un fichier ou dans une base de données. Ce type de faille XSS ne stocke pas le contenu malicieux sur le serveur web. Le contenu est par exemple livré à la victime via une URL qui le contient (envoyée par email ou par un autre moyen).

La plupart des navigateurs web ont intégré dans leurs dernières versions un filtre anti-XSS (Chrome, IE, Safari, Opera, Edge). Il analyse le rendu d'une page envoyée par le serveur et supprime toute occurence de javascript qui serait également présente dans la requête du client. Cela protège les utilisateurs d'une Reflected XSS mais pas d'une Persistent XSS.

Exemple :


Vous naviguez sur un site vous permettant de voir les prévisions météo pour une ville donnée. Le nom de la ville est fourni dans l’URL de la page via un paramètre « GET », comme ceci : www.meteo.com/previsionsmeteo?ville=Montpellier

Les prévisions pour la ville de Montpellier vous seront affichées sur la page retournée par le serveur du site météo. Le pirate pourra alors utiliser cette même URL pour fournir un contenu malicieux comme ceci : www.meteo.com/previsionsmeteo?ville=Montpellier<script>alert(document.cookie);</script>

Avec un tel contenu dans l’URL, le serveur web va donc afficher les prévisions météo pour Montpellier, mais va potentiellement aussi inclure le contenu dangereux dans la page.


Stored XSS (ou persistente)


La faille XSS persistente est la plus dangeurese car elle sera exécuté à chaque chargement du site. En effet, cette dernière est stockée soit dans un fichier ou dans une base de données. Prenons pour exemple un forum de discussions quelconque.
L’attaquant va poster un message ou un commentaire contenant le contenu malicieux. Lorsque les autres utilisateurs vont se rendre sur la page contenant le message ou le commentaire frauduleux, ce dernier sera exécuté.


Comment se protéger contre les failles Cross Site Scripting ?


La solution la plus adaptée contre cette faille est d'utiliser la fonction htmlspecialchars(). Cette fonction permet de filtrer les symboles du type <, & ou encore ", en les remplaçant par leur équivalent en HTML. Par exemple :


  • Le symbole & devient &amp;
  • Le symbole " devient &quot;
  • Le symbole ' devient &#39;

La fonction PHP « htmlentities() » : La conversion de caractères en entités est souvent utilisée pour empêcher les navigateurs de l'utiliser en tant qu'élément HTML. Cela peut être particulièrement utile pour empêcher l'exécution du code lorsque les utilisateurs ont accès à l'entrée d'affichage sur une page.