miniPortail *********** Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.aldweb.com/ Version : 1.9, 2.0, 2.1, 2.2 (et moins ?) Problème : Accès admin Developpement : °°°°°°°°°°°°°°° "miniPortail est un petit portail web gratuit, facile et qui ne nécessite pas de base de données pour fonctionner. miniPortail propose l'ensemble des fonctionnalités classiques d'un portail web : news, articles, liens, téléchargements, diaporama de photos, livre d'or, forum, FAQ, sondage, compteur de visites, etc..." Le problème se situe donc dans la partie admin, sa page principale étant admin/admin.php. C'est aussi dans cette page que se trouve le code permettant l'authentification de l'admin. Voici le code qui nous interesse : ----------------------------------------------------------------------------------------------------------------------------- [...] $portalname = "miniPortailAdmin"; $cookiedata = "adminok"; include("mdp.php"); if (md5($pass) == $mdp) { setcookie($portalname, $cookiedata); } elseif ($logout == 1) { setcookie($portalname, ""); header("location:../index.php"); } $chemin = "../"; include($chemin."inc/includes.inc"); if (($HTTP_COOKIE_VARS[$portalname] == $cookiedata || md5($pass) == $mdp) && empty($pg)) { include($chemin."inc/hpage.inc"); htable($admin1, "100%"); [...] } elseif ($HTTP_COOKIE_VARS[$portalname] == $cookiedata && !empty($pg)) { if (file_exists("inc/".$pg.".inc")) { $chemin = "../"; include("inc/".$pg.".inc"); } [...] ----------------------------------------------------------------------------------------------------------------------------- Deux variables sont d'abord définies : $portalname et $cookiedata. On inclut ensuite le fichier mdp.php, dans lequel se trouve, dans la variable $mdp, le mot de passe admin crypté en md5. On regarde ensuite si le mot de passe entré par l'utilisateur, crypté, est bien celui contenu dans le fichier mdp.php. Si c'est le cas, on envois un cookie nommé "miniPortailAdmin" et avec comme valeur "adminok". Pour accèder à la partie admin, on vérifie enfin que le cookie nommé miniPortailAdmin a bien la valeur "adminok". Si ce n'est pas le cas, on affiche le formulaire de login (cette partie du code ne se trouve pas ici). Pour être authentifié comme administrateur, il suffit donc d'envoyer nous-même, sur la page http://[target]/admin/admin.php, un cookie nommé miniPortailAdmin et ayant comme valeur "adminok". Quand on cela est fait, on peut aller un peu plus loin, grâce à la partie "upload" de l'administration, se trouvant à l'url http://[target]/admin/admin.php?pg=upload. Comme le dit son nom, on peut alors uploader n'importe quel fichier sur le serveur, mais aussi en supprimer, et lister les fichiers de n'importe quel repertoire. Le script ne propose normalement que les repertoires /img/, /file/ et /photos/, mais il suffit de changer la valeur de la variable $rep pour choisir le repertoire. Si on upload alors un fichier php, il sera executé sur le serveur, avec ses droits et restrictions. Voici le code d'/admin/inc/upload.inc, qui est le fichier inclut dans admin.php pour la page upload : --------------------------------------------------------------------------------------- if (empty($rep)) { $rep="file"; } if (!empty($del)) { @chmod($chemin.$rep."/".$del,0777); unlink($chemin.$rep."/".$del); } if (!empty($ficup)) { if (is_uploaded_file($ficup)) { copy($ficup, $chemin.$rep."/".$_FILES['ficup']['name']); } } // Creation de l'index des fichiers $dbfiles = array(); $i = 0; $dossier = opendir($chemin.$rep); while ($fichier = readdir($dossier)) { if (is_file($chemin.$rep."/".$fichier)) { if ($fichier != "index.php") { $dbfiles[$i][0] = $fichier; $path_parts = basename($fichier); $path_parts = substr($path_parts,strrpos($path_parts,".")+1); $dbfiles[$i][1] = "inc/img/files/".ExtImage($path_parts).".gif"; $dbfiles[$i][2] = FileSizeInKb($chemin.$rep."/".$fichier); $i++; } } } closedir($dossier); @sort($dbfiles); [...] --------------------------------------------------------------------------------------- Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info pour la version 2.2. Dans admin/admin.php, remplacer le code : ------------------------------------------------------------------------------------------- [...] $portalname = "miniPortailAdmin"; $cookiedata = "adminok"; include("mdp.php"); if (md5($pass) == $mdp) { setcookie($portalname, $cookiedata); } elseif ($logout == 1) { setcookie($portalname, ""); header("location:../index.php"); } $chemin = "../"; include($chemin."inc/includes.inc"); if (($HTTP_COOKIE_VARS[$portalname] == $cookiedata || md5($pass) == $mdp) && empty($pg)) { [...] ------------------------------------------------------------------------------------------- par : --------------------------------------------------------------------------------------- include("mdp.php"); session_start(); $miniPortailAdmin = ""; if (md5($pass) == $mdp) { $miniPortailAdmin = "adminok"; session_register("miniPortailAdmin"); } elseif ($logout == 1) { session_unregister("miniPortailAdmin"); header("location:../index.php"); } $chemin = "../"; include($chemin."inc/includes.inc"); if ((session_is_registered("miniPortailAdmin") || md5($pass) == $mdp) && empty($pg)) { --------------------------------------------------------------------------------------- et, plus bas, la ligne : ------------------------------------------------------------------------ elseif ($HTTP_COOKIE_VARS[$portalname] == $cookiedata && !empty($pg)) { ------------------------------------------------------------------------ par : -------------------------------------------------------------------- elseif (session_is_registered("miniPortailAdmin") && !empty($pg)) { -------------------------------------------------------------------- Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Website : http://www.frog-man.org, http://www.phpsecure.info Date : 01/05/03