• Spamversand über PHP Formulare

Spamversand via Mailformular (PHP, Perl)


Ein neuer Trick von Spam-Versendern ist das verwenden von bestehenden Mailformularen. Es handelt sich dabei um normale PHP oder Perl Formulare welche aufgrund von Email Standards (MIME, SMTP) einfach zweckentfremdet werden können. So können in diese Formulare problemlos tausende von zusätzlichen Empfängeradressen (CC, BCC) eingetragen werden und auch mit entsprechender Nachricht versehen werden. Ihr normales „Feedback“ oder „Info“ – Formular wird so für uns zum ernsthaften Sicherheitsproblem.

Dieses Problem ist seit einigen Monaten bekannt, eine Patentlösung dagegen gibt es leider nicht. Wir können Ihnen aber eine Reihe von Vorschlägen unterbreiten:

Auf einen Blick

  • Es betrifft alle PHP und Perl Scripts, welche Emails versenden können
  • Jedes Email Formular kann böswillig zum Spam-Versand verwendet werden
  • Botnet/Spiders durchsuchen das World Wide Web nach PHP Scripts mit Sicherheitslücken
  • Der Bot verwendet die definierten Formularfelder (auch hidden fields) und versucht die Header-Informationen darüber ins Formular einzuspeisen

Vermutlich werden Listen von verwundbaren Seiten angefertigt, über die dann Spam und Viren im grossen Stil versendet werden können

Ist mein Skript betroffen? Ist mein Skript verwundbar?

Falls Sie ein PHP Script haben, welches eingegebene Daten von Internet Usern für den Mailversand nutzt, dann ist Ihr Script potentiell gefährdet. Haben Sie in letzter Zeit häufig Spam Mails erhalten und handelte es sich beim Absender um eine hostcenter.com Adresse oder Ihre normale Absenderadresse vom Feedback Formular?

Ich schreibe meine Formulare selber, bin ich auch betroffen?

Ja, bitte beachten Sie die nachfolgenden Hinweise.
Lösung:

1. Vor dem Versand Filtern:

Sie können den Missbrauch verhindern, indem Sie die eingegebenen Daten vor dem Versand validieren und das Script nur ausgeführt werden kann, wenn alle unerwünschten Email-Adressen Eingaben/Strings entfernt wurden. Zum Beispiel können Sie die preg match Funktion in PHP nutzen, um dies zu bewerkstelligen. Falls preg match negativ ist, dann läuft das Script nicht weiter. Sie können zum Filtern folgenden Ausdruck gebrauchen:

Ausdruck, um Namensfelder zu validieren:

'/^[a-z0-9()/'":*+|,.; - !?&#$@]{2,75}$/i'

Ausdruck, um Email Adress Felder zu validieren:

'/^[^@s]+@([-a-z0-9]+.)+[a-z]{2,}$/i'

Zum Beispiel können Sie folgenden Code in Ihr Script einbauen:

$emailPattern = '/^[^@s]+@([-a-z0-9]+.)+[a-z]{2,}$/i';
if (!preg_match($emailPattern, $emailFieldToTest)){
print 'Please review the email address you entered. There seems to be a problem';
}

2. Nach dem Versand Filtern:

Man kann Usern (oder in diesem Falle böswilligen Scripts) verbieten, weitere Header Informationen zu übermitteln und kann diese vor dem Versand rausfiltern. Das geht folgendermassen:

function safe( $name ) {
return( str_ireplace(array( "r", "n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:" ), "", $name ) );
}

Bemerkungen: str_ireplace ist eine PHP5 Funktion. Falls Sie eine ältere PHP Version verwenden, dann können Sie preg_replace verwenden mit dem i Modifikator. 

Eine andere Methode furs Herausfiltern nach dem Versand könnte wie folgt aussehen. Bitte achten Sie darauf, $_POST mit $_GET zu ändern, falls Sie die GET-Variante in Ihrem Formular verwenden.

foreach( $_POST as $value ){
    if( stripos($value,'Content-Type:') !== FALSE ){
        mail('admin@somehwere.com','Spammer Bot Attempt',$_SERVER['REMOTE_ADDR']);   
        exit("{$_SERVER['REMOTE_ADDR']} Has been Recorded");
    }
}

Warum funktioniert dieser Missbrauch? Ist PHP nicht sicher?

Dieser Missbrauch hat nichts mit dem Verhalten von PHP zu tun, deshalb ist es kein Fehler von PHP. Dieser Exploit funktioniert aufgrund von MIME und SMTP Standards.

Beispiel:
array(53) { ["HOME"]=> string(1) "/" ["PATH"]=> string(29) "/sbin:/bin:/usr/sbin:/usr/bin" ["_submit"]=> string(25) "rfljy@example.com" ["password"]=> string(438) "rfljy@example.com Content-Type: multipart/mixed; boundary="===============1104808547==" MIME-Version: 1.0 Subject: da79e5ec To: rfljy@example.com bcc: Homeiragtime@aol.com From: rfljy@example.com
This is a multi-part message in MIME format.
--===============1104808547== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit
twjgdcbd --===============1104808547==-- " ["PHPSESSID"]=> string(25) "rfljy@example.com"

Weitere Informationsquellen / Hilfeseiten / Downloads von sicheren Skripts

http://www.tutorialtastic.co.uk/page.php?p=php_feedback_form_advanced
http://www.heise.de/security/artikel/66815
http://www.nyphp.org/phundamentals/email_header_injection.php