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.