Вы когда-нибудь задумывались, как мы на самом деле можем находить уязвимости в веб-приложениях? Существуют рекомендации глобальных организаций по обеспечению безопасности, которым могут следовать эксперты по безопасности о том, как эффективно выполнять тесты на проникновение и безопасность в вашем приложении. Чтобы ознакомиться с топ-10 уязвимостей, обратитесь к OWASP Top 10 Risks
Введение в тестирование безопасности
В сообществе разработчиков программного обеспечения существует множество сканеров, коммерческих или с открытым исходным кодом, которые дают возможность тестировщикам на проникновение и инженерам по безопасности сканировать свои приложения на наличие известных уязвимостей.
Теперь большинство сканеров поддерживают CI/CD и хорошо работают бок о бок с Selenium, который является инструментом, имитирующим действия пользователя в наших браузерах.
Прокси-сервер атаки OWASP Zed (ZAP)
Прокси-сервер OWASP Zed Attack Proxy (ZAP) является одним из самых популярных бесплатных инструментов безопасности в мире и активно поддерживается сотнями международных добровольцев. Это может помочь вам автоматически находить уязвимости безопасности в ваших веб-приложениях во время разработки и тестирования ваших приложений. Это также отличный инструмент для опытных тестировщиков пера, который можно использовать для ручного тестирования безопасности.
Цель
Использовать OWASP ZAP для обнаружения уязвимостей веб-приложений в конвейере CI/CD
Проблема
Веб-приложения имеют базовую аутентификацию, Логины пользователей и проверку формы, которая останавливает сканер на полпути
Решение
Используйте тестовые сценарии Selenium для управления ZAP. Проект может уже включать в себя сценарии selenium для функционального тестирования. Активные проверки активно изменяют записанные запросы и ответы для определения дальнейших уязвимостей
Настройка CI/CD
Давайте создадим конвейер CI, который запустит ZAP в безголовом режиме, запустим наши функциональные тесты, которые будут выполнять два типа сканирования (активное/пассивное), сохранят результаты предупреждений о сканировании в отчетах HTML и отключат сервер.
Шаги CI/CD:
- Начать ЗАП
- Запуск скриптов Selenium (Пассивное сканирование)
- Дождитесь завершения пассивного сканирования
- Начать Активное Сканирование
- Дождитесь завершения активного сканирования
- Получать оповещения и сообщать
Установка OWASP ZAP
OWASP ZAP может быть установлен несколькими способами, но мы предпочитаем использовать Docker, который является самым простым способом запуска сервера.
stage('OWASP ZAP setup'){ sh "docker pull owasp/zap2docker-stable" sh "docker run --rm -d -u zap --name zap -p 4449:4449 -i owasp/zap2docker-stable zap.sh # A start up script provided by ZAP -daemon # Start in a headless configuration -host 0.0.0.0 # The ZAP host -port 4449 # The ZAP port -config api.addrs.addr.name=.* -config api.addrs.addr.regex=true # Allow any source IP to connect -config api.key=testypon" # Api key to be used }
Теперь, когда мы запустили ZAP в безголовом режиме, перейдя к localhost в порту 4449, вы сможете увидеть:
Интеграция с WebDriver
Давайте посмотрим, как мы можем интегрировать SAP с вашим экземпляром WebDriver, который будет управлять взаимодействием пользователя с нашим приложением:
DesiredCapabilities caps = new DesiredCapabilities(); Proxy proxy = new Proxy(); proxy.setProxyType(Proxy.ProxyType.PAC); StringBuilder strBuilder = new StringBuilder(); strBuilder .append("http://localhost:4449") .append() .append(zapApiKey); proxy.setProxyAutoconfigUrl(strBuilder.toString()); caps.setCapability(CapabilityType.PROXY, proxy);
Теперь передайте возможности в вашем объекте WebDriver, как обычно, для перехвата трафика из ZAP. Если в целевом веб-приложении установлены заголовки ответов безопасности, в частности Strict-Transport-Security, WebDriver должен быть настроен следующим образом:
caps.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); caps.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
Пассивное сканирование
Пассивное сканирование записывает запросы и ответы, отправленные в веб-приложение, и создает предупреждения об обнаруженных уязвимостях. Также они запускаются всякий раз, когда мы получаем доступ к приложению из WebDriver.
Активное сканирование
Активные проверки активно изменяют записанные запросы и ответы для определения дальнейших уязвимостей приложения.
ZAP API в Selenium
По соображениям простоты мы создали драйвер (оболочку для фактического ZAP API) под названием ZAP Driver, который сопоставляется со всеми необходимыми вызовами API из наших скриптов selenium и будет управлять выполнением сканирований. Давайте посмотрим на наиболее необходимую функцию для сканирования:
Сначала добавьте свои зависимости в тестовый проект:
org.zaproxy zap-clientapi ${zapapi.version}
Теперь давайте создадим наш ZAPDriver, чтобы начать взаимодействовать с функциями API:
@Service @Profile("Security") public class ZapDriver implements Spider, ScanningProxy, ContextModifier, Authentication { @Value("${zap.enabled:false}") private boolean zap; @Value("${zap.host:}") private String zapHost; @Value("${zap.base.url}") private String zapBaseUrl; @Value("${zap.port:0000}") private int zapPort; @Value("${zap.api.key}") String zapApiKey; private static final String MINIMUM_ZAP_VERSION = "2.6"; // Weekly builds are also allowed. private ClientApi clientApi; @PostConstruct public void initializeScanner() { this.clientApi = new ClientApi(zapHost, zapPort, zapApiKey); this.secData = new SecurityData(); validateMinimumRequiredZapVersion(); setAttackMode(); }
На этапе постконструкции объекта мы инициализируем экземпляр клиентского API для выполнения необходимых HTTP-вызовов ZAP из наших тестов
Шаг 1: Включить сканер Теперь, если вы включите пассивные или активные сканеры, вы можете сделать это разными способами. Вы можете найти имя политики сканера в API и использовать идентификатор для включения определенных сканеров, например (SQL-инъекция или межсайтовый скриптинг), но для простоты мы можем включить все сканеры и получить единый отчет с различными категориями предупреждений:
@Override public void enableAllScanners() throws ProxyException { try { clientApi.pscan.setEnabled("true"); ApiResponse response = clientApi.ascan.enableAllScanners(null); log.trace(String.format("ZAP OK response for api call %s!!!", response.getName())); } catch (ClientApiException e) { throw new ProxyException(e); } }
Вышесказанное позволит включить все активные сканеры, и у вас также есть еще один вызов, если вы хотите включить также все пассивные сканеры
Шаг 2: Плетение пауков Spider – это интернет-бот, который систематически просматривает Всемирную паутину, как правило, с целью веб-индексации (веб-паутины).
@Override public void spider(String url) { try { ApiResponse response = clientApi.spider.scan(url, null, null, null, null); log.trace(String.format("ZAP OK response for api call %s!!!", response.getName())); } catch (ClientApiException e) { log.error("Exception trying to spider " + e.getDetail()); } } @Override public void excludeFromSpider(String regex) { try { ApiResponse response = clientApi.spider.excludeFromScan(regex); log.trace(String.format("ZAP OK response for api call %s!!!", response.getName())); } catch (ClientApiException e) { throw new ProxyException(e); } }
Вы также можете исключить URL-адреса сторонних поставщиков, которые вы не хотите использовать, чтобы ускорить процесс обхода и выдавать действительные предупреждения для вашего приложения.
Шаг 3: Сканирование После запуска вашего приложения вам необходимо выполнить сканирование для сбора наших оповещений на основе политики, включенной ранее для сканеров
@Override public void scan(String url) throws ProxyException { try { ApiResponse response = clientApi.ascan.scan(url, "true", "false", null, null, null); log.trace(String.format("ZAP OK response for api call %s!!!", response.getName())); } catch (ClientApiException e) { throw new ProxyException(e); } }
Отлично!!!
Совет: Будьте осторожны, чтобы время сканирования для каждого приложения было разным. Вам необходимо настроить тайм-аут сканирования/паука в соответствии с вашими потребностями
Шаг 4: Отчет
После завершения сканирования нам нужно создать отчет для оповещений и сохранить его на нашем сервере CI.
byte[] htmlReport = scanner.getHtmlReport() Path pathToFile = Paths.get(path) Files.createDirectories(pathToFile.getParent()) Files.write(pathToFile, htmlReport) allureService.html(pathToFile.toFile(),"OWASP ZAP Report") @Override public byte[] getHtmlReport() throws ProxyException { try { return clientApi.core.htmlreport(); } catch (ClientApiException e) { throw new ProxyException(e); } }
Теперь в отчете, например, будут обобщены все предупреждения с описанием и возможными решениями, предоставленными организацией OWASP ZAP:
Вывод
SecDevOps – это философия интеграции методов обеспечения безопасности в рамках процесса DevOps. SecDevOps предполагает создание культуры “Безопасность как код” с постоянным гибким сотрудничеством между инженерами по выпуску и командами безопасности. Существует множество инструментов и платформ, которые можно использовать в циклах выпуска вашего приложения, и мы рассмотрели, как использовать самый известный инструмент с открытым исходным кодом.
Оригинал: “https://dev.to/giannispapadakis/web-security-testing-with-owasp-zap-and-selenium-3gf5”