Donnerstag, 26. April 2012


Topthema

Donnerstag, 12. Februar 2009 | Topthema

About Security #192: Schwachstellen-Suche: SMTP-Header-Injection

(Link zum Artikel: http://www.entwickler.de/entwicklerde/kolumnen/047326)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

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.

Kurze Einführung in SMTP

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>
To: <irgendwer@irgendwo.example>
Subject: Testmail
Date: Thu, 12 Feb 2009 12:34:56 +0200

Text der Mail
.
-->
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.

Ein Kontaktformular und E-Mail-Header-Manipulationen

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:

E-Mail-Adresse des Absenders:
Betreff:
Nachricht:
[Absenden]

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:

E-Mail-Adresse des Absenders:
Betreff:
Nachricht:
[Absenden]

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!

Carsten Eilers

Kommentare

Folgende Links könnten Sie auch interessieren