Multiples trous dans le forum Powerboard **************************************** Produit : ********* Powerboards http://powerboards.sourceforge.net/ Versions : ********** 2.2b (et moins ?) Date : ****** 23/03/02 (16h28.36) Problèmes : *********** - Cross Site Scripting. - Path Diclosure. - Accès à la partie admin. - Accès aux comptes users sans password. - Recuperation des passwords users/admins. - Supression de messages. - Ecriture de scripts. Developpement : *************** Commençons par voir la partie la plus interessante du forum powerboards : l'administration. On peut voir dans admin.php ces quelques lignes : ---------------------------------------------- if ($HTTP_COOKIE_VARS['pbcookie']=="") { $loggedin="0"; } else { $loggedin="1"; $username=$HTTP_COOKIE_VARS['pbcookie']; $filename = "$dbpath/members/$username t"; $fd = fopen ($filename, "r"); $tet = fread ($fd, filesize ($filename)); fclose ($fd); if ($tet>5) { $admin="1"; } } if (!$admin=="1") { ---------------------------------------------- Ce qui nous apprend plusieurs points : - L'username est stocké dans le cookie 'pbcookie' - Si on est loggé, $loggedin vaut 1 - Si on est admin, $admin vaut 1 - Il y a des infos dans un fichier dont le nom est le nickname et le path /$dbpath/members/ . Le premier point nous permet d'acceder à n'importe quel compte : il suffit d'envoyer un cookie avec comme nom 'pbcookie' et comme valeur l'username que l'on veut s'approprier sur, par exemple, la page index.php. PS : si on joue avec les cookies, il faut savoir que l'option "logout" n'est pas toujours très efficace... je conseil donc l'url /setcookie.php?u=&p= . Je n'ai pas trop cherché autour de la valeur $loggedin mais il est possible qu'une url style script.php?loggedin=1 puisse nous permettre d'effectuer certaines opérations sans autorisation. La valeur $admin, elle, est fort interessante. Elle va nous permettre de lancer nimporte quelle opération en tant qu'admin. Pour voir le menu admin : admin.php?admin=1, pour l'option 'Grant Status' : admin.php?do=grantm&admin=1, etc... Le quatrième point est lui aussi fort interessant, etant donné que le fameux fichier dans /$dbpath/members/ portant le nom d'un user contient le password de cet user. Si on veut voir le password de l'utilisateur 'john', il suffira d'aller sur http://www.host.com/$dbpath/members/john . Le seul element pouvant poser problème est le $dbpath. Il y a au moins deux façons de découvrir le $dbpath. La première est d'envoyer un cookie contenant un username inexistant. Si j'envois le cookie 'pbcookie,LEPSEUDO' , cela affichera sur la page d'acceuil des erreurs du style : ------------------------------------------------------------------- Warning: fopen("/home/usr/site/NEWpb/$dbpath/members/LEPSEUDO t","r") - No such file or directory in /home/usr/site/NEWpb/index.php on line 28 ------------------------------------------------------------------- D'où le path disclosure... Ou encore grâce aux profils : '/profile.php?u=PSEUDONONEXISTANT' nous donnera la même erreur. Bon on a vu une premiere façon de ce servir de ce script, en recuperant le password. Mais cette façon d'enregistrer le login et le password peux aussi nous permettre d'ecrire n'importe quel script, et donc de placer une backdoor. Le principe est très simple; imaginons que l'on veuille placer une backdoor PHP pour executer n'importe quelle commande UNIX sur le HD. Il nous faudra donc placer un fichier script.php contenant un code du genre : et qu'il faudra utiliser comme ceci : script.php?cmd=[COMMANDE ex:cat%20/etc/paswd]. Il nous faut un appuis pour creer un fichier... nous l'avons : le login donne son nom à un fichier. Il nous faut aussi un appuis pour editer ce fichier : le password. Il suffira donc de s'inscrire avec comme login par exemple 'script.php' et de changer son mot de passe après l'inscription en le code que l'on veut placer dans ce fichier php. Ce fichier sera consultable de la sorte : http://www.host.com/$dbpath/members/script.php . Suppression des messages : Quand un message est écrit dans un forum, 2 personnes ont un petit lien "delete post" quand ils vont le visiter : l'administrateur et l'auteur de ce message. Imaginons le message 5 du forum 4 de la categorie 3. Il aura l'url : /post.php?cat=3&fid=4&pid=5 . L'url proposée pour supprimer ce post est : /delpost.php?cat=3&fid=4&pid=5. La difference entre admin/auteur et les autres users est que ce lien n'est pas apparent... pas qu'il n'est pas actif. Il suffit donc de rajouter un 'del' à l'url d'un post pour le supprimer. Un dernier trou CSS de faible importance mais à signaler tout de même : /error.php?e= . Patch : ******* / Greetz : ******** / Credits : ********* frog-m@n leseulfrog@hotmail.com