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(
[...]
"'
'",
"''",
[...]
);
[...]
}
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 :
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
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 :
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
- et enfin [shadow=red);background:url(javascript:[SCRIPT]);,left]text[/shadow]
qui donnera le code HTML :
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
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