Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dev:cross-site_scripting [2007/07/03 15:35]
david.verdin@cru.fr
dev:cross-site_scripting [2007/08/29 16:12] (current)
david.verdin@cru.fr
Line 257: Line 257:
  
 ====== Où faire intervenir le filtrage dans le code ? ====== ====== Où faire intervenir le filtrage dans le code ? ======
 +
  
 ===== Pour l'​interface web et les URL ===== ===== Pour l'​interface web et les URL =====
Line 266: Line 267:
   * le shared : lors de la création d'un fichier par l'​interface web, ou lors d'un upload de fichier (fonction ''​do_d_upload()''​)   * le shared : lors de la création d'un fichier par l'​interface web, ou lors d'un upload de fichier (fonction ''​do_d_upload()''​)
   * la homepage (dans customizing)   * la homepage (dans customizing)
 +  * l'​édition des templates
   * les avis divergent sur le fichier "​info"​   * les avis divergent sur le fichier "​info"​
   * PAS les archives. On peut éventuellement dissimuler du XSS dans le corps d'un message ensuite affiché par les archives. Il faut voir ce que MHonArc propose.   * PAS les archives. On peut éventuellement dissimuler du XSS dans le corps d'un message ensuite affiché par les archives. Il faut voir ce que MHonArc propose.
Line 293: Line 295:
  
 Autant on peut brutalement interdire le HTML (en repérant en gros les chaînes commençant par un chevron ouvrant) autant ça va être coton de repérer le XSS avec une simple regexp puisqu'​on ne repère pas forcément un XSS grâce à la chaîne HTML. Autant on peut brutalement interdire le HTML (en repérant en gros les chaînes commençant par un chevron ouvrant) autant ça va être coton de repérer le XSS avec une simple regexp puisqu'​on ne repère pas forcément un XSS grâce à la chaîne HTML.
 +
 +
  
  
Line 307: Line 311:
  
 Regexp proposée : on repère le caractère "<"​ sous ses diverses formes : Regexp proposée : on repère le caractère "<"​ sous ses diverses formes :
-<​code>'​(<​|%3c|(&​+('​."​$dividers"​.'​)*(l('​."​$dividers"​.'​)*t|#​+x*0*(60|3c)+)+\;​*)|x*0*(60|3c))';​+<​code>​$html_free = '​(<​|%3c|(&​+('​."​$dividers"​.'​)*(l('​."​$dividers"​.'​)*t|#​+x*0*(60|3c)+)+\;​*)|x*0*(60|3c))';​
 Avec : Avec :
 $dividers = '​\s|&​+#​+x*0*(09|0a|0d)+\;​*';​ $dividers = '​\s|&​+#​+x*0*(09|0a|0d)+\;​*';​
Line 313: Line 317:
 On ignore les espaces ainsi que leurs expressions en HTML. On ignore les espaces ainsi que leurs expressions en HTML.
  
-FIXME : on exprime de manière beaucoup moins diversifiée les espace que le chevrons ouvrants (seulement la forme HTML en hexadécimal). 
 FIXME : Il manque le caractère nul. FIXME : Il manque le caractère nul.
-ß+ 
 + 
  
 ===== xss_free ===== ===== xss_free =====
Line 327: Line 332:
 Quelle solution nous reste-t-il ? Quelle solution nous reste-t-il ?
  
-Risquer les exceptions de ce genre, pour le moment, et filtrer les balises ​et attributs les plus dangereux ​:+Risquer les exceptions de ce genre, pour le moment, et filtrer les balises ​ci dessous ​:
  
   * ''<​script/>''​   * ''<​script/>''​
Line 343: Line 348:
   * ''<​embed/>''​   * ''<​embed/>''​
   * ''<​applet/>''​   * ''<​applet/>''​
 +
 +Et, dans le contexte de n'​importe quoui qui contienne un "<"​ :
 +
   * ''​style=''​   * ''​style=''​
   * ''​dynsrc=''​   * ''​dynsrc=''​
   * ''​lowsrc=''​   * ''​lowsrc=''​
-  * ''​onload=''​ et tous les déclencheurs : ''​on*=''​.+  * ''​onload=''​ et tous les déclencheurs : ''​on*=''​ 
 +  * ''​datasrc=''​ 
 +  * ''​javascript:''​ par acquis de conscience;-)
  
 Ça devrait être un bon début... Ça devrait être un bon début...
 +
 +Ça donne ces regexp :
 +
 +<​code>​
 +m$xss_free = "​($infSign)+($dividers)*((($tags)|.*($attributes))+|($encodedChars)+)";​
 +
 +Avec :
 +
 +my $tags = '​script|\w*frame\w*|style|input|layer|bgsound|link|meta|base|object|embed|applet';​
 +my $attributes = '​style=|dynsrc=|lowsrc=|on\w*=|javascript:';​
 +my $dividers = '​\s|&​+#​+x*0*(9|a|d|10|13)+\;​*';​
 +my $encodedChars = '​(&​+('​."​$dividers"​.'​)*#​+x*0*[0-9a-f]+\;​*|%+x*0*[0-9a-f]+\;​*)';​
 +my $infSign = '​(<​|%3c|(&​+('​."​$dividers"​.'​)*(l('​."​$dividers"​.'​)*t|#​+x*0*(60|3c)+)+\;​*)|&​+('​."​$dividers"​.'​)*x*0*(60|3c))';​
 +
 +</​code>​
 +
 +====== Où en sommes-nous ? ======
 +
 +Avant de partir pouponner, j'ai eu le temps d'​intégrer le filtrage XSS pour le web uniquement.
 +J'ai donc mis à jour tools.pm et wwsympa.fcgi pour qu'il en tiennent compte. Ça a l'air de marcher.
 +
 +Il reste encore à faire :
 +
 +  * intégrer le contrôle au niveau SOAP
 +  * intégrer le contrôle au niveau mail
 +  * vérifier le comportement de MHonArc
 +  * Vérifier les templates et paramètres autorisés au HTML
 +
 +Voili voilou. Cela dit, le gros du boulot (mise au point de la regexp) est bien posé.
 +Reste à tester...
 +
 +
  • dev/cross-site_scripting.1183469738.txt.gz
  • Last modified: 2007/07/03 15:36
  • (external edit)