PenetrationstestJan Kahmen9 min Lesezeit

XSS - Überblick, Definition und Fallbeispiele

XSS-Schwachstellen werden bei Penetrationstests in Single-Page-Web-Anwendungen gefunden, da dort viel Business Logik durch JavaScript im Front End existiert.

Was ist Cross Site Scripting?

Cross Site Scripting (XSS) ist eine Art clientseitiger Injektionsangriff, bei dem ein schädliches Skript in eine legitime Website eingeschleust und dort ausgeführt wird. Der Angriff beginnt, sobald ein Benutzer die kompromittierte Website aufruft. Dieser Blogpost liefert eine XSS-Definition und zeigt auf, warum eine XSS-Schwachstelle ein hohes Risiko für jede IT-Organisation darstellt -- wie auch die OWASP Top Ten und das Common Vulnerability Scoring System (CVSS) bestätigen.

Intention vom Penetration Tester

XSS-Schwachstellen werden im Rahmen von Penetrationstests zunehmend in Single-Page-Webanwendungen (SPA) aufgedeckt, da dort ein Großteil der Geschäftslogik als JavaScript (JS) ins Front End verlagert wird. XSS-Schwachstellen zählen heute zu den am weitesten verbreiteten Sicherheitslücken mit hohem Risiko in Webanwendungen -- wie unsere Pentester immer wieder feststellen. Selbst in API-Aufrufen treten diese Angriffsvektoren vermehrt auf. Uns ist es wichtig, dass alle IT-Stakeholder verstehen, dass diese Art von Schwachstelle zurecht als hochkritisch eingestuft wird und keinesfalls vernachlässigt werden sollte. Entsprechend ist diese Schwachstelle auch im OWASP Testing Guide mit einem eigenen Testfall beschrieben.

Arten von Cross Site Scripting

Reflektiertes Cross Site Scripting

Reflektierte XSS-Angriffe, auch als nicht-persistente Angriffe bekannt, treten auf, wenn ein schädliches Skript von einer Webanwendung in den Browser des Opfers eingeschleust wird. Das Skript wird über einen präparierten Link aktiviert, der eine Anfrage an eine Website mit einer XSS-Schwachstelle sendet und so die Ausführung von Schadcode ermöglicht. Über diesen Payload lässt sich beliebiger JavaScript-Code ausführen.

Persistentes oder Stored Cross Site Scripting

Persistentes XSS, auch als Stored XSS bekannt, ist die gefährlichere Variante. Dabei wird ein schädliches Skript direkt in einer anfälligen Webanwendung gespeichert. Der Schadcode wird bei jedem Seitenaufruf durch das Opfer automatisch ausgeführt -- ganz ohne Benutzerinteraktion.

Lokales Cross Site Scripting (DOM-basiert)

DOM-basiertes XSS bedeutet, dass die Cross-Site-Scripting-Schwachstelle direkt im DOM (Document Object Model) ausgenutzt wird und nicht als Teil des HTML-Codes erscheint. Bei reflektierten und gespeicherten XSS-Angriffen ist die Payload in der Serverantwort sichtbar. Bei DOM-basiertem XSS hingegen sind HTML-Quellcode und Serverantwort identisch -- die Payload lässt sich nicht in der Antwort des Servers finden. Sie kann nur zur Laufzeit oder durch Untersuchung des DOM der Seite beobachtet werden. Im Gegensatz zu den oben genannten XSS-Varianten ist die Webapplikation auf dem Server bei dieser Angriffsform gar nicht beteiligt.

Fallbeispiele mit einem XSS-Angriffsvektor

Anhand dieser Schwachstellen lassen sich die folgenden praktischen Angriffsszenarien umsetzen, die das tatsächliche Risiko von Cross-Site-Scripting-Schwachstellen verdeutlichen. Diese Angriffsvektoren stellen kein vertretbares Geschäftsrisiko dar und müssen nach der Entdeckung im Rahmen eines XSS-Pentests umgehend behoben werden.

Mithilfe von schädlichem JavaScript im Browser des Opfers lassen sich unter anderem folgende Angriffe realisieren:

  • Session Hijacking -- Über JavaScript kann auf HTTP-Cookies zugegriffen werden, wodurch sich komplette Sessions übernehmen und Daten manipulieren lassen.
  • Ad-Jacking -- Ohne Einwilligung des Nutzers wird die Werbung des Angreifers eingeblendet, um Einnahmen zu erzielen.
  • Clickjacking -- Durch eine versteckte Überlagerung auf einer Seite können Klicks des Opfers für bösartige Aktionen wie etwa Bestellungen auf weiteren Domains missbraucht werden.
  • Content Spoofing -- JavaScript hat vollen Zugriff auf den clientseitigen Code einer Website und kann daher beliebige Inhalte anzeigen oder verändern.
  • Credential Harvesting -- Über ein Popup lassen sich Anmeldedaten für bestimmte Dienste abgreifen.
  • Forced Downloads -- Von einer vermeintlich vertrauenswürdigen Website lässt sich leichter ein Download von Schadsoftware erzwingen.
  • Crypto Mining -- Die CPU des Opfers kann missbraucht werden, um Rechenleistung für Kryptomining bereitzustellen.
  • CSRF Protection umgehen -- Cross-Site-Request-Forgery-Token (CSRF) können per JavaScript ausgelesen werden, um gefälschte POST-Anfragen zu senden.
  • Keylogger -- Tastatureingaben der jeweiligen Browserinstanz können mitgeschnitten werden.
  • Audio und Webcam aufnehmen -- Nach einer Autorisierung durch den Benutzer kann auf Mikrofon und Webcam des Opfers zugegriffen werden -- realisierbar mit HTML5 und JavaScript.
  • Geo-Standort abrufen -- Nach Autorisierung durch den Benutzer lässt sich der Geo-Standort des Opfers ermitteln. Dies funktioniert nur bei aktiviertem GPS.
  • Data Exfiltration von HTML5-Webspeicher -- HTML5 bietet mit dem Web Storage die Möglichkeit, Daten im Browser zu speichern. JavaScript kann auf diesen Speicher zugreifen und die Daten exfiltrieren.
  • Fingerprinting -- Per JavaScript lassen sich Browsername, Version, installierte Plugins, Betriebssystem, Architektur, Systemzeit, Sprache und Bildschirmauflösung mühelos auslesen.
  • Network Scanning -- Der Browser des Opfers kann per JavaScript zum Scannen von Ports und Hosts missbraucht werden.
  • Denial of Service (DoS) -- Der Browser des Opfers kann unwissentlich an einem DDoS-Angriff auf ein weiteres Ziel teilnehmen.
  • Browser-Absturz erzwingen -- Der infizierte Browser kann gezielt zum Absturz gebracht werden.
  • Weiterleitung -- Eine Umleitung auf eine beliebige Website kann erzwungen werden.
  • Tabnabbing -- Eine raffinierte Variante der Weiterleitung: Werden beispielsweise länger als eine Minute keine Tastatur- oder Mausereignisse registriert, kann die aktuelle Webseite unbemerkt durch eine gefälschte Seite ersetzt werden.
  • Capturing Screenshots -- Dank HTML5 lassen sich Screenshots einer Webseite erstellen und anschließend an den Angreifer übermitteln.

XSS Penetration Testing Showcase mit BeEF

BeEF (The Browser Exploitation Framework) ist ein Werkzeug für Penetrationstests, das sich auf die Ausführung von Schadcode im Webbrowser konzentriert -- die XSS-Erkennung selbst gehört jedoch nicht zu seinem Funktionsumfang.

Angesichts der zunehmenden Bedrohung durch webbasierte Angriffe auf Clients -- einschließlich mobiler Endgeräte -- ermöglicht BeEF dem professionellen Pentester, die tatsächliche Sicherheitslage einer Zielumgebung anhand clientseitiger Angriffsvektoren zu bewerten. Im Gegensatz zu anderen Frameworks blickt BeEF über den gehärteten Netzwerkperimeter und das Client-System hinaus und untersucht die Ausnutzbarkeit im Kontext des Webbrowsers. BeEF verbindet einen oder mehrere Browser und nutzt sie als Brückenkopf, um gezielte Befehlsmodule und weiterführende Angriffe auf das System zu starten. Neben klassischen Pentests kommt dieses Tool auch beim Red Teaming zum Einsatz, insbesondere für das Lateral Movement.

Im Folgenden wird das Tool im Rahmen einer Angriffssimulation vorgestellt:

Kontrolle über Webbrowser mit BeEF übernehmen [Tutorial]

Fazit für XSS-Angriffe

Schwachstellen dieser Art stellen kein akzeptables Risiko dar, sind nicht mit einem vertretbaren Geschäftsrisiko vereinbar und sollten nach dem Pentest-Ergebnis umgehend behoben werden. Durch regelmäßige Penetrationstests lässt sich eine konsequente IT-Sicherheit für Webdienste gewährleisten, denn XSS-Angriffe gehören zum Standardrepertoire jedes Cyberkriminellen. Sensible Daten wie Browser-Sessions können erbeutet werden, und komplexe Social-Engineering-Angriffe können hier ihren Ausgangspunkt finden, um weiterführende Angriffe auf die tieferliegende IT-Infrastruktur einzuleiten. Jeder Eingabeparameter muss gründlich validiert werden, um ein hohes und vertretbares Sicherheitsniveau für Webanwendungen zu erreichen.

Unsere Services