Что делать, если WAF не умеет работать с JSON: готовое решение

7ee65a9de98ea2a7a2e0950cc7a7b19f.png

Сегодня расскажем вам о нестандартном подходе к защите веб-приложений с помощью PT Application Firewall PRO (PT AF PRO). Мы с коллегами столкнулись с интересной задачей: как защитить уязвимое приложение от вредоносных JSON-запросов. PT Application Firewall PRO из коробки поддерживает анализ JSON (валидацию JSON и обнаружение атак по сигнатурам), но в текущей версии (4.1.5) нельзя написать свое пользовательское правило, чтобы проанализировать конкретный параметр JSON. Вендор планирует добавить это в ближайших релизах, но что делать, если нужно решить проблему прямо сейчас?

В этой статье пройдем путь от постановки проблемы до ее решения, используя регулярные выражения и нестандартные настройки PT Application Firewall PRO. Руслан Ануфренка, инженер в группе технической поддержки информационной безопасности К2 Кибербезопасность расскажет, как:

  1. Настроить систему для работы с внешним агентом PT AF PRO;

  2. Закрыть уязвимость Zero Stars в Juice Shop;

  3. Создать и применить пользовательское правило с помощью регулярных выражений;

  4. Оценить эффективность и ограничения такого решения.

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

В одной из прошлых статей мы рассказывали об испытании для новичков на нашей практике «Защита приложений». Каждый новый специалист проходит «боевое крещение»: и с кодом ковыряется, и с настройками WAF играет, и атаку проводит, и защиту настраивает. Полный цикл от и до. Обычно мы решаем стандартные задачи, но сегодня я расскажу о более сложном случае. 

Что мы решили проверить

При защите веб-приложений заказчики иногда сталкиваются с уязвимостями в бизнес-логике. Такие проблемы возникают редко, и обычно заказчики решают их силами собственной команды. Однако в некоторых случаях эффективнее использовать WAF (Web Application Firewall, межсетевой экран уровня приложений). Например, если нужно устранить уязвимость в устаревшем веб-приложении, исправление кода может потребовать значительных ресурсов отдела разработки. В такой ситуации WAF становится оптимальным решением.

Современные WAF используют машинное обучение для анализа трафика, выявления отклонений и автоматического устранения некоторых уязвимостей. Однако полностью полагаться на эту технологию нельзя. Для максимальной эффективности необходимо индивидуально рассмотреть каждую уязвимость и настроить WAF соответствующим образом, зачастую вручную. Это обусловлено тем, что уязвимости могут существенно различаться по своей природе и сложности. 

В большинстве случаев мы стараемся решить эту задачу самостоятельно, даже когда сталкиваемся с неочевидными аспектами работы WAF.

Итак, у нас есть классическое дырявое приложение-мишень Juice Shop и PT Application Firewall PRO — WAF от вендора, который не нуждается в представлении.

Это довольно популярное средство защиты веб-приложений на российском рынке. 

PT AF PRO можно развернуть в локальном или гибридном исполнении. При локальном развертывании фильтрующие узлы и консоль управления работают внутри контура заказчика. При гибридном фильтрующие узлы устанавливаются на подконтрольном заказчику оборудовании, а управление осуществляется через личный кабинет производителя, доступный через Интернет.

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

Давайте пошагово разберем возможное решение.

Готовим систему для работы

Подключим внешнего агента PT AF PRO. Сначала нужно выбрать подходящую версию веб-сервера nginx и установить его. Мы выбрали версию 1.22.0 для Debian 11:

9c2afa6a9cee1a1423996756584524d9.png

После готовности сервера установим deb-пакет для ядра PT AF PRO. Его можно получить от вендора.

5fbd1c029054ab74244977ec40fc00e1.png

Затем приступим к настройке внешнего агента PT AF PRO в конфигурационном файле nginx:

29a55c67f1a02271256f6ec7c3cd0c50.png

Далее необходимо сделать следующее:

  • указать пользователя с правами доступа к /opt/ptaf;

  • в директиве load_module прописать установленный на предыдущем шаге модуль ptaf;

  • в переменной POD_IP указать IP-адрес внешнего агента, на который установлен ptaf-core;

  • в блоке http добавить директиву ptaf_config, в которой указана строка подключения к тенанту.
     

Следующий шаг — проверка конфигурационных файлов и перезагрузка службы nginx.

Если все сделано верно, в веб-консоли отобразится статус подключения агента PT AF PRO.

ea4895dbd9f5d1ff06a3d934e967790f.png

Закрываем уязвимость Zero Stars

Для имитации действий потенциального злоумышленника перейдем во вкладку «Отзыв пользователя» в Juice Shop и заполним форму, выбрав 3 звезды. После этого перехватим сгенерированный запрос к серверу и модифицируем его, изменив значение рейтинга на 0. Таким образом, мы смоделируем сценарий атаки, направленной на манипуляцию данными пользовательских оценок.

abe61c4e726badd08d918d84fbe8795b.png

Отправим запрос на сервер. Он обрабатывается и успешно проходит валидацию.

3fb959847fdfaadf59fe9ddca4da4720.png

Сравним запрос слева, где в результате обработки BurpSuite’ом значение »3» заменено на »0», и ответ сервера справа. Здесь видно, что веб-сервер принял значение »0» и таким образом подтвердил наличие ошибки в бизнес-логике.

JSON по своей природе является текстовым форматом представления данных. Некоторые другие WAF могут их распарсить и каждый параметр представить отдельно. Однако в случае с PT AF PRO единственный выход — обрабатывать весь JSON-файл как единый текстовый блок. В этой ситуации нас выручат регулярные выражения.

Выполним следующие действия: откроем веб-консоль PT AF PRO, перейдем во вкладку «Набор пользовательских правил» и создадим новое правило, используя специально написанное регулярное выражение.

9eeb380c459c6c0bd134be9f2e458038.pngd2981bae7ebef0c1f36345038cd29e3f.png

Алгоритм работы правила основан на следующей логике: запрос идентифицируется как некорректный и подлежит блокировке при одновременном выполнении трех условий:

  1. Путь запроса соответствует /api/Feedbacks/

  2. Метод запроса — POST;

  3. Тело запроса не соответствует ранее определенному регулярному выражению.

    Реализация нашего правила в веб-консоли PT AF PRO

    Реализация нашего правила в веб-консоли PT AF PRO

При соответствии параметров клиентского запроса заданному выражению PT AF PRO выполнит два действия: заблокирует запрос и зафиксирует событие срабатывания в базе данных.

Для проверки эффективности настроенного правила проведем повторное тестирование, имитируя действия потенциального злоумышленника:

6d360c2725edc64c54dbf8cb0c35ca73.png

c68e97eea3ad59955bbcb39e4421e868.png

Как и в прошлый раз, слева — запрос, в котором »3» подменено в результате обработки в BurpSuite. При проверке логов в PT AF PRO обнаруживаем подтверждение срабатывания нашего пользовательского правила:

3da9ae84cc7dc88e07a68d2c3cd643d4.png

Насколько оправдано использование регулярок в пользовательских правилах

Что ж, мы прошли весь путь от обнаружения проблемы до ее решения с помощью PT Application Firewall PRO и регулярного выражения — успешно защитили уязвимое приложение от вредоносного запроса, несмотря на отсутствие нативной поддержки JSON в WAF.

Очевидно, когда в вашем сервисе нашли серьезную уязвимость, — все средства защиты хороши. И если WAF не умеет работать с JSON, а проверять параметры запроса нужно, то регулярка — вполне подходящее решение. 

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

Также стоит учитывать, что подобное правило может не обработать данные в HEX-формате. По крайней мере, мы не проверяли такую возможность. Также возможны сложности при перестановке параметров в JSON-запросе. JSON допускает такие перестановки, а регулярное выражение их не отследит. Для каждого варианта расположения параметров потребуется отдельное выражение. Да, они хорошо оптимизированы и обычно не оказывают существенного негативного влияния на производительность системы (мы проверяли). Конечно, это все равно костыль, но костыль рабочий. Если вам не хватает некой функциональности, ищите альтернативные решения. Они обычно существуют.

Habrahabr.ru прочитано 1330 раз