Header-Injection ist eine Klasse von Sicherheitslücken in Webanwendungen, welche auftreten, wenn die Header eines Protokolls dynamisch unter Hinzunahme von unzureichend geprüften Benutzereingaben generiert werden.

Header-Injection in HTTP kann z. B. zu HTTP-Response-Splitting und Cross-Site Scripting führen. Bei der dynamischen Erstellung von E-Mails über eine Webanwendung kann ein Header-Injection-Angriff genutzt werden, um andere Empfänger in eine E-Mail einzutragen und so z. B. Spam zu versenden (E-Mail-Injektion).

Beispiel

Bearbeiten

Eine Website hat ein Formular mit den Eingabefeldern für Betreff und Nachricht, über das Besucher dem Betreiber schreiben können. Ein serverseitiges Skript baut aus den übermittelten Daten dann die E-Mail-Nachricht zusammen und sendet diese an eine vordefinierte Adresse. Die resultierende E-Mail-Nachricht sieht dann z. B. so aus:

Subject: Betreff
From: besucher@some.example.com
To: webmaster@some.example.com
Nachricht

Wenn nun ein Angreifer in das Eingabefeld des Formulars für den Betreff die Zeichenfolge Carriage Return und Linefeed sowie BCC: user1@another.example.com, user2@another.example.com, … eingibt und das Skript diese Eingaben ungeprüft in die E-Mail-Nachricht übernimmt:

Subject: Spam
BCC: user1@another.example.com, user2@another.example.com, …
From: besucher@some.example.com
To: webmaster@some.example.com
Spam

So wird die E-Mail ebenfalls als Blindkopie an User1, User2, … versendet.

Da einen Spammer die Antwort des Servers auf das Abschicken des E-Mail-Formulars nicht interessiert, kann er sich hinter IP-Spoofing verstecken. Der Administrator des Servers sieht dann in seinem Logfile, dass jede Spam-Mail von einer anderen IP-Adresse verschickt wurde. Der Spammer bleibt so völlig anonym.

Da der Webmaster auch eine Kopie des Spams erhält, wird er diese Sicherheitslücke aber baldmöglichst schließen.

Gegenmaßnahmen

Bearbeiten

Zum Verhindern einer Header-Injection müssen Benutzereingaben sorgfältig geprüft werden, vor allem auf die je nach Kontext geltenden Metazeichen.

So werden in der Regel die einzelnen Header-Felder durch die Zeilenumbruchsequenz CRLF getrennt. Deshalb gilt es, diese in Benutzereingaben herauszufiltern beziehungsweise zu maskieren. Beim HTTP und SMTP wird zum Maskieren z. B. die URL-Kodierung eingesetzt, beim SMTP zusätzlich noch die Quoted-Printable-Kodierung.

In der weit verbreiteten Skriptsprache PHP wird seit den Versionen 4.4.2 bzw. 5.1.2 eine Injektion über die header-Funktion automatisch verhindert, indem nur ein HTTP-Header pro Funktionsaufruf zulässig ist.[1] Bei der mail-Funktion hingegen muss dies jedoch noch manuell gesichert werden.[2]

Einzelnachweise

Bearbeiten
  1. Referenzseite der header()-Funktion des PHP-Handbuchs
  2. Referenzseite der mail()-Funktion des PHP-Handbuchs
Bearbeiten