Sécuriser son site web (2/3) - Attaque de type XSS

27 February 2009 par Soulon Hak

Le Cross Site Scripting (XSS) est une attaque par lequel est injecté dans un site web, un code malveillant profitant d'une faille dans les contrôles de la validité des données en entré du site.

Concrètement lorsque vous transmettez des paramètres à un site à travers l'URL (donc via la méthode GET), et que celles-ci n'ont pas été vérifiées, traités, et validés (correctement voire pas du tout) alors tout utilisateur malintentionné peut profiter de cette négligence pour faire exécuter un code malicieux.

Attention, à noter qu'il ne faut pas confondre le XSS avec le CSS (Cascading Style Sheet), qui sont les feuilles de style en cascade qui servent à décrire la présentation des documents HTML.

Caractéristiques du XSS

Les attaques de type XSS se font généralement via l'injection de code HTML, mais elles exploitent également :

Il s'agit de liens que vous pouvez trouver dans :

  • un site (forum, blog, etc.)
  • (les spams de) la messagerie électronique
  • les messageries instantanées
  • les redirections

De ce fait :

  • Il est relativement difficile de détecter ce type d'intrusion.
  • Les pare-feux ne permettent pas vraiment de combattre ces attaques
  • L'utilisation du chiffrement SSL ou autre n'arrange pas vraiment le problème.

Un exemple concret

Pour bien comprendre le principe, rien ne vaut un exemple.

Supposons le code suivant :

Sur un navigateur web cela donnerait :

Aucune variable n'a été transmit en GET donc la page n'affiche que "Bienvenue !"

Si maintenant je tape "Soulon Hak" et valide cela me donne bien "Bienvenue Soulon Hak !"

Et remarquez dans l'adresse de la page, on a affecté "Soulon+Hak" à la variable login qui est affiché après "Bienvenue" (jusque-là je ne vous apprends rien)

Que se passe si après "login=", je le remplace par "<script>alert('Hack !');<script>" ?
Réponse :

La ligne affichant la variable $_GET['login'] devient :

Bienvenue <?php echo '<script>alert('Hack !');<script>'; ?>

Et le code JavaScript tapé dans la barre d'adresse est ainsi exécuté.

Là on ne fait qu'exécuter un code JavaScript inoffensif, maintenant je vous laisse imaginer ce qu'on put faire comme code malintentionné avec JavaScript.

Pour pallier ce problème d'injection de code, il aurait fallu utiliser la fonction htmlentities qui convertit votre chaîne de caractères en entité HMTL :

Bienvenue <?php echo htmlentities($_GET['login']); ?><br/>

Ce qui donne en l'exécutant sur le navigateur :

Et celui-ci ne sera pas interprété comme du code JavaScript !

Types de failles XSS

On distingue trois types de failles XSS :

1er type : local

Il s'agit d'une faille où un script côté client comme JavaScript récupère les paramètres contenus dans l'URL et l'utilise pour afficher localement sa propre page (en général malicieuse) avec potentiellement les privilèges utilisateurs en cours.

2e type : non-permanent (ou non persistant)

Il s'agit du type de XSS le plus courant.

Il se produit lorsque les scripts côté serveur ne font pas de vérifications préalables (ou pas suffisamment) des données saisies par l'utilisateur et que la page web non encodée en entités HTML affiche ces données; on a alors d’une faille XSS de 2e type.

3e type : permanent (ou persistant)

Il s'agit du type de faille XSS la plus dangereuse, car elle permet potentiellement de toucher plusieurs utilisateurs à la fois.

Il se produit lorsque les données sont stockées sur un serveur (dans une base de données, des fichiers, etc.) sans vérification préalable. De ce fait, un pirate pourrait par exemple stocker un script malveillant dans la base de données.

Les types de site web potentiellement vulnérables

Même si tous les sites web sont potentiellement vulnérables certains types de site le sont plus que d'autres du fait que d'une part elles regroupent beaucoup d'utilisateurs et d'autre part elles prennent des paramètres qui sont affichés ensuite dans la page HTML

  • Les webmails
  • Sites de commerce électronique
  • Journaux électronique
  • etc.

Pour citer un cas récent, une faille XSS a été découverte sur le site d'Alapage (qui a été corrigé depuis)

Ce XSS pouvait permettre de mettre la main sur l'Ip, le Code ID client, l'adresse email, l'identité ainsi que le Mot de passe (crypté) enregistré lors de l'inscription sur alapage.com

Préventions

Pour les développeurs de site web

  • il faut toujours valider au préalable les données en entrée qui vont être affichées.
  • à l'affichage, il faut utiliser un encodage spécifique (en PHP, via la méthode htmlentites())
  • protéger des accès important par mot de passe (connexion, mise à jour de la base de données, etc.)
  • pour Firefox, le module XSS Me permet de tester si votre site contient des failles XSS : https://addons.mozilla.org/fr/firefox/addon/7598

Pour les internautes

  • Il faut se méfier des URLs un peu trop longues qu'on trouve dans les spams, forums, voire même dans les messageries instantanées, etc.
  • Lire les URLs avant de les cliquer
  • Désactiver éventuellement le JavaScript

Conclusion

Il existe bien d'autres techniques pour exploiter une faille XSS qui est un domaine assez vaste.

Lors du développement d'un site web, il faut garder à l'esprit que les parties sensible aux failles de type XSS sont les formulaires.

Vous pouvez tester pour voir la vulnérabilité de votre site via le module Firefox : XSS Me cité plus haut.

Liens

Le XSS

Faille XSS sur la variable $_SERVER['PHP_SELF']

Faille XSS sur le site d'Alapage

Tags: , ,

Un commentaire pour “Sécuriser son site web (2/3) - Attaque de type XSS”

  1. bledar dit :

    body
    {
    background-color: red;
    background-image: url(”www.dofus.com);
    font-size: 25px;
    font-family: “Arial Black”;
    }

Laisser un commentaire