Discussion:
la fonction mail() est-elle filtree et su re ?
(trop ancien pour répondre)
Olivier Masson
2010-02-05 17:17:42 UTC
Permalink
Bonjour,

J'ai toujours vérifié tout ce que je donnais comme arguments à mail(),
ce qui me parait évident.

Pourtant, en critiquant cette absence de toute forme de
vérification/filtrage, on vient de me répondre qu'il n'y avait aucun
problème avec PHP5.

Est-ce vrai (notamment pour l'injection de headers) ?

Donc ils font, sans rien faire sur $_POST :
mail($maildest,$_POST['subject'],$_POST['message'],"From :
".$_POST['mail']."\n MIME-Version: 1.0");

Merci.
Olivier Miakinen
2010-02-05 17:50:54 UTC
Permalink
Bonjour,
Post by Olivier Masson
J'ai toujours vérifié tout ce que je donnais comme arguments à mail(),
ce qui me parait évident.
Pourtant, en critiquant cette absence de toute forme de
vérification/filtrage, on vient de me répondre qu'il n'y avait aucun
problème avec PHP5.
Est-ce vrai (notamment pour l'injection de headers) ?
Ça semble vrai pour les paramètres $to et $subject, puisque tous les
caractères de contrôle sont remplacés par des espaces, sauf en ce qui
concerne les « folding white spaces » qui ne posent aucun problème :

<http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/ext/standard/mail.c?view=markup>

<cit.>
141 if (iscntrl((unsigned char) to_r[i])) {
...
148 to_r[i] = ' ';
149 }
</cit.>

<cit.>
164 if (iscntrl((unsigned char) subject_r[i])) {
...
166 subject_r[i] = ' ';
167 }
</cit.>

Mais il est bien évidemment impossible de supprimer les sauts de ligne
dans le paramètre $additional_headers, puisque ce paramètre est déjà
prévu pour recevoir plusieurs entêtes.
Post by Olivier Masson
".$_POST['mail']."\n MIME-Version: 1.0");
Horreur ! Malheur ! L'injection peut se faire via le paramètre
$_POST['mail']. Qui plus est, ils DOIVENT supprimer l'espace avant
MIME-Version, ils DOIVENT ajouter les entêtes Content-Type et
Content-Transfer-Encoding, et ils DEVRAIENT retirer l'espace après From.

Cordialement,
--
Olivier Miakinen
Olivier Masson
2010-02-05 20:07:53 UTC
Permalink
Post by Olivier Miakinen
Ça semble vrai pour les paramètres $to et $subject, puisque tous les
caractères de contrôle sont remplacés par des espaces, sauf en ce qui
Ok, merci.
Post by Olivier Miakinen
Horreur ! Malheur ! L'injection peut se faire via le paramètre
$_POST['mail']. Qui plus est, ils DOIVENT supprimer l'espace avant
MIME-Version, ils DOIVENT ajouter les entêtes Content-Type et
Content-Transfer-Encoding, et ils DEVRAIENT retirer l'espace après From.
Donc ça c'est toujours d'actualité.
Je peux toujours balancer un Bcc. Et comme le Content-type n'est pas
précisé, je (le méchant script kiddy) peux le faire moi-même en
indiquant autre chose que du texte brut, etc. ?
Post by Olivier Miakinen
Cordialement,
Rooh, tant de politesse n'est pas nécessaire avec moi :)
Olivier Miakinen
2010-02-05 20:32:47 UTC
Permalink
Post by Olivier Masson
Post by Olivier Miakinen
Horreur ! Malheur ! L'injection peut se faire via le paramètre
$_POST['mail']. Qui plus est, ils DOIVENT supprimer l'espace avant
MIME-Version, ils DOIVENT ajouter les entêtes Content-Type et
Content-Transfer-Encoding, et ils DEVRAIENT retirer l'espace après From.
Donc ça c'est toujours d'actualité.
Oui.
Post by Olivier Masson
Je peux toujours balancer un Bcc.
Voire quelques milliers de Bcc.
Post by Olivier Masson
Et comme le Content-type n'est pas
précisé, je (le méchant script kiddy) peux le faire moi-même en
indiquant autre chose que du texte brut, etc. ?
Oui. Même s'il était précisé, si c'était au même endroit que le
MIME-Version (donc après l'injection).

Qui plus est, tu peux même rajouter un contenu qui écrasera le vrai
contenu passé dans $_POST['message'].

Un commentaire dans la doc prétend que ça serait protégé en safe_mode :
<http://fr.php.net/manual/en/function.mail.php#94000>, néanmoins je ne
vois aucun code supprimant les doubles \r\n dans les headers, même dans
la version courante (PHP 6 trunk) :
<http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/mail.c?view=markup>.

Simplement, sans cordialité excessive,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...