Sven Rautenberg: PHP-Skript deaktiviert / Spam durch mail()-method !?!?!?

Beitrag lesen

Moin!

Im Quelltext ist der Empänger und der Absender "hart-kodiert". Daher verstehe ich nicht, wo dort eine Lücke sein soll....

Grundsätzlich sind die "Additional Header", also der vierte Parameter der mail()-Funktion, dein Feind. Hier kann man, wenn man in der Lage ist, zusätzliche ZEILEN in den String einzufügen, sowohl weitere Empfänger einfügen, eventuell sogar neuen Mailcontent.

Denn in diesem String ist das natürliche Trennzeichen für mehrere Header ja auch "\r\n" bzw. "\n" - schafft man es, durch geschickte Inhaltsbelegung der Formularfelder, eine neue Zeile einzufügen, hat der Spammer gewonnen.

Ein harmlos wirkendes

  
mail("hartcodiert@example.com", "Betreff: Hartcodiert", "Textinhalt: Hartcodiert", "Cc: $variable_aus_form");  

kann fatal werden, wenn man manipuliert, so dass

  
$variable_aus_form="nr-zwei@example.com\r\nBcc: spammeropfer@example.net";  

Dein angegebener Code ist deshalb unvollständig, weil man nicht bis exakt zum Anfang zurückverfolgen kann, welche Inhalte in deinem Mailbefehl

  
mail($mail_to,$mail_subject,$mail_body,$mail_headers,"-f ".$mail_from);  

wirklich durchkommen.

$mail_headers ist die fragliche Variable, um die es mindestens geht. Ich hatte auch den zweiten Parameter selbst gerade geprüft, dort eingeschmuggelte Zeilenumbrüche wurden aber von meiner PHP-Version in Leerzeichen gewandelt und somit nicht ausgeführt. Das kann aber durchaus bei anderen Versionen oder anderen Mailservern auch schlechter gehandhabt werden - es ist also ein weiteres
potentielles Angriffsziel.

$mail_headers setzt sich zusammen aus:

  
    $mail_headers = '';  
    if(!empty($mail_from)) $mail_headers .= "From: $mail_from\n";  
    if(!empty($mail_reply_to)) $mail_headers .= "Reply-to: $mail_reply_to\n";  
    if(!empty($mail_cc)) $mail_headers .= "Cc: " . str_replace(";", ",", $mail_cc) . "\n";  
    if(!empty($mail_bcc)) $mail_headers .= "Bcc: " . str_replace(";", ",", $mail_bcc) . "\n";  

Wie man sieht: Es wird richtig eklig, weil jeder der hier verwendeten Variablen, nämlich $mail_from, $mail_reply_to, $mail_cc und $mail_bcc, unbedingt auf eingeschleppte Zeilenschaltungen geprüft werden muß.

Das ganze sinnlose Ins-Array-Ein-und-wieder-ausgepacke treibt die Unübersichtlichkeit des Codes dabei natürlich noch in die Höhe.

Entscheidend ist daher eigentlich nur:
Woher kommen im Funktionsaufruf von
cms_send_mail($mail_to,$mail_subject,$mail_body,$mail_type,$reply_email)
die übergebenen Parameter? Insbesondere $mail_to und $reply_email.

- Sven Rautenberg

--
My sssignature, my preciousssss!