Michael: E-Mail-Injektion

Hallo,
welche Gefahren existieren bei der Verwendung von php-Kontakt-
formularen? Ich habe bei Wiki etwas über E-Mail-Injektion gelesen
und dort wird geschrieben, daß die einzig wirksame Maßnahme das
Unterbinden von Zeilenumbrüchen in Variablen ist, die später in den Header der E-Mail eingefügt werden sollen.
1.Frage: Wie macht man diese Unterbindung?
2.Frage: Gibt es noch andere Angriffs-Szenarien in einem php-
  Formular?
Michael

  1. Ich habe bei Wiki etwas über E-Mail-Injektion gelesen
    und dort wird geschrieben, daß die einzig wirksame Maßnahme das
    Unterbinden von Zeilenumbrüchen in Variablen ist, die später in den Header der E-Mail eingefügt werden sollen.

    http://de.wikipedia.org/wiki/Email_Injection

    1.Frage: Wie macht man diese Unterbindung?

    Durch Filtern.

    2.Frage: Gibt es noch andere Angriffs-Szenarien in einem php-
      Formular?

    Du solltest natürlich im PHP-Code alles (die erhaltenen Formularwerte) im Griff haben und bspw. die Empfängeraddressen nur serverseitig halten bzw. fleissig prüfen.

    Ansonsten, ja, PHP scheint nicht ganz sicher zu sein:
    http://blog.php-security.org/
    http://www.heise.de/newsticker/meldung/82467
    "Sobald man die Sicherheit von PHP kritisiere, werde man im Security Team selbst zur "Persona non Grata". Zudem würden viele seiner Vorschläge ignoriert, weil die Entwickler behaupten, Essers Wortwahl sei zu unfreundlich." - alarmierend

  2. Hallo,
    welche Gefahren existieren bei der Verwendung von php-Kontakt-
    formularen? Ich habe bei Wiki etwas über E-Mail-Injektion gelesen
    und dort wird geschrieben, daß die einzig wirksame Maßnahme das
    Unterbinden von Zeilenumbrüchen in Variablen ist, die später in den Header der E-Mail eingefügt werden sollen.
    1.Frage: Wie macht man diese Unterbindung?
    2.Frage: Gibt es noch andere Angriffs-Szenarien in einem php-
      Formular?
    Michael

    Unterbinden:
    Das kannst Du wahrscheinlich nicht erreichen. Ist aber meist nicht so wichtig.

    Dagegen, was auch zur 2. Frage zählt, kann auf serverseitig etwas machen, was das Handling der Daten anbelangt.
    Du mußt ja nicht alle wilden Szenarien schon auf dem Client filtern lassen, was auch gar nicht immer geht. Darum muß sich Server kümmern.

    Beschreib das mal konkreter.

    Gruß
    Reiner

  3. Hi!

    welche Gefahren existieren bei der Verwendung von php-Kontakt-
    formularen?

    Es sind keine "php-Kontakt-formulare", sondern HTML-Kontaktformulare und PHP-Scripte.
    Es besteht die Gefahr, daß unerwünschte Werte an dein Script übergeben werden und davon in einer Weise verarbeitet werden, die du nicht willst.
    Diese Daten müssen aber gar nicht über das Kontaktformular kommen.
    Vergiß das Formular am Besten erst mal. Man könnte auch Daten auf einem anderen Weg an dein Script übergeben.
    Wenn Mailscripte zum Spammen mißbraucht werden, dann wird das eigentliche Kontaktformular meist gar nicht genutzt, sondern die Daten werden automatisiert per Script geschickt.
    Würde man nur das Formular nutzen können, wäre das Risiko gar nicht so hoch.
    Wenn du ein <input type="text"> hast, könnte man da gar keine Zeilenumbrüche eintippen...

    Ich habe bei Wiki etwas über E-Mail-Injektion gelesen
    und dort wird geschrieben, daß die einzig wirksame Maßnahme das
    Unterbinden von Zeilenumbrüchen in Variablen ist, die später in den Header der E-Mail eingefügt werden sollen.

    Ja, Email-Header werden durch Zeilenumbrüche voneinander abgetrennt.
    Daher sind diese Zeilenumbrüche potentiell gefährlich.
    Ein Angriff per Mailheader-Injection wäre denkbar.
    Wenn man jetzt beispielsweise eine CC- oder BCC-Headerzeile einfügt, wäre es damit möglich, eine Email an weitere Empfänger zu schicken.
    Dr. Web erklärt die Spam-Gefahr durch Kontaktformulare.

    1.Frage: Wie macht man diese Unterbindung?

    Mit Hilfe der Funktion preg_replace() oder mit Stringfunktionen könntest du ungewünschte Zeichen ersetzen.
    Es bleibt aber die Frage, ob du gefährliche Zeichen einfach nur durch Nichts ersetzen (sprich löschen) willst, oder ob du eine Abfrage einbaust und in so einem Fall dann lieber gar keine Mail verschickst.

    2.Frage: Gibt es noch andere Angriffs-Szenarien in einem php-
      Formular?

    Das kommt immer auf dein Script an.
    Wenn du Daten verarbeitest, die von außen zu deinem Script kommen, dann mußt du diese Daten grundsätzlich immer als _böse_ ansehen, überprüfen und ggf. bereinigen.
    Nie, nie, niemals darfst du Daten ungeprüft in deine Abfragen einbauen oder an Funktionen übergeben.

    Je nachdem, was du für ein Script hast, gäbe es verschiedene Angriffsmöglichkeiten.

    Wenn du jetzt beispielsweise verschiedene Dateien in deiner Website einbindest, wäre folgendes gefährlich:
    <a href="script.php?site=impressum.php">Impressum</a>
    <?php include( $_GET['site'] ); ?>
    Was wäre, wenn man die Website jetzt mit script.php?site=../../../etc/passwd aufruft? (OK. Etwas übertriebenes Beispiel. Würde so wahrscheinlich nicht funktionieren, aber das Prinzip ist erkennbar.)
    Dann würde die Paßwort-Datei des Systems eingebunden werden. Auch wenn dort kein PHP-Code drin steht, könnte es zu einer Fehlermeldung kommen, die eventuell Paßwörter preis gibt.

    Vielleicht bietet die Website noch die Möglichkeit, eines Dateiuploads. Vielleicht kann man dort Bilder hochladen und eventuell wird auch dort nicht oder nicht richtig geprüft.
    Vielleicht wird nicht geprüft, ob es sich bei einer Datei wirklich um ein Bild handelt. Wird nämlich nur auf Dateiendung geprüft (und nicht auf den Inhalt), dann benenne ich boesesScript.php in bild.jpg um und lade es hoch.

    Und dann binde ich mein Script über den obigen Link ein. Schon wird mein Script ausgeführt und stellt sonstwas mit dem Server an.
    Sicher wäre diese Version:
    <a href="script.php?site=impressum">Impressum</a>

    <?php  
    switch ( $_GET['site'] )  
    {  
     case 'impressum':  
      include( 'impressum.inc.php' );  
      break;  
     default:  
      break;  
    }  
    ?>
    

    Gefährlich ist es auch, wenn ungeprüft Daten in SQL-Abfragen eingebaut werden.
    Dann übergebe ich SQL-Code um die Datenbank zu löschen oder mir die Paßwort-Tabelle ausgeben zu lassen...
    <a href="zeigeArtikel.php?id=1">Artikel Nr. 1</a>

    <?php  
    $sql = "SELECT datensatz FROM tabelle WHERE id = $_GET['id']";  
    mysql_query( $sql );  
    ?>
    

    Jetzt rufe ich die Seite auf mit zeigeArtikel.php?1;BÖSER SQL-BEFEHL
    und schon sieht es ganz schlecht aus... (Sind wieder keine guten Beispiele, aber das Prinzip ist erkennbar.)
    So könnte ich in einem Board vielleicht einen neuen User mit Adminrechten anlegen oder ich könnte die Datenbank löschen oder sonstwas.
    Daher müßte man in solchen Abfragen immer prüfen, ob nicht eventuell SQL-Code übergeben wurde und diesen dann ggf. unschädlich machen.
    In PHP gibt es für solche Zwecke die Funktion mysql_real_escape_string().

    Es gäbe noch eine ganze Reihe an weiteren Beispielen, was man alles machen könnte.
    Du mußt daher alle Daten, die irgendwie an dein Script übergeben werden, in jedem Fall immer prüfen.

    Diese beiden Artikel aus der Wikipedia dürften für dich noch ganz interessant sein:
    Cross-Site-Scripting
    SQL-Injection

    Schöner Gruß,
    rob

    1. Hallo,
      vielen Dank für Deine Mühe. Werde ich mir alles durchlesen.