# XS-Search/XS-Leaks
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
Obtenez un accès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
## **Informations de base**
XS-Search est une technique orientée vers l'**exfiltration d'informations inter-origines** en exploitant des **attaques de canal secondaire**.
Il existe différents éléments dans ce type d'attaque :
* **Web vulnérable** : C'est le web à partir duquel nous voulons exfiltrer des informations.
* **Web de l'attaquant** : C'est le web que l'attaquant crée contenant l'exploit et auquel la victime accède.
* **Méthode d'inclusion** : C'est la méthode utilisée pour charger le Web vulnérable à partir du 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 l'état potentiel du web avec les informations obtenues à partir 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** : Il s'agit des informations que l'attaquant doit essayer de décider de l'état du web vulnérable.
### Différences détectables
Afin de distinguer entre les 2 états de la page vulnérable, plusieurs éléments peuvent être examinés :
* **Code d'état**. Un attaquant peut distinguer les **différents codes d'état de réponse HTTP** inter-origines (par exemple, erreurs serveur, erreurs client ou erreurs d'authentification).
* **Utilisation de l'API**. Cette différence détectable permet à un attaquant de détecter l'**utilisation des API Web** sur les pages, ce qui lui permet de déduire si une page inter-origines utilise une API Web JavaScript spécifique.
* **Redirections**. Il est possible de détecter si une application web a **redirigé l'utilisateur vers une autre page**. Cela ne se limite pas 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** lui-même ou dans les sous-ressources incluses par la page. Par exemple, cela pourrait être le **nombre de frames incluses** (cf. XS-Leak sur Gitlab) ou les différences de taille des 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 en mesure de recueillir sa valeur. Cela inclut des en-têtes tels que X-Frame-Options, Content-Disposition et Cross-Origin-Resource-Policy.
* **Timing** : Un attaquant peut détecter qu'il existe une différence de temps constante entre 2 états.
### Méthodes d'inclusion
* **Éléments HTML**. HTML offre une variété d'éléments qui permettent l'**inclusion de ressources inter-origines**. Des éléments tels que les feuilles de style, les images ou les scripts obligent le navigateur de la victime à demander une ressource non-HTML spécifiée. Une liste énumérant les éléments HTML possibles à cette fin est disponible en ligne ([https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)).
* **Frames**. Des éléments tels que **iframe**, **object** et **embed** peuvent incorporer directement d'autres ressources HTML dans la page de l'attaquant. Si la page ne **protège pas contre l'encadrement**, 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 une nouvelle fenêtre du navigateur. La méthode renvoie une **poignée de fenêtre** que le code JavaScript peut utiliser pour accéder aux méthodes et propriétés, conformes à la SOP. Ces pop-ups sont souvent utilisés dans la connexion unique. Les navigateurs modernes n'autorisent les pop-ups que s'ils sont déclenchés par certaines interactions de l'utilisateur. Pour les attaques XS-Leak, cette méthode est particulièrement utile car elle **contourne les restrictions d'encadrement et de cookies pour une ressource cible**. Les versions plus récentes des navigateurs ont récemment ajouté des moyens d'isoler les poignées de fenêtre.
* **Requêtes JavaScript**. JavaScript permet d'envoyer des requêtes directement aux ressources cibles. Il existe deux façons différentes à cette fin : les **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, s'il faut suivre automatiquement une redirection HTTP.
### 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 réussi des ressources contrairement à l'événement onerror.
* **Messages d'erreur**. Au-delà des gestionnaires d'événements, les messages d'erreur peuvent se produire sous forme d'**exceptions JavaScript** et de **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 utiliser des **informations** supplémentaires directement **contenues** dans le **message d'erreur**, ou faire la distinction entre l'**apparition et l'absence d'un message d'erreur**.
* **Limites globales**. Chaque ordinateur a ses limites physiques, tout comme 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 du navigateur qui sont appliquées à 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 à partir du site d'un 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 une frame. Cela crée un état global car le **nombre d'entrées** permet à un attaquant de tirer des conclusions sur les pages de différentes origines.
* **API de performance**. L'API de performance est utilisée pour accéder aux **informations de performance de la page actuelle**. Leurs entrées comprennent des données détaillées sur le chronométrage du réseau 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éent pas d'entrées de performance pour certaines requêtes.
* **Attributs lisibles**. HTML dispose de plusieurs **attributs lisibles entre les origines**. Cet accès en lecture peut être utilisé comme une technique de fuite. Par exemple, le code JavaScript peut lire le nombre de frames incluses dans une page Web entre les origines 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 les différences dans les états possibles des pages Web. Il existe différentes façons 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 chronométrage de haute résolution.\
Il existe un nombre considérable d'API que les attaquants peuvent exploiter 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), les animations CSS, et autres.\
Pour plus d'informations : [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 d'une mauvaise configuration et de bugs dans une application Web spécifique**. Par exemple, les mauvaises configurations de Cross-Origin Resource Sharing (CORS), les fuites de postMessage ou les attaques de type Cross-Site Scripting. De plus, nous avons exclu les XS-Leaks basés sur le temps car ils souffrent souvent d'une lenteur, d'un bruit et d'une imprécision.
{% endhint %}
\
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
Accédez-y dè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** : Frames, Éléments HTML
* **Différence détectable** : Code d'état
* **Plus d'informations** : [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 on essaie de charger une ressource, les événements onerror/onload sont déclenchés lorsque la ressource est chargée avec succès/échec, il est possible de déterminer le code d'état.
* **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 scripts depuis JS**, mais **d'autres balises** telles que les objets, les feuilles de style, les images, les audios pourraient également être utilisées. De plus, il est également possible d'injecter directement la **balise** 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é.
### Timing de chargement
* **Méthodes d'inclusion**: Éléments HTML
* **Différence détectable**: Timing (généralement dû au contenu de la page, au code d'état)
* **Plus d'informations**: [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 %}
#### Timing de chargement + Tâche lourde forcée
Cette technique est similaire à la précédente, mais l'**attaquant** va également **forcer** une action à 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 %}
### Timing de déchargement/avant déchargement
* **Méthodes d'inclusion**: Frames
* **Différence détectable**: Timing (généralement dû au contenu de la page, au code d'état)
* **Plus d'informations**: [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 car **`beforeunload`** est déclenché lorsque le navigateur **demande une nouvelle navigation**, tandis que **`unload`** est déclenché lorsque cette **navigation se produit réellement**. Grâce à 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 le chargement de la ressource**.
### Timing de frame sandbox + onload
* **Méthodes d'inclusion**: Frames
* **Différence détectable**: Timing (généralement dû au contenu de la page, au code d'état)
* **Plus d'informations**: [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 mis en place de [protections de cadrage](https://xsleaks.dev/docs/defenses/opt-in/xfo/), un attaquant peut mesurer le temps nécessaire pour que la page et toutes les sous-ressources se chargent via le réseau. Par défaut, le gestionnaire `onload` d'un iframe est invoqué après que toutes les ressources ont été chargées et que tout le JavaScript a fini de s'exécuter. Cependant, 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 `