Привет, меня зовут Олег Рыбченко, я работаю QA-инженером в hh.ru. Количество атак на IT-инфраструктуру сегодня растет в геометрической прогрессии — об этом свидетельствуют многочисленные упоминания во всевозможных СМИ, так что не будем в очередной раз приводить графики и статистику. Разумеется, в таких условиях все больше компаний хотят позаботиться о безопасности своих сайтов и начинают проявлять интерес к современным автоматизированным инструментам по обнаружению уязвимостей. В статье разберемся, как можно реализовать и получить полноценные отчеты динамического анализа с подробно описанными потенциальными уязвимостями с помощью DAST.
![](https://habrastorage.org/getpro/habr/upload_files/ba3/2c9/eb7/ba32c9eb7684684f8f5dc8071fbf5549.jpg)
Виды анализаторов кода
Многие уже знакомы с SAST — статическими анализаторами кода. Работают они быстро, но со множеством ложных срабатываний. Некоторые уже успели их внедрить, а кто-то уже даже отказаться от них. В основном из-за шума нерелевантных срабатываний и невозможности сходу сказать о степени эксплуатируемости конкретной находки, то есть запускается ли вообще когда-нибудь найденная строка кода.
Последнее время растет интерес к DAST — динамическим анализаторам, которые умеют имитировать злоумышленников и делать запросы к работающему сайту. Существуют и другие классы анализаторов: IAST, интерактивные анализаторы, интегрируемые в код приложения — точные, но тяжелые, MobAST, анализаторы мобильных приложений и другие. Но про них мы сегодня говорить не будем и остановимся на DAST.
Как правило, DAST — это довольно дорогое решение, которое не всегда укладывается в бюджет безопасности компаний. Мы в hh.ru решили проверить, можно ли бесплатно получить работающий DAST, построенный на Open-Source продукте OWASP ZAP (Zed Attack Proxy). В этой статье мы хотим показать, как это можно реализовать и получить полноценные отчеты динамического анализа с подробно описанными потенциальными уязвимостями. Отдельно отметим, что мы не ставим цель сравнить результаты работы с другими платными и бесплатными инструментами.
Очевидные преимущества ZAP:
большие возможности для интеграции и автоматизации;
широкое комьюнити OWASP, хорошая техподдержка и исчерпывающая документация;
запуск краулеров для составления карты приложения;
пассивное (без изменения запросов) и активное (с изменением запросов) сканированием сайта на уязвимости;
генерация отчетов в разных форматах по результатам сканирования;
удобный UI, где можно легко настраивать параметры сканирования;
настройка автоматизации с помощью всего одного yaml-файла.
Об этом способе как раз и пойдет речь сегодня.
Настраиваем конфиг для сканирования
Делается это в 2 этапа и очень удобно (в том числе для новичка) через UI. Подробно про работу с ZAP UI в ручном режиме можно прочитать в этой статье.
Настраиваем скоуп, потому что если мы будем сканировать все подряд, то сканирование может занять дни, а то и недели. Затем аутентификацию — если не настроить её, то сможем тестировать наш сайт только под анонимом.
Открываем окно настройки сессии:
![Default Context – это название нашего скоупа сканирования. Это можно изменить. Default Context – это название нашего скоупа сканирования. Это можно изменить.](https://habrastorage.org/getpro/habr/upload_files/ccb/dad/c25/ccbdadc253a3fcce6bf8b5cdf19a639c.png)
Добавляем эндпоинты, которые будем сканировать в рамках скоупа:
![Точка в конце крайне важна! Она означет все уровни вложенности после указанного эндпоинта. Точка в конце крайне важна! Она означет все уровни вложенности после указанного эндпоинта.](https://habrastorage.org/getpro/habr/upload_files/484/1ee/de6/4841eede6eefdb85443b5b26b1eb0ec8.png)
Настраиваем эндпоинты, которые вдруг решили не сканировать:
Например, это могут быть статические статьи без интерактива, метрики аналитики, или там пока ведется разработка. Также частая причина — наличие большого числа циклических ссылок, которые затянут процесс сканирования.
![Тут тоже точка в конце важна. Она означет все уровни вложенности после указанного эндпоинта. Тут тоже точка в конце важна. Она означет все уровни вложенности после указанного эндпоинта.](https://habrastorage.org/getpro/habr/upload_files/280/ecb/420/280ecb4209b4869c09fb304e1670e228.png)
Заполняем учетные данные, под которыми будем ходить на сайт
Вводим логин, пароль:
![](https://habrastorage.org/getpro/habr/upload_files/b98/d5d/45b/b98d5d45bcfbe8959c6502bed4151864.png)
Обязательно выбираем учетную запись Forced User, чтобы она всегда была в авторизованном состоянии:
![](https://habrastorage.org/getpro/habr/upload_files/a6e/ec1/c53/a6eec1c5397b4098df346e20fbed2f20.png)
Выбираем тип (мы рассмотрим на примере Form-based)
Задаем url, где происходит login
Задаем url, куда нужно пойти GET-ом для того, чтобы собрать csrf-токен (ZAP сам автоматом подставит его вместо secret)
Задаем POST-параметры для аутентификации ({%username%} и {%password%} ZAP подставит из раздела users, который мы заполнили на предыдущем шаге)
![Важно указать xpath или фрагмент html по которому ZAP поймет, что юзер залогинен (например, кнопка “Профиль”) или разлогинен (например кнопка “Войти”) — после этого он сразу залогинит юзера повторно. У многих на форме логина есть капча. Не забываем, что этот вопрос нужно решить отдельно и заранее. Важно указать xpath или фрагмент html по которому ZAP поймет, что юзер залогинен (например, кнопка “Профиль”) или разлогинен (например кнопка “Войти”) — после этого он сразу залогинит юзера повторно. У многих на форме логина есть капча. Не забываем, что этот вопрос нужно решить отдельно и заранее.](https://habrastorage.org/getpro/habr/upload_files/90e/2c4/7b1/90e2c47b1d04276e0aaf9c4aef59cc98.png)
Настраиваем план автоматизации
![](https://habrastorage.org/getpro/habr/upload_files/1f8/22d/3a7/1f822d3a7980495204dd69955d26fca0.png)
Нажимаем + на панели снизу и выбираем Automation, нажимаем “Создать план” и выбираем FullScan. Появляется набор джоб, которые запустятся в автоматическом режиме. Для джоб можно добавлять условия и тесты, которые будут их контролировать.
Важно! Если вы не хотите, чтобы сканированирование занимало дни, а то и недели, рекомендуем ограничивать краулер (spider) по глубине поиска и активное сканирование по времени.
Как вариант можно сделать 2 плана: один для частых быстрых прогонов критической функциональности, а второй полный.
![](https://habrastorage.org/getpro/habr/upload_files/6d7/54e/44e/6d754e44e4ce83e5e1fcdb27b7534e2b.png)
Нажимаем на env и выбираем созданный нами скоуп:
![](https://habrastorage.org/getpro/habr/upload_files/aa6/e70/d84/aa6e70d843bdf61f6df82990044f83d4.png)
Теперь можем запустить прогон для того, чтобы удостовериться, что все работает и настроено правильно:
![](https://habrastorage.org/getpro/habr/upload_files/860/40d/e3b/86040de3b8d0292f884947561e6b1882.png)
Последний штрих – сохранить готовый конфиг:
![](https://habrastorage.org/getpro/habr/upload_files/f06/1ed/00c/f061ed00ce155e6affd80f8c1bdca5bd.png)
Получим yaml-файл, в котором будет только самое нужное. Альтернативно можно конечно же взять полный конфиг и настроить все самим по документации. Но для быстрого старта или пилота мы рекомендуем начать с конфигурации через UI — это и проще, и выглядит логично.
Запускаем сканирование
Теперь можно запускать сканирование через ZAP Automation Framework всего одной строчкой:
docker run -v $(pwd):/zap/wrk/:rw --rm -t owasp/zap2docker-stable zap.sh $1 -cmd -autorun wrk/$2 |
Тут важно отметить, что можно бы и сразу все запустить этой строкой, без указания файла конфига — тогда ZAP использовал бы все настройки по умолчанию. Но, как уже было указано ранее, мы бы не смогли сканировать под авторизованным пользователем, и в режиме "без ограничений" сканирование могло бы занять очень много времени.
В качестве параметров можно передать:
$1: --addonupdate, тогда ZAP автоматически будет скачивать и устанавливать обновления. Можно не передавать
$2: файл yaml конфига. Обязательный параметр
Как можно настроить интеграцию
Мы используем Bamboo CI/CD. Запуск там можно настроить по расписанию. Конфиги лежат на сервере, а все джобы bamboo у нас настроены по ssh:
![](https://habrastorage.org/getpro/habr/upload_files/015/299/0c6/0152990c6c2cf7403a9232638797fd89.png)
После окончания прогона ZAP кладет отчеты в папку. В Bamboo у нас есть отдельная джоба, которая запускает на сервере скрипт выгрузки отчетов в облако. Мы, например, для этого используем Minio:
![](https://habrastorage.org/getpro/habr/upload_files/d9d/08a/76c/d9d08a76c60fe65d43cee444e10a7f5e.png)
Вот как у нас
В заключение покажем, как выглядят отчеты от ZAP на примере полученного нами для hh.ru:
![](https://habrastorage.org/getpro/habr/upload_files/a49/135/7c5/a491357c59d5f3697f66c49ea552bf47.png)
В каждом отчете присутствует:
Список найденных уязвимостей по OWASP Top 10
Подробные описания уязвимостей
Векторы атак, с помощью которых были найдены уязвимости и как их можно воспроизвести
Советы по устранению уязвимостей
К примеру, была найдена вот такая потенциальная SQL-инъекция:
![](https://habrastorage.org/getpro/habr/upload_files/119/52b/344/11952b344a60362d6029b7568789ae4d.png)
При подстановке 1" OR "1"="1" в get-параметр исчезал блок с регионом поиска. Сам факт изменения верстки на сайте — отправная точка для проверки наличия в этом месте реальной SQL-инъекции. К счастью, срабатывание оказалось ложным, но хорошо, что оно было обнаружено при помощи ZAP.