Hack über E-Mail-Formular?

27apricot

Erfahrenes Mitglied
Hallo,

ich hab' auf einer Internetseite ein Formular, um einen Rundbrief zu bestellen. Das auswertende PHP-Script macht nix weiter als ein Email an mich und eins an den Besteller zu senden. Jetzt bekomme ich seit zwei Tagen merkwürdig kryptische Emails (es waren seit gestern morgen schon fast 20), die offenbar mit diesem Formular zu tun haben. Das würde ich natürlich gern verhindern. Ich hab' aber keine Ahnung, wie jemand an die Daten kommt, die ja nicht im Quelltext der generierten HTML-Datei stehen. Deswegen weiß ich natürlich auch nicht, wie ich verhindern kann, dass da jemand rankommt.

So muss das Email normalerweise aussehen:

BETREFF: COSMOFONICS-Rundbrief | Bestellung
(»Bestellung« ist dabei dynamisch und könnte auch »Abbestellung« sein)
Code:
	Name:          (Name aus dem Formular)
	Email-Adresse: (Email-Adresse aus dem Formular)
	
	Bestellung (bzw. Abbestellung)
Ein Beispiel für die jetzt kommenden Emails:

BETREFF: COSMOFONICS-Rundbrief | evening1829@cosmofonics.com
Code:
	Name:          evening1829@cosmofonics.com
	Email-Adresse: has
Content-Type: multipart/alternative; boundary=d794dd2951f6c5d893c8613dcba1fb80
MIME-Version: 1.0
Subject: said tto. ou resemble
bcc: vickiebosworth@aol.com

This is a multi-part message in MIME format.

--d794dd2951f6c5d893c8613dcba1fb80
Content-Type: text/plain; charset=\"us-ascii\"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

enlivened be th appearance iv a outhern ongressman askin f r a foorth class post office. h prisidint hardly missed him be more thin a foot at th gate, but th ongressman bein formerly wan iv osby
--d794dd2951f6c5d893c8613dcba1fb80--

.
	evening1829@cosmofonics.com
Hier ist der Auszug des Quellcodes, der das Email an mich verschickt::
PHP:
	$empfaenger2 = "meine_adresse@cosmofonics.com";
	$betreff2 = "COSMOFONICS-Rundbrief | ".$was.""; // Variable $was ist Bestellung/Abbestellung
	$nachricht2 = "
	Name:          ".$_POST['name']."
	Email-Adresse: ".$_POST['mail']."
	
	".$was."
	";

	$headers = "MIME-Version: 1.0\r\n";
	$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
	$headers .= "From: cosmofonics <meine_adresse@cosmofonics.com>";

	mail($empfaenger2, $betreff2, $nachricht2, $headers);

Sorry, ist 'ne lange Anfrage. Vielleicht kann mir jemand einen Tipp geben, wie ich das Script sicherer gestalten kann. Vielen Dank im Voraus.

Schöne Grüße
27apricot
 
Ich bekomme seit 2 Tagen die gleichen und/oder ähnliche Mails.

Ich versuche jetzt den <input> Feldern andere Namen zu geben weil es sehr nach einem spam Bot ausschaut.

Auch das Gästebuch das ich seit 3 Tagen habe wird seit 2-3 Tagen völlig zugemüllt.
 
Füge mal am Ende des Zusätzliche-Header-Felder-Parameters zwei zusätzliche Zeilenumbruch-Zeichensequenzen an.
 
Gumbo hat gesagt.:
Füge mal am Ende des Zusätzliche-Header-Felder-Parameters zwei zusätzliche Zeilenumbruch-Zeichensequenzen an.
Meinst du das so?
PHP:
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
$headers .= "From: cosmofonics <meine_adresse@cosmofonics.com>\r\n\r\n";
 
Hallo Gumbo,

danke dir, ich hab's hochgeladen und werde sehen, ob in den nächsten Tagen noch mehr von diesen Emails kommen.

Allerdings hab' ich bemerkt, dass die so eingefügten Zeilenumbrüche quasi im Nachrichtentext stehen. Sprich: den drei Textzeilen, die zu sehen sind, sind nun zwei Leerzeilen vorangesetzt. Das ist in diesem Fall nicht weiter dramatisch. Komisch find' ich's aber doch.

ciao:
27apricot
 
Der Quellcode einer Spam-Mail:
Code:
From - Sat Mar 04 12:57:42 2006
X-Account-Key: account4
X-UIDL: daY"!ALH!!=H(#![SK!!
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Return-Path: <wwwrun@s15.pixelx.de>
X-Envelope-To: <meine_adresse@cosmofonics.com>
Received: from s15.pixelx.de (localhost [127.0.0.1])
	by s15.pixelx.de (8.13.1/8.11.6) with ESMTP id k24B7QE8028813
	(using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified NO)
	for <meine_adresse@cosmofonics.com>; Sat, 4 Mar 2006 12:07:26 +0100
Received: (from wwwrun@localhost)
	by s15.pixelx.de (8.13.1/8.12.3/Debian-5) id k24B7QbW028810;
	Sat, 4 Mar 2006 12:07:26 +0100
Date: Sat, 4 Mar 2006 12:07:26 +0100
Message-Id: <200603041107.k24B7QbW028810@s15.pixelx.de>
To: meine_adresse@cosmofonics.com
Subject: COSMOFONICS-Rundbrief | evening1829@cosmofonics.com
MIME-Version: 1.0
Content-type: text; charset=iso-8859-1
From: cosmofonics <meine_adresse@cosmofonics.com>
X-UIDL: daY"!ALH!!=H(#![SK!!
Status: U


	Name:          evening1829@cosmofonics.com
	Email-Adresse: has
Content-Type: multipart/alternative; boundary=d794dd2951f6c5d893c8613dcba1fb80
MIME-Version: 1.0
Subject: said tto. ou resemble
bcc: vickiebosworth@aol.com

This is a multi-part message in MIME format.

--d794dd2951f6c5d893c8613dcba1fb80
Content-Type: text/plain; charset=\"us-ascii\"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

enlivened be th appearance iv a outhern ongressman askin f r a foorth class post office. h prisidint hardly missed him be more thin a foot at th gate, but th ongressman bein formerly wan iv osby
--d794dd2951f6c5d893c8613dcba1fb80--

.

	
	evening1829@cosmofonics.com
Jetzt mit den eingefügten Umbrüchen fiel übrigens die Zeile »Status: U« direkt vorm Nachrichtentext weg, die sonst auch bei den regulären Emails da stand.

Außerdem fiel mir gerade folgendes ein: ich hab' den Content-Type im Header erst jetzt in »text/plain« geändert. Vorher stand dort (siehe oben) in Ermangelung besseren Wissens nur »text«. Vielleicht hat das ja auch was damit zu tun?

Danke + schöne Grüße
27apricot

EDIT Hab' gerade wieder drei solcher Spam-Mails bekommen. Diesmal also mit text/plain und Zeilenumbrüchen. »Status: U« steht auch wieder da...
 
In der c't (Ausgabe 22/05, Seite 208) im Artikel "Mail-Formulare auf Webseiten absichern" ist genau das Problem beschrieben. Zu diesem Beitrag gab es auch ein Codebeispiel zum runterladen:

ftp://ftp.heise.de/pub/ct/listings/0522-208.zip


Im größen und ganzen geht es darum, Zeilenumbruche (\n)zu entfernen, da diese Bestandteil des SMTP Protokolls sind. Viel Erfolg beim umsetzen
 
Du müsstest so etwas wie eine Menschlichkeits-Verifikation einbauen, etwa ein zusätzliches Formularelement, das nur von einem Mensch richtig ausgefüllt werden kann. Beispielsweise:
PHP:
<?php

	session_start();

	if( !defined('CRLF') ) {
		define('CRLF', chr(0x0D).chr(0x0A));
	}

	$_notes = array(
		'error'   => array(),
		'notice'  => array(),
		'success' => array()
	);
	$_requiredArguments = array(
		'SESSION' => array(
			'verification-hash' => 'Die Verifizierungsprüfsumme wurde nicht gesetzt. Gehen Sie zum Formular zurück.'
		),
		'POST' => array(
			'verification-hash' => 'Die Verifizierungsprüfsumme fehlt.',
			'verification-question' => 'Bitte beantworten Sie die Verifizierungsfrage.',
			…
		)
	);
	foreach( $_requieredArguments as $method => $arguments ) {
		if( !isset(${'_'.$method}) ) {
			header($_SERVER['SERVER_PROTOCOL'].' 500 Internal Server Error', true);
			exit;
		}
		foreach( $arguments as $key => $message ) {
			if( !isset(${'_'.$method}[$key]) || trim(${'_'.$method}[$key]) == '' ) {
				$_notes['error'][] = $message;
			}
		}
	}

	if( $_POST['verification-hash'] != $_SESSION['verification-hash'] ) {
		$_notes['error'][] = 'Die Verifizierungsprüfsummen stimmen nicht überein.';
	}
	if( !preg_match('/wei(?:ß|ss)/si', trim($_POST['verification-question']) ) |
		$_notes['error'][] = 'Die Verifizierungsfrage wurde falsch beantwortet.';
	}


	if( $_SERVER['REQUEST_METHOD'] == 'POST' && empty($_notes['error']) ) {
		$subject = 'COSMOFONICS-Rundbrief | '.$was;
		$body = '
	Name:          '.$_POST['name'].'
	E-Mail-Adresse: '.$_POST['mail'].'

	'.$was;
		$additonalHeaderFields = array(
			'MIME-Version'  => '1.0',
			'From'         => 'cosmofonics <meine_adresse@cosmofonics.com>',
			'Content-Type' => 'text/plain; charset=iso-8859-1'
		);
		$additionalHeader = '';
		foreach( $additionalHeaderFields as $key => $value ) {
			$additionalHeader .= $key.': '.$value . CRLF;
		}
		mail('meine_adresse@cosmofonics.com', $subject, $body, $additionalHeader);
		exit;
	}

	$_SESSION['verification-hash'] = md5(microtime());

	if( !empty($_notes['error']) ) {
		echo '<div class="note error"><ul>';
		foreach( $_notes['error'] as $message ) {
			echo '<li>'.$message.'</li>';
		}
		echo '</ul></div>';
	}

?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
	<input type="verification-hash" value="<?php echo $_SESSION['verification-code']; ?>">
	…
	<p><label>Welche Farbe hat Kuhmilch? <input type="text" name="verification-question"></label></p>
</form>
Ist doch etwas komplexer geworden als ich dachte und vorhatte.
 
Zurück