IcrediBB ******** Produit : ********* IcrediBB Bulletin Board System http://www.icredibb.com Versions : ********** 1.1 Beta Date : ****** 12/04/02 Problemes : *********** - Accès aux comptes users/admins - XSS Developpement : *************** Voici ce qu'on peut lire dans index.php, à la partie du code pour se logger : -------------------------------------------------------------------------- //sets cookies with the login information (not the password though) setcookie("userstuffid", $PHPSESSID, time()+$cookies); setcookie("sessionuser", $sessionuser, time()+$cookies); setcookie("count", $count, time()+$cookies); setcookie("sessionstatus", $sessionstatus, time()+$cookies); setcookie("date", $ttime, time()+$cookies); -------------------------------------------------------------------------- et dans la partie log out : -------------------------------------------------------------------------- setcookie("userstuffid", "", ""); setcookie("sessionuser", "", ""); setcookie("sessionstatus", "", ""); setcookie("userstuffid", "", ""); setcookie("sessionuser", "", ""); setcookie("sessionstatus", "", ""); -------------------------------------------------------------------------- Le service repere donc ses membres grâce aux cookies, notre but va donc être de les récuperer. La façon la plus facile à utiliser pour récuperer des cookies sur des services style guestbook, forum ou autre est d'inscrire du javascript sur une page. Commençons par l'endroit qui dans les services contient generalement beaucoup de failles : la messagerie privée. On n'est pas déçu : on peut ecrire du javascript comme message, il sera lu sans probleme. Par exemple, fonctionnera très bien. Pour recuperer le cookie, j'ai bien sûr essayé de le faire renvoyer par le service lui-même, mais il se pose un petit probleme sur lequel nous reviendrons : dans l'url de renvois, ce qui est après un ';' est supprimé. On aura donc que le premier cookie, sessionuser, qui ne nous donne que le pseudo de la personne. En sachant que l'url de l'envois de message se forme comme ceci : /pm.php?function=sendpm&to=DESTINATAIRE&subject=SUJET&images=images/mad.gif &message=MESSAGE&submitpm=Submit PM On aurait pu creer le script : Par le biais de la lecture d'un message piégé, on pourrait aussi utiliser une autre insécurité. Dans icrediBB, on ne doit pas entrer son ancien password pour le changer. Un script : serait fatal à un membre. Il changerait le password en PASS puis se loggerai out, ne permettant pas à l'user de remettre son vrai pass. Il est aussi à savoir qu'on peut faire executer directement du javascript sur la page principale de l'Inbox, car le suejt accepte aussi le javascript, mais moins de caracteres. Revenons maintenant sur l'url d'envois de messages, qui est : /pm.php?function=sendpm&to=DESTINATAIRE&subject=SUJET&images=images/mad.gif &message=MESSAGE&submitpm=Submit PM On peut remarquer que la variable images est directement l'url de l'image qui va être inscrite dans la source de l'Inbox de cette façon : Donc, si on ne vaut pas afficher d'image, on executera l'url : /pm.php?function=sendpm&to=DESTINATAIRE&subject=SUJET&images=" width=0> Donc deux balises images vides avec 0 de longueur de cotés. Même chose, pour inserer deux images : /pm.php?function=sendpm&to=DESTINATAIRE&subject=SUJET&images=images/mad.gif"> La façon de contourner ce probleme que j'ai trouvé est de remplacer / par %2F et ; par %3B . Donc par exemple : /pm.php?function=sendpm&to=DESTINATAIRE&subject=SUJET&images= javascript:window.open('http:%2F%2Fwww.url.com')&message=MESSAGE&submitpm=Submit PM ou : /pm.php?function=sendpm&to=DESTINATAIRE&subject=SUJET&images= javascript:a='http:%2F%2Fwww.url.com'%3Bwindow.open(a)%3B&message=MESSAGE&submitpm=Submit PM Voilà, c'est tout pour la messagerie privée. Il reste au moins une autre faille, qui se trouve dans le profil. A l'url /usercp.php?function=avataroptions, on peut choisir sont "avatar", images/noavatar.gif par defaut, qui s'affichera sur son profil, dans son compte et quand quelqu'un lire un de vos messages publics. Etant donné que ce logo s'affichera à chaque fois dans la source de cet façon : , inutile de chercher bien loin la faille. Si on met comme url d'image javascript:alert(document.cookie), chaque personne visitant votre profil, lisant un de vos messages, ou vous a chaque ouverture d'une des pages de votre compte, verra une popup contenant son cookie. Il y a néanmoins un probleme : ' est remplacé par \' et " par \". Nous allons donc le regler de la même façon que plus haut, en remplacant le ' par %27. Si insere, à la place d'une image, le script javascript:alert(%27HeLLo%27) , une popup avec ce texte apparaitra bien aux endroits cités plus haut. Il est tout de même à preciser qu'une fois ce code entré, il n'est plus possible de l'enlever, on a donc droit qu'a un seul essais, et le compte est inutilisable par la suite, ou du moins difficilement utilisable. Patch : ******* / Greetz : ******** / Credits : ********* frog-m@n leseulfrog@hotmail.com