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

WebSocket Hijacking через CSRF — WS не проверяет Origin? Засунь new WebSocket(‘wss://target.com’) в свой HTML, перехвати чужие сообщения

WebSocket Hijacking через CSRF - WS не проверяет Origin? Засунь new WebSocket('wss://target.com') в свой HTML, перехвати чужие сообщения

Слушай, братан, щас расскажу про CSWSH (Cross-Site WebSocket Hijacking) — классику жанра, которую половина девелоперов игнорирует, думая, что WebSocket’ы защищены Same Origin Policy. Спойлер: хуй там плавал.

Суть прикола

WebSocket не использует SOP из коробки. Вместо этого сервер может проверять Origin header при handshake’е, а может забить болт. RFC 6455 прямо говорит: «Можете чекать, можете нет — как хотите». Если сервер тупо пускает всех + полагается на cookie для auth’а — ты в дамках.

Точка входа: как поймать

Что вижу:

Заставляешь жертву открыть твой evil.html (phishing/XSS на другом сайте). Браузер автоматом приаттачит её cookie к handshake’у.

Обход защиты (если есть косая проверка Origin):

  • Сервер чекает target.com в Origin? Регай домен target.com.evil.net — некоторые делают substring-match вместо exact

  • Попробуй Origin: null — работает на старых версиях WebSocket серверов

  • Если есть открытый редирект на target.com — используй его для bypass’а

Доказательство:
Скрин из консоли с [+] Украл сообщение: {"user":"admin","balance":100500} + логи на твоём attacker.com с украденными данными. В bug bounty это instant critical.

Реальные кейсы

CVE-2020-25095 — LogRhythm Platform Manager 7.4.9, CSWSH позволял выполнять команды от имени залогиненного юзера. Severity: High.

CVE-2025-41254 — Spring WebSocket (свежак, февраль 2026), позволял отправлять STOMP-сообщения без установки сессии, bypass CSRF полностью.

Защита (для дев-братков)

Если ты девелопер — вот как не быть лохом:

  • Строгий allowlist для Origin:

  • CSRF-токены в handshake — передавай их через query string при создании WebSocket:

  • OAuth/JWT токены в headers вместо cookie-based auth

Советы

3 вектора для добивания:

  1. Если нашёл CSWSH, но не видишь эффекта — понаблюдай за трафиком дольше. Может, там realtime-уведомления с токенами, которые приходят через минуту после login’а.

  2. Проверь /robots.txt и sitemap.xml — иногда там пути к WebSocket endpoints типа /internal-ws, которые вообще не защищены.

  3. Cloudflare/AWS перед сервером? Проверь metadata endpoint 169.254.169.254 — если WebSocket проксирует запросы, можешь выдернуть AWS credentials через SSRF.

План атаки (если зацепка есть):

  1. Сниффи handshake в Burp → Отправь на Repeater

  2. Меняй Origin на evil.com → Если 101 ответ — бинго

  3. Деплой PoC на свой VPS (Nginx + Let’s Encrypt для wss://)

  4. Создай фишинг-страницу с payload’ом выше

  5. Если цель — корпорат, шли через внутреннюю почту (вид «срочное обновление системы»)

  6. Логируй всё на своём сервере: nc -lvnp 4444 для catch’а данных

Иди топтать bug bounty, бро. Этот вектор до сих пор в топе на HackerOne.

Мои курсы