Разделы портала

Онлайн-тренинги

.
Автоматизированное тестирование безопасности с ZAP Python API
06.03.2020 01:00

Автор: Амит Кулкарни (Amit Kulkarni)
Оригинал статьи
Перевод: Ольга Алифанова

Автоматизированное тестирование безопасности с ZAP API может помочь найти уязвимости на ранних стадиях. Инструмент безопасности и API, который тут используется – это OWASP ZAP. OWASP ZAP поможет автоматизировать тесты безопасности для включения их в непрерывную интеграцию/непрерывную поставку (CI/CD) для вашего приложения с использованием существующих функциональных регресс-наборов и ZAP Python API.

Ознакомьтесь с секцией "ссылки", чтобы узнать больше.

Определение тестирования безопасности

Тестирование безопасности – это процесс выявления слабостей в механизмах безопасности приложения, которое защищает данные и поддерживает определенную функциональность. Цель тестирования безопасности – знать о возможных угрозах от SQL-инъекций, межсайтового скриптинга и подвергания важных данных риску. Оно также может помочь защититься от попыток изменить или нарушить доступ к приложению в исполнении неавторизованных пользователей или пользователей с недостаточными правами.

SQL-инъекция – это внедрение запросов, подделывающих данные, в систему. Межсайтовый скриптинг (XSS) – это использование вредоносных скриптов для изменения или модификации нормального трафика от доверенного приложения.

OWASP ZAP

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

Особенности ZAP

ZAP основан на UI на основе Swing [12] для десктопа. У него также внятный rest API для автоматического режима, что означает, что ZAP можно стартовать или разрешить через запуск bat-файла с daemon-флагом, позволяющим запускаться в фоновом режиме.

ZAP работает как паук[13]. Он ползает по сети, исследует определенный сайт и находит ссылки. Пауки делятся на два типа – традиционные и ajax. Ajax-пауки предназначены в основном для JavaScript-приложений. У ZAP два сканера, пассивный и активный, использующиеся для сканирования и поиска уязвимостей.

  • Пассивный сканер отслеживает запросы и ответы и выявляет уязвимости.
  • Активный сканер атакует и манипулирует заголовком для поиска уязвимостей.

Оба сканера можно тонко настраивать. Есть политики сканирования – то есть правила сканирования для активного сканирования. Они легко кодируются, так как в них можно передавать различные параметры конфигурации. Активные политики сканирования можно настраивать через интерфейс:

 

Ниже – пример интерфейса OWASP ZAP UI. На вкладке "Tools option" можно настроить прокси, адрес и порт, которые должен отслеживать ZAP. ZAP работает как прокси-посредник [14], используя концепцию атакующего прокси.

 

Использование ZAP UI

Для начала работы с этим инструментом тестирования безопасности откройте ZAP UI и задайте прокси, адрес и порт. Введите URL приложения для выполнения тестирования безопасности, а затем нажмите на "Attack".

Инструмент UI начнет запуск паука, который изучит все URL и страницы приложения. Затем он проведет пассивное сканирование и воспользуется политикой сканирования по умолчанию, чтобы активное сканирование нашло уязвимости. Отчет о безопасности будет сгенерирован, и его можно просмотреть во вкладке Report.

Как автоматизировать ZAP

Автоматизированное тестирование безопасности требует трех последовательных шагов:

  1. Запустите ZAP через API в daemon-режиме. Он будет работать в фоне как прокси браузера.
  2. Стартуйте регрессионные UI-наборы тестов (заранее созданные через любой инструмент автоматизации), чтобы ZAP работал как прокси для всех URL и страниц, которые открываются регрессионными тестами.
  3. Используйте ZAP API паука для поиска дополнительных страниц, а затем используйте функции сканирования и отчетности ZAP API, чтобы найти уязвимости и сгенерировать отчет о безопасности.

 

Шаг 1. Запуск ZAP в daemon-режиме

 

ZAP запускается через запуск .bat-файла. Этот файл передает конфигурационные параметры daemon.

Схожим образом с UI мы можем задать параметры, передавая, например, информацию о хосте и порте. Прочие параметры тоже можно передавать – например, ‘apikey’. Каждый установленный ZAP UI будет иметь уникальный ключ API, который можно генерировать внутри инструмента на вкладке Options. Для использования ZAP API нужно использовать этот ключ.

Если вы пользуетесь внешним или корпоративным прокси, то разрешается цепочка прокси, и после ее разрешения вы можете определить имя хоста и порт через параметры. Если вам нужна авторизация – нужно передать имя пользователя и пароль.

Используя этот bat-файл, вы можете запустить ZAP в фоновом режиме.

Шаг 2. Запуск функциональных UI-тестов

После старта ZAP запустите функциональные UI-тесты. Для наилучших результатов сканирования важно иметь развернутые регрессионные тесты, глубоко исследующие приложение. Можно использовать тесты, созданные в любом инструменте UI-автоматизации.

Шаг 3. Сканирование и отчетность

Когда регрессионный тест-набор завершен, запустите паука, чтобы найти дополнительные страницы, не покрытые функциональными тестами. Затем все эти страницы и ссылки будут просканированы как активно, так и пассивно, чтобы сгенерировать отчет. Запуск ZAP, паука и сканирования осуществляется через вызовы к ZAP Python API.

Когда ZAP запущен и прокси настроен, например, как localhost:8090, откройте браузер и введите localhost:8090. Откроется интерфейс ZAP API. Тут можно вызывать, например, ‘MaxChildren’, ‘MaxDepth’, как через интерфейс, так и через API. Клиент ZAP API доступен на нескольких языках – например, java, python и nodejs.

 

Установка ZAP Python API

Для получения комплекта Python API установите Python 2.7 или выше с пакетом pip. Pip – это "предпочитаемая программа установки". Это система управления программными пакетами, которая используется для установки и управления пакетами на Python. ZAP Python API можно установить через команду pip install с уточнением версии python-owasp-zap, как описано здесь.

ZAP Python API - Импорт

 

Когда пакет ZAP Python установлен, его можно импортировать так:

`from zapv2 import ZAPv2`

Схожим образом настройте целевой URL для сканирования и задайте ключ API, хост и порт через прокси.

`zap.urlopen(target)` - запрашивает прокси url через zap.

ZAP Python API – Паук

 

Настроив прокси, сделайте простой вызов паука через API, ‘zap.spider.scan’, и передайте нужные параметры интерфейса. API принимает все параметры – например, ‘url’, ‘apikey’, ‘MaxDepth’, ‘MaxChildren’.

Когда API паука вызван, он подождет завершения, вызывая статус. Когда статус будет равен 100, процесс паука завершен. Паук не сканирует – он ползает по веб-приложению и изучает ссылки, источники, якоря в HTML, JS, CSS, и добавляет их в дерево источника, создавая иерархичную структуру данных. Затем это дерево сканируется пассивным или активным сканером для анализа уязвимостей.

ZAP Python API – Пассивное сканирование

 

Схожим образом API пассивного сканера вызывается через ‘zap.pscan.records_to_scan’. Этот API ждет, пока не просканируются все записи. Пассивный сканер просто смотрит на запросы и ответы, ничего не вызывая самостоятельно. Он хорош для поиска таких проблем, как отсутствующие заголовки безопасности или анти-CSRF токены (межсайтовая подделка запроса, CSRF – это атака, которая заставляет конечного пользователя выполнять нежелательные действия в приложении). Однако этот способ не годится для поиска уязвимостей вроде XSS, требующих отправки вредоносных запросов. Это задача активного сканера.

ZAP Python API – Активное сканирование

 

Как и паук, активный сканер вызывается через APi ‘zap.ascan.scan’, который стартует процесс активного сканирования. Когда этот API вызван, он ждет завершения процесса, смотря на статус. Активное сканирование завершено при статусе 100. Активный сканер выполняет широкий спектр атак. Его политики можно настроить так же, как и в интерфейсе. Активное сканирование – реальная атака, которая может поставить цель под угрозу, поэтому не пользуйтесь им в отношении целей, которые вам не разрешали тестировать.

ZAP Python API – Отчетность

 

После того, как паук и сканеры завершили работы, вызовите отчет через ‘zap.core.htmlreport’ и передачу параметра ‘apikey’. Отчет можно сгенерировать в форматах HTML и XML.

Типичный отчет ZAP

 

Вот так выглядит типичный отчет ZAP. Он упоминает такие вещи, как Уровни Риска и количество предупреждений, ассоциированных с ними. В разделе деталей он перечисляет поставленные под угрозу URL и возможные решения.

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

Топ-10 рисков безопасности приложений

 

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

ZAP Python API : выход

 

Когда отчет готов, ZAP можно закрыть через ‘zap.core.shutdown’, что заставит ZAP выйти из режима daemon, и он перестанет слушать браузер.

Преимущества автоматизированного тестирования безопасности

Ранний поиск уязвимостей в цикле разработки помогает команде снизить проблемы и издержки безопасности. Как любая тест-стратегия Agile, тестирование безопасности должно быть встроено в непрерывную интеграцию и цикл разработки для поиска и предотвращения базовых уязвимостей. Это позволяет тестировщикам безопасности работать над более критичными проблемами. Это не убирает нужду в дополнительном тестировании безопасности, или тестированием при помощи третьей стороны, но оно может послужить системой раннего предупреждения, пока продукт еще в разработке.

Ссылки

О деталях ZAP UI можно узнать здесь. Существует множество клиентов ZAP API на Java, Python, Node.js, PHP и Ruby, при этом только Java, Python и Node.js – официальные клиенты. Я выбрал Python, так как он хорошо поддерживается, и судя по рейтингу GitHub, наиболее популярен. Существует статья, описывающая автоматизированное тестирование безопасности на ruby.

  1. https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project
  2. https://github.com/zaproxy/zaproxy
  3. https://github.com/zaproxy/zaproxy/wiki/ApiDetails
  4. https://github.com/zaproxy/zap-api-python
  5. https://github.com/AmitKulkarni9/AutomatedSecurity_PenetrationTesting
  6. https://www.swtestacademy.com/automated-security-testing-using-zap
  7. https://github.com/zaproxy/zap-api-java
  8. https://github.com/zaproxy/zap-api-nodejs
  9. https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf
  10. http://www.locateqa.com/wp-content/uploads/2018/06/Untitled-3-9.jpg
  11. https://galilsoftware.com/wp-content/uploads/2015/05/Continuous-Integration.png
  12. https://en.wikipedia.org/wiki/Swing_(Java)
  13. https://en.wikipedia.org/wiki/Web_crawler
  14. https://www.owasp.org/index.php/Man-in-the-middle_attack

Обсудить в форуме