Mittwoch, 8. Februar 2012 |
In dieser Folge geht es um das Einschleusen zusätzlicher Daten in SMTP. SMTP, das Simple Mail Transfer Protocol, ist für das Versenden bzw. den Transport von E-Mails zuständig und kommt im Rahmen von Webanwendungen immer dann zum Einsatz, wenn Daten z.B. aus einem Kontaktformular per E-Mail verschickt werden.
SMTP wurde erstmals 1982 in RFC 821 definiert und 2001 in RFC 2821 erstmals aktualisiert. Die aktuelle Definition befindet sich in RFC 5321 vom Oktober 2008, in dem alle neuen Entwicklungen berücksichtigt und eventuelle Unklarheiten beseitigt wurden.
SMTP ist ein textbasiertes Protokoll, eine Authentifizierung findet nicht statt. Dadurch kann eine E-Mail auch z.B. über telnet "von Hand" verschickt werden. Eine SMTP-Sitzung läuft dabei ungefähr folgendermaßen ab:
| Client | Server | |
|---|---|---|
| Der Server begrüßt den Client: | ||
| <-- | 220
mail.server.example SMTP Irgendein
Mailserver |
|
| Der Client meldet sich an: | ||
HELO
rechner.client.example |
--> | |
| Der Server bestätigt die Anmeldung: | ||
| <-- | 250
Hello rechner.client.example, nice to meet
you |
|
| Der Client gibt die Absenderadresse an: | ||
MAIL
FROM:<absender@client.example> |
--> | |
| Der Server bestätigt die Absenderadresse: | ||
| <-- | 250
Sender OK |
|
| Der Client gibt die Empfängeradresse an: | ||
RCPT
TO:<irgendwer@irgendwo.example> |
--> | |
| Der Server bestätigt die Empfängeradresse: | ||
| <-- | 250
Recipient OK |
|
| Der Client kündigt die Mail an: | ||
DATA |
--> | |
| Der Server bestätigt seine Empfangsbereitschaft und teilt mit, wie das Ende der Mail gekennzeichnet werden soll: | ||
| <-- | 354
End data with
<CR><LF>.<CR><LF> |
|
| Der Client schickt nun die komplette Mail. Sie muss mit einer Zeile, die nur einen Punkt enthält, abgeschlossen werden: | ||
From:
<absender@client.example> |
--> | |
| Der Server bestätigt den Empfang der Mail und wird sie nun an den Empfänger weiterleiten: | ||
| <-- | 250
Message accepted for delivery |
|
| Der Client meldet sich ab: | ||
QUIT |
--> | |
| Der Server bestätigt die Abmeldung: | ||
| <-- | 221
See you later |
|
Der Client muss jeweils auf die Antwort des Servers warten, bevor er den nächsten Befehl senden kann.
Weitere Empfänger können durch Komma getrennt im To:-Header angegeben werden, außerdem stehen dafür die Cc:- und Bcc:-Header für Kopien bzw. Blindkopien zur Verfügung.
Kontaktformulare enthalten meistens Eingabefelder für die
E-Mail-Adresse des Absenders, den Betreff (Subject) und die eigentliche
Nachricht. Die Eingaben können dann z.B. dem PHP-Befehl
mail() übergeben werden, der daraus dann eine E-Mail
erzeugt und die notwendige SMTP-Kommunikation mit dem SMTP-Server
abwickelt.
Der Befehl mail() benötigt mehrere Parameter: Die Adresse
des Empfängers, der Betreff und die Nachricht sind zwingend
erforderlich, optional können weitere Header und weitere Parameter
angegeben werden. Der Parameter für weitere Header enthält
insbesondere den From:-Header. Gelingt es einem Angreifer, zusätzliche
Daten in das Eingabefeld für die Absender-Adresse einzuschleusen,
können darüber die Header manipuliert werden, so dass z.B. die
Nachricht an weitere Empfänger verschickt wird - fast schon ideal zum
Spammen.
Betrachten wir zuerst eine normale Eingabe:
Daraus erzeugt mail() folgende E-Mail:
To: admin@server.example
From: irgendwer@boeses.example
Subject: Schwachstelle im Kontaktformular
Ihr Kontaktformular ist nicht ganz dicht!
Genau so sollte sie auch aussehen. Jetzt das ganze mit einem zusätzlichen Header im Eingabefeld für die E-Mail-Adresse:
Daraus erzeugt mail() die folgende E-Mail:
To: admin@server.example
From: irgendwer@boeses.example
Bcc: einer@irgendwo.example
Subject: Schwachstelle im Kontaktformular
Ihr Kontaktformular ist nicht ganz dicht!
Der Inhaber der Adresse einer@irgendwo.example darf sich
über eine unerwartete Mail freuen. Jetzt noch etwas Werbung in das
Nachrichtenfeld, und die Spam-Kampagne kann starten. Evtl. eingeleitete
Gegenmaßnahmen treffen zuerst den Betreiber der Website mit dem
Kontaktformular, der dann unter Umständen über seinen Mailserver
keine Mails mehr versenden kann, weil keiner mehr mit ihm sprechen mag. In
diesem Fall ist die Verhinderung des Angriffs sehr einfach, da der Aufbau
einer E-Mail-Adresse festgelegt ist und anhand eines regulären
Ausdrucks überprüft werden kann. Alle Eingaben, die nicht genau
einer E-Mail-Adresse entsprechen, werden verworfen.
Welche weiteren Angriffe möglich sind und wie man diese Schwachstellen findet, erfahren Sie in der nächsten Folge.
Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!