среда, 4 октября 2017 г.

Функциональные тесты превращаются... в тестирование на SQL инъекции!

Всем привет,

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

В чем преимущества:
  1. Для такой сессии тестирования вам потребуется только настроить тестовое окружение и запустить все функциональные тесты, после чего можно приступать к сканированию на SQL-инъекции. Это не потребует особой квалификации и больше чем несколько часов для подготовки. Вы можете сделать это прямо сегодня!
  2. Используем только бесплатные компоненты с открытым исходным кодом.

И так, начнем.
  1. Скачиваем и распаковываем SQLmap:
  1. Скачиваем и устанавливаем Burb Proxy:
  1. Запускаем Burb Suite, он запустит прокси на порту 8080 (по умолчанию, в UI это можно изменить).

В Burb proxy на вкладке Intercept не забываем выключить Intercept, чтобы он не захватывал запросы, а просто логировал их.

  1. Настраиваем прокси на Linux хосте, откуда будем запускать тесты, для этого вбиваем в bash консоль такие команды:
export HTTP_PROXY=127.0.0.1:8080
export HTTPS_PROXY=127.0.0.1:8080
здесь 127.0.0.1 - адрес Burb Proxy, 8080 - порт, который слушает прокси. Если вы запускаете прокси на одной машинке, а тесты запускате с другой машинки, тогда вам надо изменить эти параметры. В моем примере все компоненты работают на одной и той же машинке.
  1. Запускаем наши автоматические тесты (у меня тесты написаны на PyTest, но это могут быть так же любые другие тесты, главное - убедитесь, что ваши тесты отправляют запросы через прокси - в Burb UI на вкладке Proxy > HTTP History должны появиться новые записи):
pytest -n 30 tests/lbs
  1. Переключаемся обратно на Burb UI, переходим на вкладку Target > Site Map, щелкаем правой кнопкой мыши на адрес, куда обращались наши автоматизированные тесты (для каждого тестируемого сервиса здесь будет отдельная строка). В выпадающем меню выбираем пункт 'Save Selected Items' и сохраняем все это в файл test001.txt.
  1. Переходим в дирректорию с sqlmap и запускаем сканирование:
./sqlmap.py --batch -l test001.txt
Опция --batch заставляем sqlmap сканировать все, что дали, не спрашивая на каждом шаге подтверждение от пользователя, опция -l указывает SQLmap, что надо брать список "целей" из файла с логами от прокси сервера.

Если вы тестируете не production окружение, то лучше запустить так (это увеличит список проверок, которые сделает SQLmap):
./sqlmap.py --batch --level 5 --risk 3 -l test001.txt
  1. Анализируем всё, что выдаст нам SQLmap, открываем баг трекер и записываем результаты эксперимента ;)

Небольшой совет №1:
Создайте различные сущности в своем сервисе и сделайте тесты, которые будут их читать / изменять, чтобы в список запросов попали запросы работы с существующими в системе ресурсами. Если ваши тесты полностью очищают после себя все ресурсы SQLmap будет сложно найти уязвимости, ведь на многие запросы он получит 400/404 ошибки просто потому что этих ресурсов и ссылок уже не существует.

Небольшой совет №2:
Почитайте вывод команды
./sqlmap.py --hh
Для тех, кто предпочитает делать все через UI - есть возможность установить sqlmap плагин прямо в Burb Proxy (хотя для этого потребуется поставить всякие зависимости, за то красиво):