YaBB SE XSS Permanent ********************* Informations : °°°°°°°°°°°°°° Langage : PHP Version : 1.5.5 et moins Website : http://www.yabbse.org Problème : XSS Permanent Developpement : °°°°°°°°°°°°°°° Yabb SE est un forum contenant une partie admin, une partie utilisateur avec profil, messages privés,... Dans les messages privés et les messages sur le forum, il est possible d'utiliser du BBcode pour remplacer certains éléments du HTML. Deux des balises du BBcode souffrent d'un problème de sécurité; il s'agit de [glow] et [shadow]. En effet on peut voir dans le fichier Sources/Subs.php le code suivant : ----------------------------------------------------------------------------------------------------------------------------- [...] function doparsecodesmilies($message,$enableSmilies = 1) { global $codefromcache, $codetocache, $smileyfromcache, $smileytocache, $text, $scripturl, $imagesdir, $txt, $modSettings; [...] $codefromcache = array( [...] '/\[glow=(.+?),(.+?),(.+?)\](.+?)\[\/glow\]/eis', '/\[shadow=(.+?),(.+?)\](.+?)\[\/shadow\]/eis', [...] ); $codetocache = array( [...] "'
' . \"\\4\" . '
'", "'
' . \"\\3\" . '
'", [...] ); [...] } function parsecode($message) { global $codefromcache, $codetocache, $modSettings; [...] $message = preg_replace($codefromcache, $codetocache, $message); [...] } [...] ----------------------------------------------------------------------------------------------------------------------------- On voit que ces balises utilisent l'argument "style", dans lequel on peut placer une fonction url() ou expression() permettant de faire exécuter n'importe quel script. On peut injecter ce script de trois manière différentes : - [glow=red);background:url(javascript:[SCRIPT]);,2,300]text[/glow] qui donnera le code html : -----------------------------------------------------------------------------------------------
text
----------------------------------------------------------------------------------------------- Où la partie ", strength=2);" n'aura aucune consèquence sur l'éxécution du script. - [glow=red,2);background:url(javascript:[SCRIPT],300]text[/glow] qui donnera le code HTML : ---------------------------------------------------------------------------------------------
text
--------------------------------------------------------------------------------------------- - et enfin [shadow=red);background:url(javascript:[SCRIPT]);,left]text[/shadow] qui donnera le code HTML : ----------------------------------------------------------------------------------------------------
text
---------------------------------------------------------------------------------------------------- Où la partie ", direction=270);" n'aura aucune consèquence sur l'éxécution du script. Le [SCRIPT] pourrait par exemple permettre de récupérer, via les messages privés, le cookie utilisateur avec l'élement "document.cookie" ou encore l'ID de session de l'utilisateur avec l'élément "document.getElementsByTagName("form")[1].sc.value", qui va le récupérer dans le champ d'un formulaire où il est placé. L'élément [1] change en fonction du nombre de balise
qui se trouvent avant le formulaire en question. La version 1.0 beta de SMF (Simple Machines Forum) http://www.simplemachines.org est aussi touchée. Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info. Après une longue discution... l'équipe YabbSE n'a pas sortit de patch. Dans le fichier Sources/Subs.php, remplacer les lignes : -------------------------------------------------------------------------- '/\[glow=(.+?),(.+?),(.+?)\](.+?)\[\/glow\]/eis', '/\[shadow=(.+?),(.+?)\](.+?)\[\/shadow\]/eis', -------------------------------------------------------------------------- par les lignes : ----------------------------------------------------------------------------------- '/\[glow=([[:alpha:]]+?),(.+?),(.+?)\](.+?)\[\/glow\]/eis', '/\[shadow=([[:alpha:]]+?),(.+?)\](.+?)\[\/shadow\]/eis', ----------------------------------------------------------------------------------- Ce qui aura comme effet d'empêcher de mettre autre chose que des caractères alphabétiques comme premier attribut de [glow] et [shadow], c'est-à-dire la couleur. Et remplacer cette ligne : ----------------------------------------------------------------------------------------------------------------------------- "'
' . \"\\4\" . '
'", ----------------------------------------------------------------------------------------------------------------------------- par ----------------------------------------------------------------------------------------------------------------------------- "'
' . \"\\4\" . '
'", ----------------------------------------------------------------------------------------------------------------------------- Ce qui empêchera de donner autre chose que des chiffres comme deuxième attribut de [glow]. Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Website : http://www.phpsecure.info Date : 29/02/04