Kontakformular - Sicherheitsproblem

Leider scheint das alles nicht die Lösung zu sein. Es ist immer noch möglich, durch *irgendeine* Sicherheitslücke Spam Mails zu verschicken, indem an irgendwelchen Headern durch bestimmte Eingaben ins Kontaktformular gedreht wird.

Ich habe nun hier einmal den Header einer solchen Spam Mail, kann daraus jedoch überhaupt nicht sehen, wie es möglich war, damit Spam zu verschicken, oder welche Header Teile oder sonstwas ich filtern muss, bzw. wie ich mein Kontaktformular sichern kann.

Hier einmal der Header:


Code:
From domainhoster.de-abuse-owner@mc.domainhoster.de Fri Feb 10 14:15:51 2006
Received: from mail.domainhoster.de (mail.domainhoster.de [80.252.97.22] (may be
forged))
        by intra.domainhoster.de (8.11.6/8.11.6) with ESMTP id k1ADFpJ16792
        for <abuse@intra.domainhoster.de>; Fri, 10 Feb 2006 14:15:51 +0100
Received: (qmail 2014 invoked by uid 508); 10 Feb 2006 13:14:49 -0000
Delivered-To: domainhoster.de-abuse@mc.domainhoster.de
Received: (qmail 2012 invoked by uid 508); 10 Feb 2006 13:14:49 -0000
Received: from unknown (HELO mailout.domainhoster.de) (80.252.97.82)
  by 0 with AES256-SHA encrypted SMTP; 10 Feb 2006 13:14:49 -0000
Received: from [205.188.156.71] (helo=omr-d06.mx.aol.com)
        by mailout.domainhoster.de with esmtp (Exim 4.54)
        id 1F7Y6q-0003wG-Ff
        for abuse@domainhoster.de; Fri, 10 Feb 2006 14:14:48 +0100
Received: from  scmp-m18.mail.aol.com (scmp-m18.mail.aol.com
[172.21.28.109]) by omr-d06.mx.aol.com (v107.10) with ESMTP id
RELAYIN8-943ec91c62e5; Fri, 10 Feb 2006 08:14:46 -0500
Received: from  imo-m25.mx.aol.com (imo-m25.mail.aol.com [172.20.107.71]) by
scmp-m18.mail.aol.com (v98.19) with ESMTP id RELAYIN4-543ec91bd309; Fri, 10
Feb 2006 08:14:37 -0400
Received: from undisclosed@undisclosed.com
        by imo-m25.mx.aol.com (mail_out_v38_r6.3.) id f.1f3.1b4498bf (4328)
         for <scomp@aol.net>; Fri, 10 Feb 2006 08:14:33 -0500 (EST)
From: <scomp@aol.net>
Message-ID: <1f3.1b4498bf.311debb9@aol.com>
Date: Fri, 10 Feb 2006 08:14:33 EST
Subject: Client TOS Notification
To: <undisclosed_recipients@aol.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="part1_1f3.1b4498bf.311debb9_boundary"
X-Mailer: 9.0 for scomp@aol.net
X-AOL-COUNTRY-CODE: US
X-Spam-Flag: NO
X-AOL-IP: 172.21.28.109
X-Loop: scomp


--part1_1f3.1b4498bf.311debb9_boundary
Content-Type: text/plain; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

 

--part1_1f3.1b4498bf.311debb9_boundary
Content-Type: message/rfc822
Content-Disposition: inline

Return-Path: <nobody@www4.c.domainhoster.de>
Received: from  rly-ya04.mx.aol.com (rly-ya04.mail.aol.com [172.18.141.86])
by air-ya02.mail.aol.com (vx) with ESMTP id MAILINYA22-15743e0aadf9e; Wed,
01 Feb 2006 07:35:45 -0500
Received: from  mailout2.domainhoster.de (mailout2.domainhoster.de [80.252.97.83])
by rly-ya04.mx.aol.com (vx) with ESMTP id MAILRELAYINYA43-15743e0aadf9e;
Wed, 01 Feb 2006 07:34:52 -0500
Received: from [80.252.97.18] (helo=www4.c.domainhoster.de)
        by mailout2.domainhoster.de with esmtp (Exim 4.30)
        id 1F4Gz1-0000IX-EJ; Wed, 01 Feb 2006 13:21:11 +0100
Received: (from nobody@localhost)
        by www4.c.domainhoster.de (8.11.6/8.11.6) id k11CL7G24151;
        Wed, 1 Feb 2006 13:21:07 +0100
Date: Wed, 1 Feb 2006 13:21:07 +0100
Message-Id: <200602011221.k11CL7G24151@www4.c.domainhoster.de>
X-AF-ID: 6309
X-AF-PWD: meinedomain.de/www
To: <Undisclosed Recipients>
Subject: Kalandariyah8050
Content-Type: text/html; charset=\"us-ascii\"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: Set to double or triple within DAYS
From: Kalandariyah8050@meinedomain.de
X-AOL-IP: 80.252.97.83
X-Mailer: Unknown (No Version)


Kann mir irgendjemand helfen? Ich verstehe einfach nicht, wie es möglich ist, über ein einfaches Kontaktformular (welches die mail() Funktion benutzt) weitere Adressen anzuschreiben um so das Formular als Spam Verteiler zu nutzen.

Wird vielleicht jemand aus dem Header schlau?

Vielen Dank für Eure Hilfe
 
Naja, im Skript ist die Ziel-Adresse fest vorgegeben, man kann also auf der Webseite im Formular keine Email Adresse oder sonstwas eingeben. Jedoch erhielten wohl einige Personen unaufgefordert Spam Emails (der Inhalt war halt Spam/Werbung), und der Provider hat eben festgestellt, dass es über mein Kontaktformular gelaufen sein muss. Und der Header oben ist eben einer dieser Spam Emails.

Nun weiß ich einfach nicht weiter. Ich muss irgendwas mit meinem Kontakt Formular Skript machen, aber wie mache ich es bloss sicher...
 
Hi DarthShader,

sieht wohl wirklich nach einem ähnlichen Problem aus *g*

Prüfst du denn die Eingaben auf möglichen HTML-Code? Gibt ja da den Befehl htmlspecialchars, mit dem einige HTML-Zeichen umgewandelt werden, damit eben nicht unbedingt alles ausgeführt wird.

Viele Grüße,
Chandini
 
Chandini hat gesagt.:
Prüfst du denn die Eingaben auf möglichen HTML-Code? Gibt ja da den Befehl htmlspecialchars, mit dem einige HTML-Zeichen umgewandelt werden, damit eben nicht unbedingt alles ausgeführt wird.

Nein, das mache ich nicht. In diesem Thread sagte man mir, dass die mail() Funktion von PHP "bösartige" Sachen, z.B. Versuche, neue Header hinzuzufügen, schon rausfiltert.

Ich weiß ja z.Z. noch nicht mehr, durch welches Feld das Problem auftaucht, durch das Subject oder durch das Textfeld ansich? In wie fern könnte man es denn erreichen, durch das Textfeld neue Header und damit neue Ziel-Adressen anzugeben?

Schlickser hat gesagt.:
Wieso gebt ihr als Absender nicht einfach eine andere email an, z.B. contact@domain.de
Und in der Mail steht dann:

Gesendet von: Absender
Betreff: Betreff
Text:

Was genau bringt das, eine andere Absender-Email anzugeben?
 
Ich sehe derzeit nur das Betreff-Feld als mögliches Schlupfloch. Wie sieht denn das verarbeitende Skript dazu aus?
 
Hi DarthShader,

also PHP macht z.B. aus \n autoamtisch \\n, aber HTML-Code bleibt so, wie er ist.

Wenn also in deinem Kontaktformular irgendwo ein HTML-Zeichen verwendet wird <> " ' &... dann steht das auch so in der Mail drin, die du über das Formular kriegst.

Ich habe bei mir für jedes Feld, dass der Benutzer ausfüllen kann, htmlspecialchars verwendet. Dann werden diese Zeichen eben entsprechend umgewandelt. Also aus & wird zum Beispiel &amp; usw.

Sieht bei mir dann so aus:
PHP:
$text = htmlspecialchars($text, ENT_QUOTES);

Hier findest auch nochmal ne genaue Beschreibung, was da passiert:
php.net HTMLspecialchars

Bin mittlerweile schon bei gut 6000 Spammails und werd mich jetzt mal an den Captchas versuchen.

Das wär natürlich auch noch ne Möglichkeit, die du probieren kannst. Ist zumindest sinnvoll, wenn kein Mensch, sondern ein Skript dein Formular zum Spams versenden missbraucht.

Dann muss der Nutzer vorm Absenden des Kontaktformulars die Buchstabenfolge aus einem Bild in ein Textfeld eingeben. Und nur wenn das korrekt gemacht wurde, wird das Formular abgeschickt.

Viele Grüße,
Chandini
 
Gumbo hat gesagt.:
Ich sehe derzeit nur das Betreff-Feld als mögliches Schlupfloch. Wie sieht denn das verarbeitende Skript dazu aus?

Das Skript ist sehr einfach gehalten, es sieht so aus:

Code:
switch ($action)
{
  case "":      //Contact_ShowForm();
                echo "<p>Das Kontaktformular wurde vorübergehend deaktiviert. Bitte besuchen Sie diese Seite zu einem späteren Zeitpunkt noch einmal. Wir bitten um Ihr Verständnis.</p>";
                break;

  case "send":  if ( Contact_CheckData($contact_name, $contact_mail, $contact_topic, $contact_text) )
                {
                  // Abschicken
                  mail("info@meinedomain.de", $contact_topic, "Name : $contact_name\nEMail Adresse : $contact_mail\n\nNachricht :\n\n$contact_text", "From: $contact_mail");
                  echo "<p>Vielen Dank für Ihre EMail, wir werden Ihnen sobald wie Möglich antworten.</p>";
                }
                else
                {
                  // Nicht abschicken
                  echo "<p style='color:red'>Fehler: Bitte füllen Sie alle Felder aus, um eine EMail an das Ärztenetz Plön zu schicken.</p>";
                  Contact_ShowForm();
                }
                break;
}

Die Funktion Contact_CheckData prüft lediglich, ob alle Felder nicht-leer sind, und gibt true oder false zurück. Dort oben verwende ich noch kein htmlspecialchars, das baue ich noch ein, aber ich kann mir z.Z. nicht vorstellen, wie man per HTML neue Header einfügen kann.


Chandini hat gesagt.:
Bin mittlerweile schon bei gut 6000 Spammails und werd mich jetzt mal an den Captchas versuchen.

Das wär natürlich auch noch ne Möglichkeit, die du probieren kannst. Ist zumindest sinnvoll, wenn kein Mensch, sondern ein Skript dein Formular zum Spams versenden missbraucht.

Ich werde htmlspecialchars gleich mal in das Skript einbauen. Aber ich bin mir nicht sicher, wie jemand neue Header in die Email packen kann, indem er HTML Code benutzt, das ist doch gar nicht möglich, oder doch?

Bei deinem Problem handelt es sicher aber eher darum, dass jemand oder ein Skript Dir Spam Mails schickt, ist das richtig? Da kann man sich natürlich nur mit einer Registrierung oder solchen Captchas helfen, bei mir ist das Problem jedoch, das ich ja gar nichts von dem Spam sehe, bei mir kommen nur leere Emails an, aber der Spammer schafft es eben, durch neue Header eine Spammail an Dritte zu schicken, eben über mein Skript.
 
Ich glaube das Schlupfloch gefunden zu haben: Entferne einfach alle Zeilenumbruchzeichen des Werts der $contact_from-Variable.
PHP:
function stripLinebreaks( $string )
{
	return preg_replace('/\x0A|\x0D\x0A|\x0D/s', '', $string);
}
 
Zurück