Detournement de la fonction mail() par des spammeurs

Le
messian_nospam
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #54869

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


Synopsis

include "libmail.php";
$m= new Mail; // create the mail
$m->From( "" );
$m->To( "" );
$m->Subject( "the subject of the mail" );
$m->Body( "HellonThis is a test of the Mail component" ); // set the body

$m->Cc( "");
$m->Bcc( "");
$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

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);


Tu ne sembles pas vérifier grand chose, et par ailleurs tu ne nous dis
pas comment tu les utilises après.

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.

messian_nospam
Le #54861
Olivier Miakinen

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.


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
Le #54481

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("/[rn]/", "", $from);
$subject = preg_replace("/[rn]/", "", $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).

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

messian_nospam
Le #54476
Olivier Miakinen

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 !


Note que le filtre peut être aussi simple que :
$from = preg_replace("/[rn]/", "", $from);
$subject = preg_replace("/[rn]/", "", $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
Le #54474
JF Messian
Olivier Miakinen

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 !


Note que le filtre peut être aussi simple que :
$from = preg_replace("/[rn]/", "", $from);
$subject = preg_replace("/[rn]/", "", $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



messian_nospam
Le #52583
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 ?


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
Le #52195
JF Messian
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.

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


Publicité
Poster une réponse
Anonyme