Discussion:
Detournement de la fonction mail() par des spammeurs
(trop ancien pour répondre)
JF Messian
2007-05-12 19:17:27 UTC
Permalink
Bonjour,

Mon serveur fait fréquemment l'objet d'attaque par des spammeurs qui
utilisent les formulaires contact.

J'utilise la class libmail de Léo West :
http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=fr

Toutes les variables utilisé par la classe libmail sont initialisées
dans mes scripts de la façon suivante :

$var1 = "" ;
$var2 = "" ;
$var3 = "" ;
...
$varN = "" ;

extract($_POST,EXTR_OVERWRITE);

Je peux faire quoi de plus ? Vérifier si la page d'où provient la
demande est bien celle qui contient mon formulaire ?
--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com
Olivier Miakinen
2007-05-12 19:32:40 UTC
Permalink
Post by JF Messian
http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=fr
<cit.>
Synopsis

include "libmail.php";
$m= new Mail; // create the mail
$m->From( "***@isp.com" );
$m->To( "***@somewhere.fr" );
$m->Subject( "the subject of the mail" );
$m->Body( "Hello\nThis is a test of the Mail component" ); // set the body

$m->Cc( "***@somewhere.fr");
$m->Bcc( "***@somewhere.fr");
$m->Priority(4) ; // set the priority to Low
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" ) ; // attach a
file of type image/gif to be displayed in the message if possible
$m->Send(); // send the mail

echo "Mail was sent:"
echo $m->Get(); // show the mail source
</cit.>
Post by JF Messian
Toutes les variables utilisé par la classe libmail sont initialisées
$var1 = "" ;
$var2 = "" ;
$var3 = "" ;
...
$varN = "" ;
extract($_POST,EXTR_OVERWRITE);
Tu ne sembles pas vérifier grand chose, et par ailleurs tu ne nous dis
pas comment tu les utilises après.
Post by JF Messian
Je peux faire quoi de plus ? Vérifier si la page d'où provient la
demande est bien celle qui contient mon formulaire ?
Tu peux :
1) Ne rien mettre que des chaînes codées en dur dans To, Cc et Bcc,
voire dans From et Subject si ton utilisation s'y prête.
2) Vérifier qu'il n'y a que des caractères sans danger dans From et
Subject s'ils viennent de $_POST. Par exemple que des caractères
ASCII entre l'espace (code 32) et le tilde (code 126), mais
*surtout* qu'il n'y ait *AUCUN* \r ou \n.
JF Messian
2007-05-14 10:45:42 UTC
Permalink
Post by Olivier Miakinen
1) Ne rien mettre que des chaînes codées en dur dans To, Cc et Bcc,
voire dans From et Subject si ton utilisation s'y prête.
2) Vérifier qu'il n'y a que des caractères sans danger dans From et
Subject s'ils viennent de $_POST. Par exemple que des caractères
ASCII entre l'espace (code 32) et le tilde (code 126), mais
*surtout* qu'il n'y ait *AUCUN* \r ou \n.
Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.

Ne serait-il pas plus efficace et plus rapide de vérifier dans chacun
des scripts qui utilise la fonction mail() de php que le formulaire d'où
provient la demande est bien sur mon serveur ?

Par exemple :

$url_origine = "http://www.domaine.com/formulaire.html" ;

if ($url_origine==$_SERVER['HTTP_REFERER']) {


// ICI LE SCRIPT QUI ENVOIT LE MAIL

}

?
--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com
Olivier Miakinen
2007-05-14 11:09:01 UTC
Permalink
Post by JF Messian
Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.
Ça ne te gêne pas aux entournures de savoir que ton site sert de relais
à spam ? Et que tu risques de te faire blacklister si tu ne fais rien ?

Note que le filtre peut être aussi simple que :
$from = preg_replace("/[\r\n]/", "", $from);
$subject = preg_replace("/[\r\n]/", "", $subject);

(du moins en espérant que ce n'est pas l'utilisateur qui peut fixer To,
Cc ou Bcc, car sinon tu lui offres une machine à spam dorée).
Post by JF Messian
Ne serait-il pas plus efficace et plus rapide de vérifier dans chacun
des scripts qui utilise la fonction mail() de php que le formulaire d'où
provient la demande est bien sur mon serveur ?
[...]
if ($url_origine==$_SERVER['HTTP_REFERER']) {
Je ne vois pas en quoi cela empêche le spam, et ce pour deux raisons.
L'une des raisons est que l'attaque peut venir d'un de tes propres
formulaires si tu offres un champ de saisie relativement libre. Mais
la raison principale est que $_SERVER['HTTP_REFERER'] peut être pipoté
sans aucune difficulté par un spammeur. C'est même probablement la
première chose qu'il positionne.

==> Protection = ZÉRO
JF Messian
2007-05-14 15:42:14 UTC
Permalink
Post by Olivier Miakinen
Post by JF Messian
Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.
Ça ne te gêne pas aux entournures de savoir que ton site sert de relais
à spam ? Et que tu risques de te faire blacklister si tu ne fais rien ?
Evidemment !
Post by Olivier Miakinen
$from = preg_replace("/[\r\n]/", "", $from);
$subject = preg_replace("/[\r\n]/", "", $subject);
(du moins en espérant que ce n'est pas l'utilisateur qui peut fixer To,
Cc ou Bcc, car sinon tu lui offres une machine à spam dorée).
Justement, il faut que je décortique la class libmail.php pour les Cc et
Bcc. Je me demande si elle est bien sécurisée.
--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com
FiLH
2007-05-14 20:44:12 UTC
Permalink
Post by JF Messian
Post by Olivier Miakinen
Post by JF Messian
Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.
Ça ne te gêne pas aux entournures de savoir que ton site sert de relais
à spam ? Et que tu risques de te faire blacklister si tu ne fais rien ?
Evidemment !
Post by Olivier Miakinen
$from = preg_replace("/[\r\n]/", "", $from);
$subject = preg_replace("/[\r\n]/", "", $subject);
(du moins en espérant que ce n'est pas l'utilisateur qui peut fixer To,
Cc ou Bcc, car sinon tu lui offres une machine à spam dorée).
Justement, il faut que je décortique la class libmail.php pour les Cc et
Bcc. Je me demande si elle est bien sécurisée.
En fait j'avais trouvé un truc tout con pour éviter les injections était
de fixer les destinataires dans le code, et d'encapsuler tout ce qui
arrivait de l'extérieur dans une pièce jointe mime...

Ce qui fait que ce qui est variable n'est pas du tout traité par les
MTA.

Ceci demande que les destinataires soient forcément fixes connus
d'avance.

FiLH
--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org
JF Messian
2007-05-21 12:00:35 UTC
Permalink
Post by FiLH
En fait j'avais trouvé un truc tout con pour éviter les injections était
de fixer les destinataires dans le code, et d'encapsuler tout ce qui
arrivait de l'extérieur dans une pièce jointe mime...
Tu peux développer un peu ?
Post by FiLH
Ce qui fait que ce qui est variable n'est pas du tout traité par les
MTA.
C'est quoi les MTA ?

MERCI !
--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com
FiLH
2007-05-21 19:44:15 UTC
Permalink
Post by JF Messian
Post by FiLH
En fait j'avais trouvé un truc tout con pour éviter les injections était
de fixer les destinataires dans le code, et d'encapsuler tout ce qui
arrivait de l'extérieur dans une pièce jointe mime...
Tu peux développer un peu ?
On subissait des injections par l'ajout de faux entêtes mimes qui
redélimitaient les header (au niveau du to: à partir du from :)). Un
truc un peu à la con.

Donc faire une pièce jointe (même de type ascii) du texte saisi permet
d'être sûr que son contenu ne jouera pas avec les headers.
Post by JF Messian
Post by FiLH
Ce qui fait que ce qui est variable n'est pas du tout traité par les
MTA.
C'est quoi les MTA ?
Mail Transport Agent...

FiLH
--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org
Continuer la lecture sur narkive:
Loading...