# XS-Search/XS-Leaks
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés** au monde.\
Obtenez l'accès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Apprenez le piratage AWS de zéro à héros avechtARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs exclusifs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## **Informations de base**
XS-Search est une technique orientée vers l'**exfiltration d'informations cross-origin** en abusant des **attaques par canal auxiliaire**.
Il y a différents éléments dans ce type d'attaque :
* **Web Vulnérable** : C'est le web d'où nous voulons exfiltrer des informations.
* **Web de l'Attaquant** : C'est le web que l'attaquant crée contenant l'exploit et que la victime accède.
* **Méthode d'Inclusion** : C'est la méthode utilisée pour charger le Web Vulnérable depuis le web de l'attaquant (comme window.open, iframe, fetch, balise HTML avec href...).
* **Technique de Fuite** : Après avoir accédé au web vulnérable, une technique sera utilisée pour différencier entre les états potentiels du web avec les informations obtenues de la méthode d'inclusion utilisée.
* **États** : Les 2 états possibles que le web vulnérable peut avoir en fonction de la victime que nous voulons différencier.
* **Différences Détectables** : C'est l'information que l'attaquant doit essayer de décider de l'état du web vulnérable.
### Différences Détectables
Pour distinguer entre les 2 états de la page vulnérable, plusieurs choses pourraient être examinées :
* **Code de Statut**. Un attaquant peut distinguer **différents codes de statut de réponse HTTP** cross-origin (par exemple, erreurs serveur, erreurs client ou erreurs d'authentification).
* **Utilisation d'API**. Cette différence détectable permet à un attaquant de détecter **l'utilisation d'API Web** à travers les pages, permettant à un attaquant d'inférer si une page cross-origin utilise une API Web JavaScript spécifique.
* **Redirections**. Il est possible de détecter si une application web a **navigué l'utilisateur vers une page différente**. Cela n'est pas limité aux redirections HTTP mais inclut également les redirections déclenchées par JavaScript ou HTML.
* **Contenu de la Page**. Ces différences détectables apparaissent dans le corps de la réponse HTTP elle-même ou dans les sous-ressources incluses par la page. Par exemple, cela pourrait être le **nombre de cadres inclus** (cf. XS-Leak sur Gitlab) ou des différences de taille d'images.
* **En-tête HTTP**. Un attaquant peut détecter la présence d'un **en-tête de réponse HTTP spécifique** et peut être capable de recueillir sa valeur. Cela inclut des en-têtes tels que X-Frame-Options, Content-Disposition et Cross-Origin-Resource-Policy.
* **Temps** : Un attaquant peut détecter qu'une différence de temps cohérente existe entre 2 états.
### Méthodes d'Inclusion
* **Éléments HTML**. HTML offre une variété d'éléments qui permettent **l'inclusion de ressources cross-origin**. Des éléments comme les feuilles de style, les images ou les scripts, forcent le navigateur de la victime à demander une ressource non-HTML spécifiée. Une liste qui énumère les éléments HTML possibles à cette fin est disponible en ligne ([https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)).
* **Cadres**. Des éléments tels que **iframe**, **object** et **embed** peuvent intégrer directement d'autres ressources HTML dans la page de l'attaquant. Si la page **n'utilise pas de protection contre le framing**, le code JavaScript peut accéder à l'objet window de la ressource encadrée via la propriété contentWindow.
* **Pop-ups**. La méthode **`window.open`** charge une ressource dans un nouvel onglet ou fenêtre du navigateur. La méthode retourne une **poignée de fenêtre** que le code JavaScript peut utiliser pour accéder aux méthodes et propriétés, qui respectent la SOP. Ces pop-ups sont souvent utilisés dans la connexion unique. Les navigateurs modernes ne permettent les pop-ups que s'ils sont déclenchés par certaines interactions utilisateur. Pour les attaques XS-Leak, cette méthode est particulièrement utile car elle **contourne les restrictions de framing et de cookies pour une ressource cible**. De nouvelles versions de navigateurs ont récemment ajouté des moyens pour isoler les poignées de fenêtre.
* **Requêtes JavaScript**. JavaScript permet d'envoyer des requêtes directement aux ressources cibles. Il existe deux manières différentes à cette fin : **XMLHttpRequests** et son successeur **Fetch API**. Contrairement aux méthodes d'inclusion précédentes, un attaquant a un contrôle précis sur la requête émise, par exemple, si une redirection HTTP doit être automatiquement suivie.
### Techniques de Fuite
* **Gestionnaire d'Événements**. Le gestionnaire d'événements peut être considéré comme la technique de fuite classique pour les XS-Leaks. Ils sont une source bien connue de diverses informations. Par exemple, le déclenchement de **onload** indique un chargement de ressource **réussi** contrairement à l'événement onerror.
* **Messages d'Erreur**. Au-delà des gestionnaires d'événements, des messages d'erreur peuvent survenir comme **exceptions JavaScript** et **pages d'erreur spéciales**. Les messages d'erreur peuvent être lancés à différentes étapes, par exemple, directement par la technique de fuite. La technique de fuite peut soit utiliser des **informations supplémentaires** directement **contenues** dans le **message d'erreur**, ou distinguer entre **l'apparition et l'absence d'un message d'erreur**.
* **Limites Globales**. Chaque ordinateur a ses limites physiques, il en va de même pour un navigateur. Par exemple, la quantité de mémoire disponible limite les onglets en cours d'exécution d'un navigateur. Il en va de même pour d'autres limites de navigateur qui sont appliquées pour l'ensemble du navigateur. Si un attaquant peut déterminer **quand la limite est atteinte, cela peut être utilisé comme une technique de fuite**.
* **État Global**. Les navigateurs ont **des états globaux avec lesquels toutes les pages peuvent interagir**. Si cette interaction est détectable depuis le site web de l'attaquant, elle peut être utilisée comme une technique de fuite. Par exemple, l'interface **History** permet de manipuler les pages visitées dans un onglet ou un cadre. Cela crée un état global car le **nombre d'entrées** permet à un attaquant de tirer des conclusions sur les pages cross-origin.
* **API de Performance**. L'API de Performance est utilisée pour accéder aux **informations de performance de la page actuelle**. Leurs entrées incluent des données de timing réseau détaillées pour le document et chaque ressource chargée par la page. Cela permet à un attaquant de tirer **des conclusions sur les ressources demandées**. Par exemple, nous avons identifié des cas où les navigateurs ne créeront pas d'entrées de performance pour certaines requêtes.
* **Attributs Lisibles**. HTML a plusieurs **attributs qui sont lisibles cross-origin**. Cet accès en lecture peut être utilisé comme une technique de fuite. Par exemple, le code JavaScript peut lire le nombre de cadres inclus dans une page web cross-origin avec la propriété window.frame.length.
#### **Techniques basées sur le Timing**
Certaines des techniques suivantes vont utiliser le timing comme partie du processus pour détecter des 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()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) permet aux développeurs d'obtenir des mesures de timing de haute résolution.\
Il existe un nombre considérable d'API que les attaquants peuvent abuser pour créer des horloges implicites : [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), animations CSS, et d'autres.\
Pour plus d'infos : [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/).
## XSinator
XSinator est un outil automatique pour **vérifier les navigateurs contre plusieurs XS-Leaks connus** expliqués dans son article : [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)\
Vous pouvez accéder à l'outil sur [https://xsinator.com/](https://xsinator.com/)
{% hint style="warning" %}
**XS-Leaks Exclus** : Nous avons dû exclure les XS-Leaks qui dépendent des **service workers** car ils interféreraient avec d'autres fuites dans XSinator. De plus, nous avons choisi d'**exclure les XS-Leaks qui dépendent de la mauvaise configuration et des bugs dans une application web spécifique**. Par exemple, les mauvaises configurations de CrossOrigin Resource Sharing (CORS), les fuites de 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 imprécis.
{% endhint %}
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés** au monde.\
Obtenez l'accès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Techniques de Gestionnaire d'Événements
### Onload/Onerror
* **Méthodes d'Inclusion** : Cadres, Éléments HTML
* **Différence Détectable** : Code de Statut
* **Plus d'infos** : [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
* **Résumé** : si en essayant de charger une ressource les événements onerror/onload sont déclenchés lorsque la ressource est chargée avec succès/insuccès, il est possible de déterminer le code de statut.
* **Exemple de code** : [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\))
{% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %}
[cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md)
{% endcontent-ref %}
L'exemple de code essaie de **charger des objets de scripts depuis 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
```
Dans ce cas, si `example.com/404` n'est pas trouvé, `attacker.com/?error` sera chargé.
### Délai de chargement (Onload Timing)
* **Méthodes d'inclusion** : Éléments HTML
* **Différence détectable** : Délai (généralement dû au contenu de la page, code de statut)
* **Plus d'infos** : [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
* **Résumé** : L'API [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) peut être utilisée pour mesurer le temps nécessaire pour effectuer une requête. Cependant, d'autres horloges pourraient être utilisées, telles que l'API [**PerformanceLongTaskTiming**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) qui peut identifier les tâches s'exécutant pendant plus de 50 ms.
* **Exemple de code** : [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) un autre exemple dans :
{% content-ref url="xs-search/performance.now-example.md" %}
[performance.now-example.md](xs-search/performance.now-example.md)
{% endcontent-ref %}
#### Délai de chargement + Tâche lourde forcée (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 significatif** lorsque la **réponse est positive ou négative** et mesurer ce temps.
{% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %}
[performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md)
{% endcontent-ref %}
### Délai de déchargement (unload/beforeunload Timing)
* **Méthodes d'inclusion** : Cadres (Frames)
* **Différence détectable** : Délai (généralement dû au contenu de la page, code de statut)
* **Plus d'infos** : [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
* **Résumé** : L'horloge [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) peut être utilisée pour mesurer le temps nécessaire pour effectuer une requête. D'autres horloges pourraient être utilisées.
* **Exemple de code** : [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
Les événements [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) et [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) peuvent être utilisés pour mesurer le temps nécessaire pour récupérer une ressource. Cela fonctionne parce que **`beforeunload`** est déclenché lorsque le navigateur **demande une nouvelle navigation**, tandis que **`unload`** est déclenché lorsque cette **navigation se produit réellement**. En raison de ce comportement, il est possible de calculer la différence de temps entre ces deux événements et de mesurer le **temps qu'il a fallu au navigateur pour terminer la récupération de la ressource**.
### Délai de chargement dans un cadre sandboxé + onload
* **Méthodes d'inclusion** : Cadres (Frames)
* **Différence détectable** : Délai (généralement dû au contenu de la page, code de statut)
* **Plus d'infos** : [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
* **Résumé** : L'API [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) peut être utilisée pour mesurer le temps nécessaire pour effectuer une requête. D'autres horloges pourraient être utilisées.
* **Exemple de code** : [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
Si une page n'a pas de [protections contre le framing](https://xsleaks.dev/docs/defenses/opt-in/xfo/) implémentées, un attaquant peut mesurer combien de temps il faut pour que la page et toutes les sous-ressources se chargent sur le réseau. Par défaut, le gestionnaire `onload` pour un iframe est invoqué après que toutes les ressources aient été chargées et que tout le JavaScript ait fini de s'exécuter. Mais, un attaquant peut éliminer le bruit de l'exécution du script en incluant l'attribut [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) dans la balise `