Kontakformular - Sicherheitsproblem

DarthShader

Erfahrenes Mitglied
Hallo,

ich habe ein einfaches Kontaktformular, dessen Inhalt per mail(...) Funktion an eine Email Adresse geschickt wird. Nun habe ich von einer Sicherheitslücke gehört, welches Leuten erlaubt, per Angabe von weiteren Headern im Textfeld des Kontaktformulares das Kontaktformular als Spam Verteiler auszunutzen.

Deshalb die Frage, was genau muss ich von dem Text, welchen der Benutzer eingibt, filtern? Reichen solche StripTag - Befehle von PHP, oder muss ich selbst "manuell" prüfen, ob irgendwelche Header angegeben wurden (falls ja, einfach nach dem "Header" string suchen, oder gibt es eine bessere Möglichkeit?) ?

Über jeden Tipp wäre ich dankbar


Vielen Dank!
 
Ist doch das übliche Code-Injection Problem und hat denk ich mal nicht mit einer speziellen Sicherheitslücke zu tun.

Du musst halt die Anführungszeichen escapen, wie du schon gesagt hast.
 
Grundsätzlich hat Katzenbauer mit der Nennung des Stichworts Code-Injektion Recht. Allerdings ist das von dir erwähnte Problem der unerlaubten Setzung eigener Header-Felder nicht nur einfaches Flüchten von Anführungszeichen getan. Vielmehr sollten die vom Benutzer eingegebenen Daten zuerst validiert werden, bevor sie eingesetzt werden. Im Falle einer E-Mail-Adresse wäre es die Entfernung unerlaubter Zeichen wie etwa das Zeilenumbruchzeichen.
 
Danke für die Antworten. Es ist keine echte Sicherheitslücke, da habt ihr schon recht und ich habe mich wohl etwas falsch ausgedrückt.

Der Benutzer kann in dem Formular keine Email Adresse angeben, diese ist fest im Code, deshalb brauche ich auch kein regex o.Ä. für Email Adressen. Es geht lediglich um den Text, der abgeschickt wird. Leider kenne ich mich mit dieser Header Sache nicht so gut aus, ich weiß also überhaupt nicht, wie solch ein Versuch aussieht, und weiß daher auch nicht, was genau ich filtern muss.

Könnt ihr mir dazu etwas genaueres/konkretes sagen?

Danke
 
Solange der Inhalt der E-Mail über den entsprechenden Parameter der mail()-Funktion übergeben wird, sollte die Manipulation des E-Mail-Headers nicht möglich sein.
 
Hm, das verstehe ich jetzt gerade nicht. Die Sache ist die, dass diese Hinweis auf das Sicherheitsproblem von meinem Provider kam. Der Wortlaut:

ich musste Ihr Kontakformular unter .........de deaktivieren. Über
dieses Formular ist es möglich SPAM an beliebige Emailadressen zu Versenden.
Ihr Formular erlaubt durch Zeilenumbrüche in den Eingaben die Übergabe
weiterer Header.
Bitte beheben Sie diesen Fehler bevor Sie das Script wieder in Betrieb
nehmen.

In dem Skript sieht der code zum Versenden so aus:

Code:
mail("info@........de", $contact_topic, "Name : $contact_name\nEMail Adresse : $contact_mail\n\nNachricht :\n\n$contact_text", "From: $contact_mail");

Sollte ja selbsterklärend sein. Es handelt sich um die PHP Version 4.2.2., auf die habe ich natürlich keinen Einfluss. Wenn man nach solch einem PHP mail exploid googlet, findet man auch einige Hinweise darauf, nur nicht, was genau man im Code dagegen tun kann. Die Mail oben sagt etwas über Zeilenumbrüche, aber jetzt alle Zeilenumbrüche aus dem Text zu entfernen kann's ja auch nicht sein.

Man muss sicherlich einfach nur etwas aus dem Text ( $contact_text ) filtern, nur weiß ich überhaupt nicht, was.
 
Das Problem dürfte die ungeschütze Angabe des Betreffs sein.

Der Betreff wird nämlich im Header mithilfe von
"Subject: Dein Betreff" angegeben.

Übergebe ich jetzt in die Variable $contact_topic
folgendes:
Code:
$contact_topic = "Mein Betreff\nTo: andere@email.adresse\nBCC: mail@adresse.de"
Dann generiert das Mail Programm daraus folgenden Header:
Code:
Subject: Mein Betreff
To: andere@email.adresse
BCC: mail@adresse.de

Was dazu führt das die eMail an andere verschickt wird, was nicht gewünscht ist.

Einfachster Weg das zu unterbinden, ist einfach nur bis zum ersten auftreten eines Newline (\n) den Betreff zu übernehmen. Geht wohl am einfachsten und Performancesparsamsten mit einer Abfrage mittels index ob ein \n auftritt und wenn ja, an welcher Position und dann einem entsprechenden substr vom Start des Betreffs bis zur Position unmittelbar VOR dem \n.

Kann aber auch sein dass ich das jetzt total falsh interpretiere. ;)
 
Ah natürlich, auf das Subject habe ich jetzt gar nicht geachtet. Ich dachte die ganze Zeit daran, dass im eigentlichen Textfeld etwas angegeben wird.

Gut, dann werde ich mal den Subject Code anpassen, ich hoffe, das wird den Provider zufriedenstellen :)

Danke für die Hilfe
 
Oh, ich glaube ich habe etwas vorschnell geurteilt. Ich habe es eben nochmal ausprobiert, und ein Newline Char wird automatisch escaped, wenn ich also als Betreff im Formular angebe:

"Guten Tag\nTo: test@nospamplease.com"

So kommt es beim Skript als

"Guten Tag\\nTo: test@nospamplease.com"

an, das \n also nun noch ein Backslash davor hat. Warum das so ist, kann ich gar nicht sagen, denn der Code macht in der Hinsicht garnichts.

Allerdings ist das auch nicht wichtig, denn damit dürfte klar sein, dass diese Ausnutzung nicht funktioniert (habe es ebenfalls gerade ausprobiert).

Da frage ich mich doch, was könnte denn noch das Problem sein, wenn ganz sicher ist, dass PHP nichts an den Headern dreht, wenn man im eigentlichen Textfeld irgendwas angibt und den richtigen Parameter der mail() Funktion für den Text benutzt :confused:
 
Eigentlich solltest du dir nur um die eingefügten Werte des vierten Parameters, des so genannten „additional headers“-Parameters, Gedanken machen. Denn alle anderen Paramtetern sollten bereits von PHP automatisch „entschärft“ werden.
 
Zurück