Сегодня мы хотим протестировать и сравнить работу двух бесплатных WAF: NAXSI и Nemesida WAF Free. В сравнении будут учитываться простота использования, качество предустановленных сигнатур, количество пропусков атак и частота ложных срабатываний.

NAXSI расшифровывается как Nginx Anti XSS & SQL Injection. Работает по принципу: всё, что не разрешено — запрещено. Каждый HTTP-запрос (GET|PUT|POST) проверяется на соответствие шаблонам запрещающих правил, заданных по умолчанию в файле naxsi_core.rules. Эти правила охватывают 99% всех возможных вариантов зловредных запросов. Например, по умолчанию запрещены все запросы, в URI которых содержится символ двойной кавычки. Если для нормальной работы приложения такой символ необходим, то вручную нужно внести соответствующие исключения в белый список. Но есть и обратная сторона медали — если разрешающие правила будут проработаны плохо, то NAXSI будет блокировать еще и часть легитимных запросов. Поэтому ответственность за конечный результат разработчики модуля целиком и полностью возлагают на администратора системы. Как и большинство модулей для Nginx, NAXSI из репозитория недоступен, поэтому его придется вручную скачивать и компилировать.

Nemesida WAF Free — бесплатная версия Nemesida WAF, представляющая собой динамический модуль для Nginx и обеспечивающая базовую защиту веб-приложения от атак класса OWASP на основе сигнатурного метода.

Отличительной особенностью Nemesida WAF Free является собственная база сигнатур, выявляющая атаки на веб-приложения при минимальном количестве ложных срабатываний, а также:

  • минимальные требования к аппаратным ресурсам;
  • обновление из репозитория;
  • установка и настройка за несколько минут;
  • обработка содержимого всех типов HTTP-запроса;
  • простота в обслуживании.

Подготовка

NAXSI

Перед тем, как приступить к тестированию NAXSI, необходимо сперва создать правила WL (whitelist, белый список) для работы с легитимным трафиком.Мы добавили несколько правил в белый список (на скриншоте ниже: над правилом указывается паттерн, по которому легитимный запрос был заблокирован), чтобы исключить блокирование легитимных запросов.

NAXSI rules:

Коротко о правилах:
Первые 5 правил нам пришлось добавить в белый список только для того, чтобы загрузился сайт. Правила, касающиеся символов () <> , были также добавлены в белый список, так как они используются при составлении контента на сайте (некоторые уточнения можно написать в скобках, а при редактировании текста поста — использовать html-теги). В общем, если надумаете использовать NAXSI — будьте готовы тратить много времени на составлении WL. Кроме этого, с каждым WL увеличивается шанс пропуска атак.

Nemesida WAF Free

После установки Nemesida WAF Free предварительная настройка не потребовалась, ложных срабатываний не обнаружено.

Файл конфигурации Nemesida WAF Rules остался неизменным:

Счет: 0:1

SQLi

NAXSI

Первым пунктом тестирования-сравнения будет проверка правил для блокирования атак SQL injection с учетом белого списка. В ходе тестирования NAXSI был выявлен один неприятный момент — он совершенно не распознает URL encode в параметре cookie, вследствие чего большинство его дефолтных правил оказываются бесполезными, если передавать пейлоад в виде URL encode.

Атака вида [“1807182982’)) uni”,”on sel”,”ect 1,2,3,4,5,6,7,8,9,’0’,11#”] будет заблокирована:

Но если применить URL-encode, то запрос изменится на %5B%221807182982%27%29%29%20uni%22%2C%22on
%20sel%22%2C%22ect%201%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C%2pentestit%27%2C11%23%22%5D
и не будет заблокирован:

При этом URL encode происходит в BODY/ARGS — NAXSI выполнит предварительное URL-декодирование запроса. Для примера мы попытались проэксплуатировать инъекцию на странице логина, чтобы обойти авторизацию, но, в отличие от предыдущего примера, NAXSI сразу понял наши намерения:

Nemesida WAF Free
Nemesida WAF Free использует двойное декодирование всех зон, поэтому все запросы были заблокированы..

Счет: 0:2

LFI

Далее была протестирована возможность блокировки запросов с атакой типа LFI или Local File Inclusion.

Для примера рассмотрим запрос, в котором попробуем получить доступ к файлу /etc/passwd (RCE). Такой запрос был заблокирован каждым из WAF:

Но расщепление запроса cat /etc/pas?wd не позволит выявить сигнатуру и атака пройдет:

Для таких атаки довольно сложно составить сигнатуры, поскольку существует большая вариация таких запросов. Выявлять такие атаки (их вариации, атаки «нулевого дня» и т.д.) может модуль машинного обучения, доступный в полноценной версии Nemesida WAF.

XSS

Последним этапом сравнительного тестирования будет попытка обхода WAF для эксплуатации XSS уязвимости.

NAXSI

Ранее уже упоминалось, что при создании или редактировании текстового контента на сайте можно использовать скобки или HTML-теги. Необходимость добавления этих символов в белый список для корректного использования сайта повлекла за собой возможность выполнить XSS:

Nemesida WAF Free

Запрос был заблокирован:

Счет: 0:3

Заключение

Функционал NAXSI немного схож с Nemesida WAF Free, но последний гораздо проще устанавливать, обновлять и настраивать. Единственное преимущество NAXSI перед Nemesida WAF Free — полностью открытый исходный код. При этом NAXSI имеет как минимум 2 серьезных недостатка:

  • предустановленные сигнатуры, которые не позволяют работать с веб-приложением, а создание белого списка способствует обходу NAXSI;
  • уязвимости в коде, позволяющие выполнять обход (отсутствие URL декодирования в Cookie и т.д.).

Качественно созданная база сигнатур Nemesida WAF Free (находится в открытом доступе) позволяет в использовать модуль с настройками из коробки без ложных срабатываний. Кроме этого, Nemesida WAF Freе имеет функционал добавления пользовательских правил, просто устанавливается из репозитория и не требует для базовой работы дополнительной настройки. Если вы используете NAXSI — обязательно попробуйте Nemesida WAF Free. Вот как это можно сделать в Debian 9:

1. Подключите репозиторий Nemesida WAF:

# apt install apt-transport-https
# echo "deb https://repository.pentestit.ru/nw/debian stretch non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://repository.pentestit.ru/nw/gpg.key | apt-key add -
# apt update && apt upgrade

2. Подключите репозиторий «nginx» и произведите установку пакетов:

# echo "deb http://nginx.org/packages/debian/ stretch nginx" > /etc/apt/sources.list.d/nginx.list
# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add -
# apt update && apt upgrade
# apt install nginx
# apt install librabbitmq4 libcurl4-openssl-dev libc6-dev python3-pip python3-dev python3-setuptools dmidecode gcc
# apt install nwaf-dyn-1.16

3. Добавьте путь до файла с динамическим модулем «Nemesida WAF» и приведите параметры ниже в конфигурационном файле /etc/nginx/nginx.conf к виду:

load_module /etc/nginx/modules/ngx_http_waf_module.so;
...
worker_processes auto;
...
http {
...
    ##
    # Nemesida WAF
    ##

    ## Request body too large fix
    client_body_buffer_size 25M;

    include /etc/nginx/nwaf/conf/global/*.conf;
    include /etc/nginx/nwaf/conf/vhosts/*.conf;
...
}

Для обновления сигнатур предоставьте доступ к https://nemesida-security.com. При использовании прокси-сервера укажите его в директиве sys_proxy параметра nwaf_api_conf (например, sys_proxy=proxy.example.com:3128).

4. Перезапустите сервисы и проверьте их работу:

# systemctl restart nginx.service nwaf_update.service
# systemctl status nginx.service nwaf_update.service

За получение сигнатур Nemesida WAF отвечает служба nwaf_update. Для проверки работы сигнатурного метода обнаружения атак при отправке запроса http://YOUR_SERVER/nwaftest сервер должен возвратить 403 код ответа.

Все! Более подробная информация о Nemesida WAF Free доступна по ссылке.