XSS-Sicherheitslücke – was ist das? Beispiele für XSS-Schwachstellen. Einfacher Hack: So extrahieren Sie Daten über Cross Site Scripting Inclusion Xss warning noscript
Die Verwendung von Sicherheitsheadern ist ein wichtiger Bestandteil beim Schutz einer Website und ihrer Besucher vor Hackerangriffen. Im letzten Artikel zum Bereich Schutz und Sicherheit habe ich versprochen, regelmäßig Beiträge zu diesem Thema zu veröffentlichen. Heute werde ich über den Schutz vor XSS-Angriffen sprechen.
Was ist ein XSS-Angriff?Cross Site Scripting ist eine Schwachstelle, die es einem Angreifer ermöglicht, schädlichen Code (normalerweise HTML oder JavaScript) in den Inhalt einer Website einzuschleusen. Schadcode wird im Browser des Benutzers ausgeführt, der die infizierte Website-Seite aufruft.
Angreifer können verschiedene Schwachstellen ausnutzen. Die häufigsten Angriffsarten sind:
- Reflected XSS ist der häufigste nicht-persistente Angriffstyp, der eine bestimmte Aktion des Benutzers erfordert.
- Persistentes XSS ist ein dauerhafter Angriffstyp, der Schadcode in den Server einschleust und kein Eingreifen des Benutzers erfordert.
Wird ausgelöst, wenn ein Benutzer einem speziell vorbereiteten Link folgt, der eine Anfrage an eine Website mit einer Schwachstelle sendet. Diese Schwachstelle ist typischerweise das Ergebnis einer unzureichenden Filterung eingehender Anfragen, wodurch Funktionen manipuliert und schädliche Skripte aktiviert werden können.
Um einen gespeicherten Angriff erfolgreich durchzuführen, muss ein Angreifer lediglich eine Schwachstelle auf der Website finden und ein bösartiges Skript auf seinem Server platzieren. Anschließend platziert die Site einen Tag, der das Skript von einer externen Site lädt, beispielsweise in Kommentaren. Beim Laden einer infizierten Seite wird jedes Mal ein Schadskript an den Browser des Benutzers übertragen.
Der X-XSS-Protection-Header soll den in allen modernen Browsern integrierten Cross-Site-Scripting-Filter aktivieren. Dadurch kann beispielsweise die Ausführung eines Tags in der Seiten-URL verhindert werden.
Die Report-Anweisung zum Senden von Berichten verhält sich ähnlich wie die Content Security Policy (CSP)-Anweisung „report-uri“ (oder „report-to“) und weist den Browser des Benutzers an, Versuche zur Verletzung der Inhaltssicherheitsrichtlinie zu melden. Darüber werde ich in einem separaten Artikel sprechen.
Der Verstoßbericht wird im JSON-Format generiert und über POST-Anfragen an die angegebene URL gesendet.
Zurück zum Hauptthema: Ich empfehle, den Server so einzurichten, dass der HTTP-Header eine Filterung beinhaltet und im Falle eines XSS-Angriffs das Laden einer Seite mit unsicherem Inhalt blockiert. In der zusätzlichen Konfigurationsdatei.htaccess (oder httpd.conf, wenn Sie vollen Zugriff auf den Server haben) des Apache-Webservers müssen Sie den folgenden Eintrag hinzufügen:
Header-Set X-XSS-Protection „1; mode=block“Fügen Sie für den Nginx-Server den folgenden Eintrag zur Datei nginx.conf im HTTP-Abschnitt hinzu:
Add_header X-XSS-Protection "1; mode=block" ;
Für den Fall, dass kein Zugriff auf die Serverkonfigurationsdateien, aber PHP-Unterstützung vorhanden ist, nutzen Sie die Funktion:
Cross Site Scripting, auch als XSS bekannt, ist eine Methode zum Einschleusen von Schadcode, der auf der Clientseite ausgeführt wird. Dem Nutzer kann es passieren, dass etwas nicht stimmt, zum Beispiel ein ungewöhnliches Verhalten der Seite, manchmal läuft der Angriff völlig unbemerkt im Hintergrund ab.
Hoffentlich verstehen Sie jetzt etwas mehr über HTTP-Server-Header und X-XSS kann dabei helfen, Cross-Site-Scripting zu verhindern. Ich verwende auf allen meinen Websites Sicherheitsheader und empfehle Ihnen dringend, dasselbe zu tun. Gemeinsam können wir das Internet sicherer machen! 😉
Beim Cross-Site-Scripting oder Cross-Site-Scripting oder XSS handelt es sich um eine Website, die unbeabsichtigten Javascript-Code enthält, der wiederum an Benutzer übertragen wird, die den Code in ihren Browsern ausführen. Ein harmloses Beispiel für XSS (das genau das ist, was Sie verwenden sollten!) sieht so aus:
alarm('XSS');
Dadurch wird die Javascript-Benachrichtigungsfunktion aufgerufen und ein einfaches (und harmloses) Feld mit den Buchstaben XSS erstellt. In früheren Versionen des Buches habe ich empfohlen, dieses Beispiel beim Schreiben von Berichten zu verwenden. Bis mir ein äußerst erfolgreicher Hacker erzählte, dass es sich um ein „schreckliches Beispiel“ handele, und erklärte, dass der Empfänger eines Schwachstellenberichts die Schwere des Problems möglicherweise nicht erkennen und eine kleine Belohnung auszahlen würde, weil das Beispiel harmlos sei.
Verwenden Sie also dieses Beispiel, um eine XSS-Schwachstelle zu erkennen, aber denken Sie beim Verfassen des Berichts über den potenziellen Schaden nach, den die Schwachstelle verursachen könnte, und erläutern Sie ihn. Damit meine ich nicht, dem Unternehmen zu sagen, was XSS ist, sondern vielmehr zu erklären, was Sie durch die Ausnutzung der Sicherheitslücke erreichen können und wie sich dies konkret auf ihre Website auswirken könnte.
Es gibt drei verschiedene Arten von XSS, von denen Sie bei der Recherche und Berichterstattung möglicherweise hören:
- Reflektierendes XSS: Diese Angriffe werden nicht auf der Website gespeichert, was bedeutet, dass das XSS in einer einzigen Anfrage und Antwort generiert und ausgeführt wird.
- Gespeichertes XSS: Diese Angriffe werden auf der Website gespeichert und sind oft gefährlicher. Sie werden auf dem Server gespeichert und von ahnungslosen Benutzern auf „normalen“ Seiten ausgeführt.
- Self-XSS: Diese Angriffe werden auch nicht auf der Website gespeichert und werden normalerweise verwendet, um eine Person dazu zu verleiten, XSS selbst auszuführen. Wenn Sie nach Schwachstellen suchen, werden Sie feststellen, dass Unternehmen sich oft nicht um die Beseitigung von Self-XSS kümmern, sondern nur darum kümmern sich um Fälle, in denen den Benutzern Schaden durch andere als sie selbst zugefügt werden kann, wie es bei „Reflective“ und „Stored XSS“ der Fall ist. Dies bedeutet jedoch nicht, dass Sie nicht nach Self XSS suchen sollten.
Wenn Sie auf eine Situation stoßen, in der Self XSS ausgeführt, aber nicht gespeichert werden kann, denken Sie darüber nach, wie diese Schwachstelle ausgenutzt werden könnte. Können Sie sie in Kombination mit etwas verwenden, sodass es nicht länger Self XSS ist?
Eines der bekanntesten Beispiele für die Verwendung von XSS ist MySpace Samy Work von Samy Kamkar. Im Oktober 2005 nutzte Sami eine gespeicherte XSS-Schwachstelle in MySpace aus, die es ihm ermöglichte, Javascript-Code hochzuladen, der jedes Mal ausgeführt wurde, wenn jemand seine MySpace-Seite besuchte, und den Seitenbesucher als Freund von Samis Profil hinzuzufügen. Darüber hinaus kopierte sich der Code auch auf die Seiten von Samys neuen Freunden, sodass die Profile seiner neuen Freunde mit dem folgenden Text aktualisiert wurden: „Aber vor allem ist Samy mein Held.“
Obwohl Samis Beispiel relativ harmlos war, ermöglicht die Verwendung von XSS den Diebstahl von Anmeldedaten, Passwörtern, Bankinformationen usw. Trotz des potenziellen Schadens ist das Beheben von XSS-Schwachstellen im Allgemeinen nicht schwierig und erfordert, dass Entwickler beim Rendern Benutzereingaben einfach umgehen (genau wie bei der HTML-Injection). Allerdings entfernen einige Websites auch potenziell bösartige Zeichen, wenn der Hacker sie sendet.
1. Shopify-VerkaufSchwierigkeit: Niedrig
URL: wholesale.shopify.com
Link zum Bericht: https://hackerone.com/reports/10629326 Berichtsdatum: 21. Dezember 2015
Gezahlte Belohnung: 500 $
Beschreibung:
Die Shopify27-Verkaufsseite ist eine einfache Seite mit einem direkten Call-to-Action – geben Sie den Namen des Produkts ein und klicken Sie auf „Produkte suchen“. Hier ist ein Screenshot:
Screenshot der Großhandelsverkaufsseite
Die XSS-Schwachstelle hier war die einfachste, die Sie finden können – der in die Suchleiste eingegebene Text wurde nicht maskiert, sodass jedes eingegebene Javascript ausgeführt wurde. Hier ist der gesendete Text aus der Schwachstellenbeschreibung: test’;alert(‘XSS’);’
Der Grund dafür, dass dies funktionierte, liegt darin, dass Shopify Benutzereingaben entgegennahm, die Suchabfrage ausführte und, wenn es keine Ergebnisse gab, eine Meldung ausgab, dass es keine Suchergebnisse für den eingegebenen Suchbegriff gab, und die nicht maskierte Benutzereingabe auf der Seite anzeigte. Infolgedessen wurde das übermittelte Javascript auf der Seite gerendert und von Browsern als ausführbares Javascript interpretiert.
SchlussfolgerungenTesten Sie alles und achten Sie dabei besonders auf Situationen, in denen der eingegebene Text auf der Seite wiedergegeben wird. Testen Sie, ob Sie HTML oder Javascript in Ihre Eingaben einbinden können, und sehen Sie, wie die Website diese verarbeitet. Versuchen Sie auch, die Eingabe ähnlich zu kodieren, wie im Kapitel über HTML-Injektionen beschrieben.
XSS-Schwachstellen müssen nicht komplex oder verwirrend sein. Diese Sicherheitslücke war die einfachste, die man sich vorstellen kann – ein einfaches Texteingabefeld, das keine Benutzereingaben verarbeitet. Und es wurde am 21. Dezember 2015 entdeckt und brachte dem Hacker 500 Dollar ein! Alles, was es brauchte, war Hacker-Denken.
2. Shopify-GeschenkkartenwagenSchwierigkeit: Niedrig
URL: hardware.shopify.com/cart
Link zum Bericht: https://hackerone.com/reports/9508928 Berichtsdatum: 21. Oktober 2015
Gezahlte Belohnung: 500 $
Beschreibung:
Auf der Website des Shopify29-Geschenkkartenshops können Benutzer ihre eigenen Geschenkkartendesigns mithilfe eines HTML-Formulars erstellen, das ein Feld zum Hochladen von Dateien, einige Zeilen zur Texteingabe für Details usw. enthält. Hier ist ein Screenshot:
Screenshot des Formulars für den Shopify-Geschenkkartenshop
Die XSS-Schwachstelle wurde hier ausgelöst, als Javascript in das für den Bildtitel vorgesehene Formularfeld eingegeben wurde. Das geht ganz einfach mit HTML-Proxys, worüber wir später im Kapitel „Tools“ sprechen werden. Die ursprüngliche Formulareinreichung enthielt also Folgendes:
Inhalt – Disposition: Formulardaten; name = „Eigenschaften [Artwor 2k-Datei]“ |
Es könnte abgefangen und geändert werden in:
Inhalt – Disposition: Formulardaten; name = ”properties [ Artwor 2 k-Datei< img src = ’test ’onmouseover = ’alert (2 ) ’> ] ”; |
Hier sind zwei Dinge zu beachten, die Ihnen beim Erkennen von XSS-Schwachstellen helfen.
Unter Cross-Site-Scripting (XSS) versteht man einen clientseitigen Code-Injection-Angriff, bei dem ein Angreifer bösartige Skripte auf einer Website oder Webanwendung ausführen kann. XSS ist eine der häufigsten Sicherheitslücken in Webanwendungen und tritt auf, wenn eine Webanwendung keine Eingabe-/Ausgabevalidierung oder -kodierung verwendet.
Durch die Verwendung von XSS nimmt der Angreifer das Opfer nicht direkt ins Visier. Stattdessen wird eine Schwachstelle in einer Website oder Webanwendung ausgenutzt, die das Opfer besucht, und dabei die anfällige Website im Wesentlichen als Vehikel genutzt, um ein bösartiges Skript an den Browser des Opfers zu übermitteln.
Während XSS in VBScript, ActiveX und Flash verwendet werden kann (wobei Letzteres mittlerweile als veraltet gilt), wird es in JavaScript zweifellos am häufigsten missbraucht – vor allem, weil JavaScript für die meisten Websites von grundlegender Bedeutung ist.
So funktioniert Cross-Site-Scripting
Um bösartigen JavaScript-Code im Browser eines Opfers auszuführen, muss der Angreifer zunächst einen Weg finden, Nutzdaten in die Webseite einzuschleusen, die das Opfer besucht. Natürlich könnte ein Angreifer Social-Engineering-Techniken nutzen, um einen Benutzer mit einer injizierten JavaScript-Nutzlast zum Besuch einer anfälligen Seite zu verleiten.
Damit ein XSS-Angriff stattfinden kann, muss die anfällige Website Benutzereingaben direkt auf ihren Seiten einbinden. Der Angreifer kann dann eine Zeichenfolge einfügen, die auf der Webseite verwendet und vom Browser des Opfers als Code verarbeitet wird.
Der folgende serverseitige Pseudocode wird verwendet, um den neuesten Kommentar auf einer Webseite anzuzeigen.
Print "" print "Neuester Kommentar" print Database.latestComment print "" Das obige Skript druckt einfach den neuesten Kommentar aus der Kommentardatenbank und druckt den Inhalt auf der HTML-Seite, vorausgesetzt, der gedruckte Kommentar besteht nur aus Text.
Der obige Seitencode ist anfällig für xss, da ein Angreifer einen Kommentar hinterlassen kann, der bösartige Nutzdaten enthält, z. B.
doSomethingEvil();. Benutzer, die die Webseite besuchen, erhalten die folgende HTML-Seite.
Neuester Kommentar doSomethingEvil(); Wenn die Seite im Browser des Opfers geladen wird, wird das bösartige Skript des Angreifers ausgeführt, meist ohne dass der Benutzer sich dessen bewusst ist oder einen solchen Angriff verhindern kann.
Wichtiger Hinweis: Die Sicherheitslücke -xss kann nur bestehen, wenn die Nutzlast (bösartiges Skript), die der Angreifer einfügt, letztendlich (in diesem Fall als HTML) im Browser des Opfers gerendert wird
Was kann ein Angreifer mit JavaScript tun?
Die Konsequenzen dessen, was ein Angreifer mit der Möglichkeit, JavaScript auf einer Webseite auszuführen, anstellen kann, sind möglicherweise nicht sofort ersichtlich, insbesondere da Browser JavaScript in einer sehr streng kontrollierten Umgebung ausführen und JavaScript nur begrenzten Zugriff auf das Betriebssystem und die Dateien des Benutzers hat .
Da JavaScript jedoch Zugriff auf Folgendes hat, ist es einfacher zu verstehen, was kreative Angreifer mit JavaScript erreichen können.
Schädliches JavaScript hat Zugriff auf dieselben Objekte wie der Rest der Webseite, einschließlich Zugriff auf Cookies. Cookies werden häufig zum Speichern von Sitzungstokens verwendet. Wenn ein Angreifer das Sitzungscookie eines Benutzers erhalten kann, kann er sich als dieser Benutzer ausgeben.
JavaScript kann XMLHttpRequest verwenden, um HTTP-Anfragen mit beliebigem Inhalt in beliebige Richtungen zu senden.
JavaScript in modernen Browsern kann HTML5-APIs verwenden, um beispielsweise auf die Geolokalisierung, Webcam, das Mikrofon des Benutzers und sogar auf bestimmte Dateien aus dem Dateisystem des Benutzers zuzugreifen. Während die meisten dieser APIs eine Benutzerinteraktion erfordern, kann XSS in Kombination mit cleverem Social Engineering für einen Angreifer ziemlich gute Ergebnisse liefern.
Im Allgemeinen ermöglichen diese Methoden in Kombination mit Social Engineering Angreifern die Organisation von Angriffen wie Cookie-Diebstahl, Keylogging, Phishing und Identitätsdiebstahl. Entscheidend ist, dass XSS-Schwachstellen den perfekten Nährboden für Angreifer darstellen, um Angriffe zu ernsteren Angriffen auszuweiten.
Ist Cross-Site-Scripting nicht ein Benutzerproblem?
Nein. Wenn ein Angreifer eine XSS-Schwachstelle in einer Webseite missbrauchen kann, um beliebiges JavaScript im Browser des Besuchers auszuführen, ist die Sicherheit dieser Website oder Webanwendung und ihrer Benutzer gefährdet – xss ist nicht das Problem des Benutzers, ebenso wenig wie eine andere Sicherheitslücke, wenn Es wirkt sich auf Ihre Benutzer aus, es wird sich auf Sie auswirken.
Anatomie eines Cross-Site-Scripting-Angriffs
Für einen XSS-Angriff sind drei Teilnehmer erforderlich: die Website, das Opfer und der Angreifer. Das folgende Beispiel geht davon aus, dass das Ziel des Angreifers darin besteht, sich als Opfer auszugeben, indem er dessen Cookies stiehlt. Das Senden von Cookies an den Server des Angreifers kann auf verschiedene Arten erfolgen, unter anderem durch die Ausführung des folgenden JavaScript-Codes im Browser des Opfers unter Ausnutzung einer XSS-Schwachstelle.
window.?cookie=“ + document.cookie Die folgende Abbildung zeigt eine Schritt-für-Schritt-Anleitung für einen einfachen XSS-Angriff.
- Ein Angreifer gibt Nutzdaten in die Datenbank einer Website ein, indem er ein anfälliges Formular mit bösartigem JavaScript-Code sendet
- Das Opfer fordert eine Webseite von einer Website an
- Die Website stellt dem Browser des Opfers eine Seite mit den Nutzdaten des Angreifers als Teil des HTML-Bodys bereit.
- Der Browser des Opfers führt das bösartige Skript im HTML-Text aus. In diesem Fall werden die Cookies des Opfers an den Server des Angreifers gesendet. Jetzt muss der Angreifer lediglich das Cookie des Opfers extrahieren, wenn eine HTTP-Anfrage beim Server eintrifft, woraufhin der Angreifer das gestohlene Cookie des Opfers verwenden kann.
Nachfolgend finden Sie eine kleine Liste von XSS-Angriffsszenarien, mit denen ein Angreifer die Sicherheit einer Website oder Webanwendung gefährden kann.
Etikett
Dieses Tag ist die direkteste XSS-Schwachstelle. Das Skript-Tag kann auf externen JavaScript-Code verlinken.
alarm("XSS"); Etikett
Mit XSS kann die Injektion innerhalb des Tags mithilfe des Onload-Attributs oder eines anderen dunkleren Attributs wie Hintergrund erfolgen.
Tag Einige Browser führen JavaScript aus, wenn es vorhanden ist .
Tag Mit diesem Tag können Sie eine weitere HTML-Seite in die übergeordnete Seite einbetten. Ein iFrame kann JavaScript enthalten. Es ist jedoch wichtig zu beachten, dass JavaScript in einem iFrame aufgrund der Content Security Policy (CSP) des Browsers keinen Zugriff auf das DOM der übergeordneten Seite hat. Dennoch sind IFrames immer noch ein sehr wirksames Mittel für Phishing-Angriffe.
Etikett
Wenn das Typattribut dieses Tags in einigen Browsern auf „Bild“ gesetzt ist, kann es zum Hosten eines Skripts verwendet werden.
Etikett
Das Tag, das häufig zum Verlinken auf externe Stylesheets verwendet wird, kann Skript enthalten.