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 "