Рубрики
Без рубрики

Тестирование веб-безопасности с помощью OWASP ZAP и Selenium

Вы когда-нибудь задумывались, как мы на самом деле можем находить уязвимости в веб-приложениях? Там … Помечено как безопасность, тестирование, selenium, java.

Вы когда-нибудь задумывались, как мы на самом деле можем находить уязвимости в веб-приложениях? Существуют рекомендации глобальных организаций по обеспечению безопасности, которым могут следовать эксперты по безопасности о том, как эффективно выполнять тесты на проникновение и безопасность в вашем приложении. Чтобы ознакомиться с топ-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”