XSS enregistrée   Version imprimable de cet article Enregistrer au format PDF

Le Cross Site Scripting, ou XSS, est la faille la plus présente sur le web, et d’assez loin. Elle est désignée par quantité de noms, parmi lesquels "faille des livres d’or", tout simplement car ceux-ci ont permi une généralisation de ces vulnérabilités faille. La faille de type XSS se caractérise par une injection possible de code arbitraire dans le code HTML qui sera rendu au navigateur. Autrement dit, l’attaquant va être capable de modifier un aspect du site ou d’injecter des scripts dans ce que la victime va ensuite voir à l’écran.


par S3cur3D

Il existe plusieurs types de failes XSS :

Les vulnérabilités XSS de type "persistente" ou "stored" en anglais, permet des exploitations plus en profondeur. C’est la faille des livres d’or, présente dans les forums, les formulaires d’inscription. La différence essentielle est que les données entrées sont stockées dans des bases de données et sont renvoyées dès qu’un utilisateur les demande. Par conséquent, on peut affecter n’importe qui sollicitera un certain sujet dans un forum ou la liste des pseudos enregistrés, etc.. Cette faille peut permettre des éxécutions côté client ou côté serveur selon les cas et peut permettre tout type d’exploitation, de la récupération de cookies à l’éxécution de scripts malveillants. On a vu des XSS intégrés à des bases de données institutionnels rendant inaccessibles des dizaines de sites dépendants de ces contenus.

Un petit exemple
Nous allons illuster ceci avec un XSS de type 2. Voici un exemple de site contenant trois pages : index.php est la page d’inscription à une mailing list, list.php est la page qui contient la liste des membres de la liste. Enfin, inscription.php est une page fantôme à laquelle est envoyé le mail du nouvel inscrit qui vérifie brièvement si il s’agit d’un email valide et qui l’enregistre dans la base de données.

index.php - Bases Hacking Mailing List

  1. <html>
  2.  
  3. <head>
  4. <div align="center"><h1>Bases Hacking Mailing List !</h1></div>
  5. <title>Faille de type Cross Site Scripting</title> </head>
  6.  
  7. <body>
  8. <br>
  9. <ul>
  10. <li>Inscrivez-vous en un clic :<br>
  11. <div align="center">
  12. <form method="POST" action="./inscription.php">
  13. <font size="-1">E-mail : </font><input type="text" name="adresse" value="Votre mail ici"><br>
  14. <font size="-1">Apparition sur la liste des inscrits ?</font><input type="radio" name="anonyme"><br><br>
  15. <input type="submit" name="envoi" value="Inscrivez-vous !"> </form> </div> </li>
  16. <br><br>
  17. <li>
  18. Vous pouvez consulter la liste des personnes déjà inscrites <a href="liste.php">ici</a>
  19. </li>
  20. </ul>
  21.  
  22. </body>
  23.  
  24. </html>

Télécharger

liste.php - Liste des inscrits

  1. <html>
  2.  
  3. <head>
  4.  
  5. <div align="center"><h1>Bases Hacking Mailing List !</h1></div>
  6. <title>Faille de type Cross Site Scripting</title>
  7.  
  8. </head>
  9.  
  10. <body>
  11.  
  12. <br>
  13. <ul>
  14. Voici la liste des inscrits non-anonymes : <br><ul>
  15.  
  16. <?
  17.  
  18. @mysql_connect("localhost", "serioushack", "motdepassemysql") or die("Impossible de se connecter à la base de données");
  19. @mysql_select_db("mailing_list") or die("Table inexistante");
  20.  
  21. $nombre = mysql_query("SELECT * FROM list Where anonyme=0;");
  22.  
  23. if (mysql_numrows($nombre) > 0)
  24. for ($Compteur=0 ; $Compteur<mysql_numrows($nombre) ; $Compteur++)
  25. {
  26. $mail = mysql_result($nombre , $Compteur , "AdrMail");
  27. echo "- ".$mail."<br>"; }
  28. else echo "Aucun inscrit non-anonyme pour le moment<br>";
  29.  
  30.  
  31. </ul>
  32. <br>
  33.  
  34. Pour retourner au formulaire d'inscription, c'est <a href="./">ici</a></ul>
  35.  
  36. </body>
  37.  
  38. </html>

Télécharger

inscription.php - Inscription d’une adresse mail

  1. <?
  2.  
  3.  
  4. $email = $_POST["adresse"];
  5. $anonyme = $_POST["anonyme"];
  6.  
  7. if ($anonyme == "on") $anonyme = 0;
  8. else $anonyme = 1;
  9.  
  10. for($i=0; $i < strlen($email) ; $i++)
  11. if ($email[$i] == '@' && $i < strlen($email) - 4)
  12. for($j = $i + 1 ;$j < strlen($email) - 2 ; $j++)
  13. if ($email[$j] == '.' && ($j >= strlen($email) - 5 || $j <= strlen($email) - 3)) { $validite=true; $i=$j=strlen($email); }
  14.  
  15. if (isset($validite)) {
  16.  
  17. @mysql_connect("localhost", "serioushack", "motdepassemysql") or die("Impossible de se connecter à la base de données");
  18. @mysql_select_db("mailing_list") or die("Table inexistante");
  19.  
  20. $nombre = mysql_query("INSERT INTO list values('$email',$anonyme);");
  21.  
  22.  
  23. header("Location: ./liste.php");
  24.  
  25. }
  26. else header("Location: ./");
  27.  
  28.  
  29.  
  30. ?>

Télécharger

Nous n’allons pas expliquer le code en détail, car il n’y a aucun intérêt à celà : il demande la saisie d’une adresse mail, il l’enregistre si elle possède bien un ’@’, un . et une extension entre 2 et 4 caractères. Ensuite, la page liste.php ressort les adresses de la base de données.
Nous préférons vous montrer le but de ces pages avec quelques screenshots. Tout d’abord, voici ce qui se passe quand tout se passe bien :

PNG - 59.3 ko
PNG - 62.5 ko

Nous allons maintenant profiter de la faille qu’offre ce site et nous allons injecter le script

<script>alert("S3ri0usH4cK WuZ H3r3")</script>@h4ck3d.com

et voir ce qui se passe :

PNG - 60 ko
PNG - 63 ko

Comme l’on pouvait s’y attendre, le script est éxécuté tel quel et tout utilisateur voulant voir la liste des utilisateurs de la mailing liste verra le petit code que nous avons injecté.
Nous ne donnerons pas d’exemple de scripts XSS malveillants ici, le net en est rempli. Ils demandent juste la connaissance des langages de scripting du web.

Souvent délaissée par les programmeurs, cette faille est à prendre au sérieux d’autant qu’elle est facile à corriger.

Documentations publiées dans cette rubrique Documentations publiées dans cette rubrique