Definition
Cross-Site Scripting (XSS) bezeichnet eine Sicherheitslücke in Webanwendungen, bei der Angreifer schädlichen Code, meist in Form von JavaScript, in Webseiten einschleusen. Dieser Code wird dann im Browser anderer Nutzer ausgeführt, ohne dass diese es bemerken. Ziel ist es, vertrauliche Informationen zu stehlen, Sitzungen zu kapern oder unerwünschte Aktionen im Namen des Nutzers durchzuführen.
XSS ist eine der häufigsten Schwachstellen im Bereich der Websicherheit und wird von Organisationen wie OWASP (Open Web Application Security Project) regelmäßig in ihrer Top-10-Liste der häufigsten Sicherheitslücken aufgeführt. Die Angriffe nutzen die mangelnde Validierung oder Filterung von Eingaben in Webanwendungen aus.
Was bedeutet das für Ihr Unternehmen?
Über eine XSS-Lücke kann ein Angreifer Code in Ihre Website einschleusen, der bei Ihren Kunden ausgeführt wird, etwa um Logins abzugreifen oder gefälschte Formulare einzublenden. Gefährdet sind vor allem Stellen, an denen Nutzer Inhalte eingeben, die andere später sehen, wie Kommentare, Profile, Bewertungen oder Supportanfragen. Moderne Frameworks schützen standardmäßig dagegen, Lücken entstehen meist dort, wo Entwickler diesen Schutz bewusst umgehen oder alte Plugins im Einsatz sind.
Hintergrund und Entstehung
Die Problematik von XSS wurde in den späten 1990er Jahren erkannt, als dynamische Webseiten mit clientseitigem JavaScript immer populärer wurden. Mit der zunehmenden Nutzung von Skripten im Browser eröffnete sich für Angreifer die Möglichkeit, schädlichen Code einzuschleusen und auszuführen.
Die Standardisierung von Webtechnologien wie HTML und JavaScript trug dazu bei, dass Angriffe über XSS weit verbreitet wurden, da viele Webanwendungen keine ausreichenden Schutzmechanismen implementierten. Die Vielfalt der Angriffsmöglichkeiten führte zur Entwicklung verschiedener XSS-Typen.
Arten von XSS
Es werden hauptsächlich drei Typen von XSS unterschieden: Stored XSS, Reflected XSS und DOM-based XSS. Stored XSS tritt auf, wenn der schädliche Code dauerhaft auf dem Server gespeichert wird, etwa in einer Datenbank, und bei jedem Aufruf der Seite an Nutzer ausgeliefert wird.
Reflected XSS hingegen entsteht, wenn der schädliche Code nur in der URL oder in einer Anfrage enthalten ist und unmittelbar an den Nutzer zurückgesendet wird. DOM-based XSS basiert auf Manipulationen des Document Object Model (DOM) im Browser, ohne dass der Server den schädlichen Code direkt verarbeitet.
Funktionsweise von XSS-Angriffen
Bei einem XSS-Angriff wird schädlicher Code in Eingabefelder, URL-Parameter oder andere Eingabepunkte einer Webanwendung eingeschleust. Wenn die Anwendung diese Eingaben nicht korrekt bereinigt oder filtert, wird der Code in die Webseite eingebettet und im Browser anderer Nutzer ausgeführt.
Die ausgeführten Skripte können beispielsweise Cookies auslesen, die Sitzungsinformationen enthalten, oder Nutzer auf gefälschte Seiten weiterleiten. Dadurch können Angreifer Identitätsdiebstahl, Phishing oder andere schädliche Aktionen durchführen.
Einsatzgebiete und Auswirkungen
XSS-Angriffe werden häufig eingesetzt, um Zugangsdaten zu stehlen, Benutzerkonten zu übernehmen oder Schadsoftware zu verbreiten. Besonders betroffen sind soziale Netzwerke, Foren, Webmail-Dienste und alle Anwendungen, die Benutzereingaben verarbeiten und anzeigen.
Die Folgen von erfolgreichen XSS-Angriffen reichen von Datenschutzverletzungen über finanzielle Schäden bis hin zu Reputationsverlust für betroffene Unternehmen. Die Angriffe können auch als Einstiegspunkt für weitergehende Kompromittierungen dienen.
Abgrenzung zu anderen Sicherheitslücken
XSS unterscheidet sich von SQL-Injection, einer weiteren häufigen Web-Sicherheitslücke, die sich auf die Manipulation von Datenbankabfragen konzentriert. Während SQL-Injection auf der Serverseite wirkt, findet XSS hauptsächlich auf der Clientseite im Browser statt.
Ein verwandter Begriff ist Cross-Site Request Forgery (CSRF), bei dem Angreifer Nutzer dazu bringen, unbeabsichtigte Aktionen auf einer Webseite auszuführen. Im Gegensatz zu XSS wird bei CSRF kein eigener Code eingeschleust, sondern bestehende Funktionen missbraucht.