PHP-Nuke ******** Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.phpnuke.org Version : 6.0 Problèmes : - XSS non-permanent - Path Disclosure Developpement : °°°°°°°°°°°°°°° PHPNuke est sûrement le CMS en PHP le plus utilisé du web. On peut y retrouver tout ce qui peut se trouver dans un portail, surtout avec les addons (forums, profil, news, messages privés, partie admin, annuaire,...). La plupart des fichiers de PHPNuke ont une sécurité empêchant d'accèder directement aux fichier. La plus grande partie du temps ils sont inclut dans modules.php ou dans une de ses inclusions. Pour empêcher l'accès direct, PHPNuke a trouvé deux moyens. Le premier, par exemple dans modules/Downloads/index.php, est invariable : --------------------------------------------------- if (!eregi("modules.php", $PHP_SELF)) { die ("You can't access this file directly..."); } --------------------------------------------------- Le deuxième, par exemple dans footer.php, change en fonction du nom du fichier dans lequel les lignes se trouvent : ------------------------------------ if (eregi("footer.php",$PHP_SELF)) { Header("Location: index.php"); die(); } ------------------------------------ Ces lignes se trouvant donc au début des fichiers stoppent le script ou redirigent vers index.php puis stoppent le script. Les failles Path Disclosure et Cross Site Scripting que nous allons retrouver dans PHPNuke 6.0 viennent du fait que ces lignes ne se trouvent pas dans certains fichiers. Commencont par le Path Disclosure. Cette faille consiste donc en la révélation du path du site dans l'ordinateur qui l'heberge, et éventuellement annonce la path d'autres fichiers. Les Path Disclosure sont souvent dûs à des erreurs d'inclusion, SQL,... comme c'est le cas pour PHPNuke. Voyons par exemple le fichier modules/Downloads/voteinclude.php. La sécurité n'y est pas, et on peut voir les lignes : --------------------------------------------- $module_name = basename(dirname(__FILE__)); require("modules/$module_name/d_config.php"); --------------------------------------------- Ces lignes vont donc tenter d'inclure le fichier http://[target]/modules/Downloads/modules/Downloads/d_config.php, fichier qui n'existe pas, ce qui générera donc une erreur. Un autre type d'erreur est comme dans modules/Forums/attachment.php, dans lequel on peut voir les lignes : ----------------------------------------------------------------------------------- [...] $result = mysql_query("select max_upfile from ${prefix}_forum_config"); list($max_upfile) = mysql_fetch_row($result); $AtchMaxUploadSize = $max_upfile; require_once("mainfile.php"); [...] ----------------------------------------------------------------------------------- Le script tente donc d'éxecuter une requête SQL alors qu'il ne s'est pas connecté à la base ! Il essaye ensuite d'inclure le fichier http://[target]/modules/Forums/mainfile.php, qui n'existe pas. Ces deux lignes généreront une erreur contenant le path... Path Disclosure. Enfin on a aussi un Path Disclosure dans /modules/Your_Account/navbar.php, où est appelé une fonction non-existante : ------------------------ \n"; echo "$sitename\n"; ?>


[...] --------------------------------------------------- On voit d'abord : --------------------------------------------------- $module_name = $name; include("modules/".$module_name."/functions.php"); [...] include("modules/".$module_name."/auth.php"); --------------------------------------------------- Si on accèd au fichier sans donner de valeur à $name, on aura deux erreurs disant que modules//functions.php et modules//auth.php n'existent pas. Si on donne comme valeur à $name un script du style avec l'url http://[target]/modules/Forums/bb_smilies.php?name=, les deux erreurs afficheront que modules//functions.php et modules//auth.php n'existent pas, et les javascript seront executés. Même chose pour http://[target]/modules/Forums/bb_smilies.php?Default_Theme=[SCRIPT]. Pour un XSS, les variables utilisées dans les fonctions echos ou print() pourront aussi être utilisées, avec un début variable selon le code html inscrit. Par exemple, pour executer un script avec les lignes : ------------------------------------------------------------ \n"; echo "$sitename\n"; ?> ------------------------------------------------------------ Il faudra d'abord fermer la balise TD{ , puis [SCRIPT] Un autre exemple. On voit la ligne : ----------------------------------------- ----------------------------------------- Ici c'est la balise qu'il faudra fermer. Le script devra donc commencer par ">, ce qui donnera une url du type : http://[target]/modules/Forums/bb_smilies.php?bgcolor1=">[SCRIPT] Et affichera sur la page HTML : ---------------------------- [SCRIPT]"> ---------------------------- Voici les differents fichiers touchés suivit des variables utilisables pour chacun d'entre eux : - /modules/Forums/bb_smilies.php $name $Default_Theme $site_font $sitename $table_width $bgcolor1 $color1 $forumver - /modules/Forums/bbcode_ref.php $name $Default_Theme $site_font $sitename $bgcolor2 $textcolor1 $bgcolor1 $forumver - /modules/Forums/editpost.php, /modules/Forums/newtopic.php, /modules/Forums/reply.php, /modules/Forums/topicadmin.php, /modules/Forums/viewforum.php $name - /modules/Forums/searchbb.php $name $bgcolor3 $bgcolor1 Tout ces fichiers touchés par le XSS non-permament sont aussi touchés par un ou plusieurs Path Disclosure. Patch : °°°°°°° Ajouter les lignes de sécurité vues au début du tuto dans chacun des fichiers buggés. Un patch est disponible sur http://www.phpsecure.org . Credits : °°°°°°°°° Auteur : frog-m@n Website : http://www.frog-man.org, http://www.phpsecure.org Email : frog-man@frog-man.org Date : 14/12/02