XSS to CSRF Worm

Je suis encore étudiant, dans l’école ou je suis, nous avons la possibilité d’uploader des tutoriaux sur une plateforme pour favoriser le partage de connaissances.

Fin octobre j’ai réussi à trouver une XSS sur ce site, rien d’extraordinaire, une XSS c’est bateau.
Mais cette XSS m’as permis de découvrir les vers à base de CSRF.

L’éditeur de tutos est un WYSISWYG, d’expérience ces composants sont souvent sensibles. Très rapidement une XSS se dessine. Un des champs n’étant pas correctement filtré. De plus, la page inclut jQuery.. de quoi faciliter l’exploitation.
La première idée fut de faire du phishing.

Phishing

Nous disposons de services en SSO, avantage : 1 mot de passe à retenir, inconvénient : 1 mot de passe à trouver. Une fois la page de phising en place, il ne me restait plus qu’à l’inclure via une iframe et à remplacer le contenu de toute la page via l’iframe. Quand on visite mon tuto, on se retrouve donc face à la fausse page d’authentification. Gros point positif pour l’attaque, l’url contient bien : *.nomdelecole.com

Après avoir obtenu des accès supérieurs j’ai décidé de reporter la vulnérabilité. Ce qui fut très bien accepté au vu de la démarche. Cependant 2 mois plus tard, la vulnérabilité est toujours présente.

CSRF

En voulant vérifier la présence de la XSS, m’est venue l’idée d’aller plus loin. Je suis totalement libre d’injecter tout code javascript, et j’ai à ma disposition jQuery qui me facilite tout le travail.

La plateforme propose aux étudiants de commenter un tutoriel, après avoir cherché une XSS dans ce composant, j’ai décidé de me rabattre sur l’éditeur ( la ou était la XSS ) car ce champ semble filtré.

Le site souffre en plus d’une XSS de la présence d’une CSRF. Cepenant un mécanisme de protection est disponible, un token anti-csrf. Cette vulnérabilité pourrait donc être empêché car tous les éléments sont présents. Seulement, le token anti-csrf est stocké dans un cookie, qui ne possède pas d’attribut HTTP ONLY. Il est donc facilement récupérable.

La requête permettant l’ajout d’un commentaire sur un tuto est très simple, elle demande 3 arguments :

  • Le commentaire
  • L’id du tuto
  • Le token anti-csrf

Grâce à Ajax, lorsqu’un étudiant visite ma page, il pose un commentaire élogieux à son insu.
Avec une simple boucle javascript il est aussi possible de commenter tous les tutoriaux. Ce qui peux causer des soucis au niveau de la base de données, voire la remplir inutilement.

Après avoir examiné le module de commentaire il était temps de faire évoluer cette CSRF.

Chaque étudiant peut uploader un tutoriel, il a aussi la possibilité de le modifier. Vous aurez donc facilement compris la suite ;). La CSRF permet de modifier le contenu d’un tutoriel. Ainsi chaque étudiant visitant ma page verra son tutoriel changé.

CSRF Worm

Si je souhaite maintenant modifier le plus possible de tutoriaux, il me faut un moyen de répandre le code malicieux. Je peux modifier les tutos, et le code malicieux s’injecte dans la description d’un tuto. Je peux donc créer une sorte de vers. Chaque étudiant visitant mon tutoriel verra son tuto changé et deviendra une nouvelle source d’infection.

Le code de la CSRF est hébergé sur gist.github.com. Cette alternative à Pastebin me permet d’héberger le code, mais aussi et surtout de le modifier à la demande. Sur chaque page infectée on retrouve une balise script avec en src l’adresse du code. Pouvant modifier le code hébergé je peux à tout moment décider de changer le payload de la CSRF ( soyons fou et appelons ceci un C&C 🙂 )

Conclusion

L’exploitation du worm CSRF n’as pas été faîte, elle a été vérifiée sur des tutoriaux volontaires afin d’effectuer un POC. Pour le moment je n’ai pas la possibilité de finaliser le POC, mes tutoriaux ayant été supprimés je dois attendre la nouvelle validation.

 

Date Etat
5/11/15 Envoi du POC XSS
7/11/15 Envoi du Correctif
6/1/16 La faille est toujours présente; POC CSRF Worm
15/1/16 Release des différentes failles

Laisser un commentaire

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