Многие багхантеры полагаются только на перебор или простые кейсы при поиске 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
Сложность ИИ-систем выходит далеко за пределы самих моделей. Уязвимости возникают там, где ИИ взаимодействует с внешним миром — и вот почему:
iframe или компоненты с динамическим рендерингомЭто снова открывает возможности для классических атак на клиенте, таких как XSS и небезопасная работа с
postMessage. Всегда проверяйте интеграцию LLM на фронте.Обратите внимание на IDOR или другие ошибки контроля доступа — особенно в том, как API обрабатывает данные ещё до того, как они попадут в модель.
— В системах RAG (Retrieval Augmented Generation) может произойти утечка внутренних данных
— В архитектурах с циклической логикой возможны злоупотребления через tool chaining
— Даже LLM, работающие в CLI, могут быть уязвимы к атакам с использованием ANSI escape-последовательностей
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4❤1
В реальной практике существует несколько кейсов, с которыми можно столкнуться при повышении от AFW к RCE в веб-приложениях. Их можно обобщенно разделить на следующие категории:
В зависимости от разрешений, применяемых к целевой директории и целевому приложению, последствия могут варьироваться от DoS до вмешательства в логику приложения с целью обхода потенциально уязвимых функций.
Тактики для достижения RCE через AFW:
— Конфигурационные файлы (
.htaccess, .config, web.config, httpd.conf)— Исходники, доступные для выполнения (
.php, .jsp)— Временные/сессионные файлы, файлы с секретами
— Cron, bash-скрипты (
.bashrc, .bash_profile)— Файлы
authorized_keys и authorized_keys2 для получения доступа через SSH👉 Еще один интересный кейс
Предположим, что уязвимость позволяет загружать и изменять файлы через функцию экспорта в PDF.
Приложение работает на uWSGI, который поддерживает различные способы конфигурации, включая загрузку конфигов через обычные
.ini файлы. uWSGI поддерживает «магические» переменные (
@exec://), которые позволяют выполнять произвольные команды.При включенной опции
py-auto-reload перезагрузка конфигурации может быть вызвана изменением Python-файлов, что дает шанс выполнить команду.
uwsgi --ini payload.pdf
/app/console/uwsgi-sockets.ini.py файлыPlease open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Что отличает опытного багхантера от новичка? Возможность наткнуться на что-то с низким импактом и раскрутить до более серьезной проблемы💡
Web cache deception — в помощь!
Web cache deception — в помощь!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤3👍3
Это далеко не все возможные техники, но именно они чаще всего приводят к результату на практике:
1️⃣ Blind XSS через заголовки: приложения могут логировать ваши данные различными способами, поэтому проверяйте XSS-пэйлоад в HTTP-заголовках (
X-Forwarded-For, Referrer, User-Agent и других)2️⃣ Устаревшие API:
/api/v2 → /api/v1, /api/v2 → /api/, api-v2.example.com → api-v1.example.com или api.example.com3️⃣ SSRF: заменяйте любой URI в запросах на контролируемый вами ресурс через Proxy Interceptor Match & Replace Rule и ждите входящие соединения
4️⃣ Поиск эндпоинтов: используйте GitHub, Google/Yandex дорки, анализируйте JavaScript, Swagger API или другую документацию
5️⃣ CSRF: удалите или замените anti-CSRF токен, меняйте Content-Type и метод запроса
6️⃣ Эксплуатация JWT: ищите слабые алгоритмы подписи, пробуйте манипулировать с токенами
7️⃣ Обход 401/403: попробуйте получить доступ ко вложенному пути (
/admin 401 → /admin/system-resources 200), добавьте спецсимволы или измените методы запроса8️⃣ Неправильная настройка CORS: проверьте правильность настроек CORS и убедитесь, что API позволяет отправлять запросы из любого источника с использованием учётных данных
9️⃣ Тестирование race conditions: проверяйте так называемые high-value транзакции — загрузка файлов, размещение заказов, платежи, переводы
1️⃣0️⃣ XXE: измените Content-Type с
application/json на application/xml и проверьте на наличие XXE1️⃣1️⃣ NoSQL инъекция: манипулируйте параметрами и добавляйте MongoDB (или любой другой NoSQL БД) пэйлоад для обхода ограничений
1️⃣2️⃣ Обход загрузки файлов: пробуйте загрузить файлы с нестандартными расширениями или без них, используйте известные методы обхода (null byte, magic byte и другие)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥3
Это далеко не все возможные методы обхода ограничений, но даже такие простые и зачастую недооцененные техники могут быть весьма эффективными.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤4🤔2
В DevTools есть функция
debug(), которая ставит breakpoint каждый раз, когда вызывается переданный в нее аргумент.Это работает даже для встроенных методов — больше не нужно оборачивать их в прокси.
debug(DOMParser.prototype.parseFromString)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍3🔥3
Когда веб-приложение обрабатывает пользовательский ввод как часть шаблона, можно использовать встроенные функции шаблонизатора для отображения пользовательских данных, доступа к секретам, чтения локальных файлов и даже удаленного выполнения кода.
Но перед этим важно идентифицировать потенциальную уязвимость SSTI. Один из способов — преднамеренно вызвать ошибку с использованием различных спецсимволов:
{
}
$
#
@
%)
"
'
|
{{
}}
${
<%
<%=
%>Как только мы подтвердим точку инъекции, переходим к следующему этапу — отправке различных пэйлоадов для инъекций в шаблон и наблюдению за тем, какие из них были обработаны.
Этот этап критичен, так как он поможет определить используемый движок шаблонов и создать эффективный пэйлоад для эксплуатации.
Все движки шаблонов используют различный синтаксис, но некоторые элементы могут быть схожи. Несколько часто используемых движков шаблонов рассмотрено в недавнем гайде от Intigriti:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2