Format d'impression
Cross Site Scripting : Comprehension & sécurisation
Auteur : frog-man@phpsecure.info
Date de création : 12 décembre 2002
Dernière modification : 12 décembre 2002
Vu 38002 fois

References :


  Introduction
  °°°°°°°°°°°°
 
  Ce tutoriel a pour but d'expliquer la faille XSS (ou CSS ou Cross Site Scripting), en quoi elle consiste et
  comment elle peut être utilisée, afin de comprendre mieux sa sécurisation.
  La sécurisation est bien sûr beaucoup plus efficace si elle est comprise.
 
  Compréhension
  °°°°°°°°°°°°°
 
  Le XSS consiste en l'injection (et l'execution), le plus souvent de script du type javascript, html, vbscript...
  L'execution ne se fait pas par le serveur mais par l'utilisateur.
  Il existe deux sortes de XSS : le permanent et le non-permanent.
 
  Le deuxième est le moins dangereux car il nécessite une préparation pour faire visiter une url par la victime (Social Engineering).
  Car en effet c'est le plus souvent par le biais d'une url que le XSS non-permanent est utilisé.
  Un exemple concret...
  Imaginons un page php permettant d'afficher des articles. Un partie du code PHP pourrait être :
  ----------------
 
  <?
  [...]
  echo "<u>Titre : </u><br><br>$title";
  [...]
  ?>
 
  ----------------
 
  pour afficher le titre de l'article.
  Si la variable $title n'est pas définie auparavant dans le script, un url pour afficher le titre d'un article pourrait
  être :
  http://[website]/articles.php?title=14000%20nouveaux%20cas%20de%20sida%20par%20jour.&id=58
 
  Le &id=58 c'est pour faire plus réaliste mais ça n'influence en rien sur la suite.
  Cette url afficherai donc dans la page html :
 
  -----------------------------------------------------------------------
 
  <u>Titre : </u><br><br>14000 nouveaux cas de sida par jour.
 
  -----------------------------------------------------------------------
 
  Pour faire éxecuter un script sur la page, l'attaquant taperai donc une url du type :
  http://[website]/articles.php?title=[SCRIPT]&id=58
  ou
  http://[website]/articles.php?title=4000%20nouveaux%20cas%20de%20sida%20par%20jour.[SCRIPT]&id=58
 
  [SCRIPT] étant (un exemple non nocif...) par exemple :
 
  -------------------------------------------
 
  <script>alert('Hello World')</script>
 
  -------------------------------------------
 
  Ce qui afficherait dans le code html :
 
  ------------------------------------------------------------------------------
 
  <u>Titre : </u><br><br><script>alert('Hello World')</script>
 
  ------------------------------------------------------------------------------
 
  ou
 
  ------------------------------------------------------------------------------------------------------------------
 
  <u>Titre : </u><br><br>14000 nouveaux cas de sida par jour.<script>alert('Hello World')</script>
 
  -------------------------------------------------------------------------------------------------------------------
 
  L'autre risque du XSS non-permanent vient des erreurs PHP.
  Si par exemple on a dans index.php le code :
 
  --------------------------------
 
  <?
 
  include("files/".$page.".php");
 
  ?>
 
  --------------------------------
 
  Et qu'un attaquant tape comme url :
  http://[website]/index.php?page=[NEXISTEPAS]
  une erreur du style :
 
  -----------------------------------------------------------------------------------------------------------------
 
  Warning: Failed opening 'files/[NEXISTEPAS].php' for inclusion (include_path='') in /home/www/index.php on line 1
 
  -----------------------------------------------------------------------------------------------------------------
 
  Si maintenant l'url tapée est http://[website]/index.php?page=[SCRIPT], s'affichera sur la page la ligne suivante :
 
  -------------------------------------------------------------------------------------------------------------
 
  Warning: Failed opening 'files/[SCRIPT].php' for inclusion (include_path='') in /home/www/index.php on line 1
 
  -------------------------------------------------------------------------------------------------------------
 
 
 
  Un Social Engineering pourrait être, dans ce cas-ci, un mail envoyé par exemple au webmaster en html :
 
  ------------------------------------------------------------------------------------------------------------
 
  Hello,
  il y a un problème dans votre site http://[website]/.
  Je ne sais pas bien ce que c'est l'url est :
  <a href="http://[website]/articles.php?title=4000%20nouveaux%20cas%20de%20sida%20par%20jour.[SCRIPT]&id=58">
  http://[website]/articles.php?title=14000%20nouveaux%20cas%20de%20sida%20par%20jour.&id=58
  </a>
  Bonne chance !
  Bob
 
  ------------------------------------------------------------------------------------------------------------
 
  Le webmaster croyant alors voir un visiteur sincére et clickera sur l'url de son site, dans ses pensées
  evidemment sans danger, et executera le script voulut.
  Il y aurai eu moins de chance avec un lien du type :
 
  ------------------------------------------------------------------------------------------
 
  <a href="javascript:[SCRIPT]">
  http://[website]/articles.php?title=14000%20nouveaux%20cas%20de%20sida%20par%20jour.&id=58
  </a>
 
  ------------------------------------------------------------------------------------------
 
  Le XSS permanent est plus dangereux dans le sens que le script est TOUJOURS sur le site, et qu'il peut être
  executable par plusieurs visiteurs.
  Le principe est le même. Le script peut se trouver par exemple dans un email en HTML, dans un message sur le
  guestbook ou le forum, dans une phrase sur le chat, dans un profil, dans un message privé etc...
 
  Conséquences du Cross Site Scripting :
  - Récupération d'informations telles que le cookie ou l'URL.
  - Redirection vers une URL, nocive ou pas.
  - Récupération de fichiers se trouvant sur le disque dur de la victime.
 
 
  Et eventuellement (selon l'OS et/ou le navigateur) :
  - Téléchargement d'un fichier.
  - Execution d'un programme.
  - Execution d'une commande système.
  - ...
 
  Il est donc prouvé que le XSS n'est pas à sous-estimer.
 
  Sécurisation
  °°°°°°°°°°°°
 
  Les deux principales fonctions touchées par le Cross Site Scripting en PHP sont les fonctions echo et print().
  Il est donc conseillé, au lieu de taper
 
  ------------------
 
  <?
  print($variable);
  ?>
 
  ------------------
 
  ou
 
  ------------------
 
  <?
  echo $variable;
  ?>
 
  ------------------
 
  de taper à chaque fois :
 
  -----------------------------------
 
  <?
  print(htmlspecialchars($variable));
  ?>
 
  -----------------------------------
 
  ou
 
  -----------------------------------
 
  <?
  echo htmlspecialchars($variable);
  ?>
 
  -----------------------------------
 
 
 
 
 
  Pour sécuriser le XSS venant des erreurs, on pourrait penser taper par exemple
 
  --------------------------------
 
  @include("files/".$page.".php");
 
  --------------------------------
 
  au lieu de
 
  -------------------------------
 
  include("files/".$page.".php");
 
  -------------------------------
 
  mais ça prendrait beaucoup de temps.
  Le mieux est de mettre en début de fichier la ligne :
 
  -------------------
 
  error_reporting(0);
 
  -------------------
 
  qui stoppera l'affichage des erreurs.
 
 
 
 
(copyleft) 2001 frog-man@phpsecure.info 12-dec-2002 &Ext