Invision Power Board 1.2 FINAL ****************************** Informations : °°°°°°°°°°°°°° Langage : PHP Version : 1.2 FINAL Website : http://www.invisionboard.com/ Problème : XSS permanent Developpement : °°°°°°°°°°°°°°° Une faille XSS permanent via le BBCode permet d'éxecuter un script dans les messages privés ou dans les forums. Les balises touchées sont les balises [FONT] et [COLOR]. Normalement elles sont utilisées comme ceci : [FONT=Times]texte[/FONT] devient texte et [COLOR=orange]texte[/COLOR] devient texte. Il n'y a pratiquement aucun filtre au niveau des valeurs données à ces balises. Via le style, on peut utiliser deux fonctions pour faire exécuter un code. D'abord expression(), qui s'utilise avec tout les attributs comme ceci : expression([SCRIPT]) puis url(), qui s'utilise avec un nombre limité d'attribut (background:, background-image:,...) comme ceci : url(javascript:[SCRIPT]). Cette dernière fonction ne pourra pas être utilisée car le ; nécessaire à séparer les attributs est filtré. Mais on peut utiliser expression(). Pour faire executer le javascript : alert(document.cookie), on peut donc utiliser la balise : [FONT=expression(alert(document.cookie))]texte[/FONT] qui donnera le code HTML : texte ou encore la balise [COLOR=expression(alert(document.cookie))]texte[/COLOR] qui donnera le code HTML : texte Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info. Il faut modifier le fichier sources/lib/post_parser.php en y remplacant les lignes : ----------------------------------------------------------------------------------------------------------------------------- while ( preg_match( "#\[font=([^\]]+)\](.*?)\[/font\]#ies", $txt ) ) { $txt = preg_replace( "#\[font=([^\]]+)\](.*?)\[/font\]#ies" , "\$this->regex_font_attr(array('s'=>'font','1'=>'\\1','2'=>'\\2'))", $txt ); } while( preg_match( "#\[color=([^\]]+)\](.+?)\[/color\]#ies", $txt ) ) { $txt = preg_replace( "#\[color=([^\]]+)\](.+?)\[/color\]#ies" , "\$this->regex_font_attr(array('s'=>'col' ,'1'=>'\\1','2'=>'\\2'))", $txt ); } ----------------------------------------------------------------------------------------------------------------------------- par les lignes : ----------------------------------------------------------------------------------------------------------------------------- while ( preg_match( "#\[font=([^;<>\*\(\)\]\"']*)\](.*?)\[/font\]#ies", $txt ) ) { $txt = preg_replace( "#\[font=([^;<>\*\(\)\"']*)\](.*?)\[/font\]#ies" , "\$this->regex_font_attr(array('s'=>'font','1'=>'\\1','2'=>'\\2'))", $txt ); } while( preg_match( "#\[color=([a-zA-Z0-9]*)\](.+?)\[/color\]#ies", $txt ) ) { $txt = preg_replace( "#\[color=([a-zA-Z0-9]*)\](.+?)\[/color\]#ies" , "\$this->regex_font_attr(array('s'=>'col' ,'1'=>'\\1','2'=>'\\2'))", $txt ); } ----------------------------------------------------------------------------------------------------------------------------- Ce filtre empêche de placer dans la balise [FONT] les caractères ;,<,>,*,(,),",',] (ce dernier caractère empêche des erreurs d'interpretation) et n'autorise dans la balise [COLOR] que les caractères de a à z, de A à Z et de 0 à 9. Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Website : http://www.phpsecure.info Date : 10/09/03 Greetz : Merci à l'IHC Team (www.ihcteam.org) qui m'a permis de tester à mon aise.