Failles dans le portail PHP Portix ********************************** Produit : ********* PHP-Portix; Portail en PHP. http://marc.gavage.com/portix/ Versions : ********** 0.4.02 et moins. Date : ****** 30/01/02 Probleme : ********** - Accès aux fichier de configurations admins. - Lecture dans le disque dur. Developpement : *************** Je pense que ce petit tutoriel est une bonne representation d'une partie des failles qu'on peut trouver en php et dans les autres styles de pages webs dynamiques. La premiere faille se trouve dans l'index.php, à cet endroit : ----------------------------------------------------------------------- ----------------------------------------------------------------------- Ce code inclus donc un fichier stocké dans la variable $l : include ("$l"); . La partie "afficheur de pdf" ne nous interesse pas. Comme le créateur de Portix le dis lui-même, des "comics" ne pourraient pas utiliser de fichier distant, vu que le "://" est supprimé de l'adresse du fichier à ouvrir. Mais les comics ont plus d'un tour dans leur sac :) En effet, si on ne peut pas appeler des fichiers de l'exterieur, il n'y a aucune restriction quant aux appels vers l'intérieur. Une petite url du style www.host.com/index.php?l=../pleinsdeptitspoints/../etc/passwd devrait sans problemes nous inclure le fichier passwd dans l'index.php. La deuxieme faille est une autre façon d'acceder au fichier passwd ou autres fichiers du disque dur du site. Une url classique dans Portix pour lire un message du forum est du style : /index.php?l=forum/view.php&topic=20020108011729.txt Quelques lignes à propos du message, à titre informatif : Le nom du fichier 20020108011729.txt n'est rien d'autre que la date et heure à laquelle le message à été posté. Dans ce cas si, le 08/01/2002, à 01 heure 17 minutes 29 secondes. Ces messages sont stockés dans /forum/data/. Ils se composent de la sorte : ** Titre. Auteur. Email. Date, heure (ici "08-01-2002, 1:17"). Le message, sur une ligne. ** Voyons maintenant l'endroit dans forum/view.php où se trouve la faille : ----------------------------------------------------------------------- $msg = file("forum/data" . '/' . $topic); $msg[] = $value; ----------------------------------------------------------------------- et un peu plus loin : ----------------------------------------------------------------------- echo "   $value\n"; echo "\n"; } if ($key == "1") { /* Author */ echo "\n"; echo "  Author: $value\n"; echo "
\n"; } if ($key == "2") { /* Email */ echo "  E-Mail: $value\n"; echo "
\n"; } if ($key == "3") { /* Date */ echo "  Date: $value\n"; echo "\n"; } if ($key == "4") { /* Email */ echo "
\n"; echo "$value\n"; } if ($key >= "5") { /* Fill it up */ echo "$value\n"; } ----------------------------------------------------------------------- L'emplacement du fichier à ouvrir est donc défini (1ere ligne) puis chaque ligne est inscrite une par une ($value). Il suffit donc de remplacer la valeur de topic par le fichier à acceder, ce qui affichera, pour l'url : /index.php?l=forum/view.php&topic=../desptitspoints/../etc/passwd, quelque chose du genre : ** PREMIERE LIGNE DU FICHIER PASSWORD Author: deuxieme ligne E-Mail: troisieme ligne de passwords Date: quatrieme ligne cinquieme ligne Le reste dans un cadre préparé pour afficher un message ** La troisieme faille ne sert pas à afficher un fichier et ne se trouve pas dans l'index.php :) La faille se situe dans /config/config.php et va nous permettre d'acceder à l'interface administrateur et de l'utiliser sans mot de passe. Voici le code de config.php, expliqué (par moi cette fois-ci), où se trouve la faille: ----------------------------------------------------------------------- if (($pswd==$pass)or($HTTP_COOKIE_VARS["access"]=="ok")) // si le mot de pass entré est bien celui dans la base de donnée ou que la valeur du cookie "access" est bien "ok", { setcookie ("access","ok"); // On crée le cookie avec comme nom "access" et comme valeur "ok". echo "

$m1

\n"; //Et on affiche le menu include ("menuconfig.inc"); //de configuration. } else { // sinon, on affiche une demande de mot de passe. ----------------------------------------------------------------------- Donc si le pass est bon, un cookie est envoyé... mais le hic est que 1) ce cookie ne change jamais. 2) il n'a pas de date d'expiration. Il suffit donc d'envoyer un cookie de nom "access" et de valeur "ok" ,pour avoir acces aux commandes admins, sur la page /config/config.php ou toutes les autres reservées au webmaster : /config/citations.php /config/download.php /config/general.php /config/links.php /config/menu.php /config/meta.php /config/news.php /config/newsletter.php /config/pswd.php /config/theme.php Le créateur a été avertit. Patch: ****** http://marc.gavage.com ==> dernière version. Greetz : ******** Zeno, Majen Credits : ********* frog-m@n (leseulfrog@hotmail.com)