Bundesamt für Sicherheit in der Informationstechnik

G 5.170 Cross-Site Scripting (XSS)

Cross-Site Scripting-Angriffe (XSS-Angriffe) richten sich gegen die Benutzer einer Webanwendung und deren Clients. Hierbei versucht ein Angreifer indirekt Schadcode (in der Regel Browser-seitig ausführbare Skripte, wie z. B. JavaScript) an den Client des Benutzers der Webanwendung zu senden.

Werden die Ein- und Ausgaben von einer Webanwendung nicht ausreichend validiert, so kann ein Angreifer schadhaften Code in die Webanwendung einschleusen (z. B. innerhalb eines Kommentars zu einem Artikel) und so verteilen. Wird eine infizierte Webseite von einem Benutzer aufgerufen, führt der Client (z. B. Browser) den eingefügten Schadcode aus. Aus Sicht des Benutzers stammt der schadhafte Code von der Webanwendung und wird somit als vertrauenswürdig eingestuft. Daher wird der Schadcode im Sicherheitskontext der Webanwendung interpretiert und es ist dem Angreifer möglich, Befehle im Kontext einer möglicherweise bestehenden Sitzung des betroffenen Benutzers auszuführen.

Es werden drei Klassen von XSS-Angriffen unterschieden:

  • persistent (beständig)
  • reflektiert (nicht-persistent)
  • DOM-basiert (lokal)

Die folgenden Beispiele verdeutlichen die Unterschiede der Angriffsklassen:

  • Einem Angreifer gelingt es einen Eintrag in einem Gästebuch zu hinterlassen, der JavaScript-Code enthält. Ruft ein Benutzer den entsprechenden Gästebucheintrag auf, wird das Skript übermittelt und vom Browser ausgeführt. Das Skript wird im Sicherheitskontext der Webanwendung ausgeführt und hat somit Zugriff auf die clientseitig im Cookie gespeicherte SessionID des Benutzers, wenn dieses Session-Cookie (fehlerhaft) ohne HttpOnly-Flag gesetzt wurde. Diese Information wird von dem Skript an den Angreifer weitergeleitet, der die SessionID nutzen und damit die Sitzung eines authentisierten Benutzers übernehmen kann. Da der JavaScript-Code vom Browser lediglich interpretiert und nicht angezeigt wird, kann dieser Vorgang von dem Benutzer nur schwer erkannt werden. Hierbei handelt es sich um einen persistenten XSS-Angriff, da der Schadcode in dem Gästebuch-Eintrag und somit in der Webanwendung dauerhaft gespeichert wird.
  • Ein Angreifer präpariert den GET-Parameter einer URL so, dass dieser JavaScript-Code enthält. Da die Webanwendung den verwendeten Parameter ungeprüft für die Aufbereitung der Webseite verwendet, wird der eingeschleuste JavaScript-Code an den Client übermittelt und vom Browser im Sicherheitskontext der Webanwendung ausgeführt. Gelingt es dem Angreifer, einen derart präparierten Link so zu verteilen (z. B. per E-Mail) und klickt ein angemeldeter Benutzer diesen Link an, so wird das schadhafte Skript im Browser des Benutzers ausgeführt. Ein solcher XSS-Angriff wird als reflektiert oder nicht-persistent bezeichnet, da der Schadcode nicht dauerhaft gespeichert wird, sondern nach der Eingabe direkt von der Webanwendung zurückgesendet wird.
  • JavaScript-Code in einer Webseite verarbeitet Parameter aus der URL (z. B. http://host.tld/param="Inhalt") und bindet sie zur Anzeige in die Webseite ein. Über die Manipulation der Parameter können somit beliebige Inhalte in die Webseite eingefügt werden. Wird die Seite mit schadhaftem JavaScript-Code im Parameter aufgerufen, so wird dieser Code in die Webseite eingebunden und vom Browser ausgeführt. Im Gegensatz zu vorherigen Angriffstypen wird der Schadcode nicht von der Webanwendung in die Webseite eingefügt, sondern erst lokal vom Browser durch die clientseitige JavaScript-Verarbeitung der URL-Parameter. Hierbei kann der Schadcode die Document Object Model (DOM)-Umgebung manipulieren und darüber die Webseitenstruktur und Inhalte verändern.

Stand: 13. EL Stand 2013