Что такое OWASP ZAP?

OWASP ZAP (Zed Attack Proxy) — это open-source инструмент для динамического тестирования безопасности веб-приложений (DAST). ZAP помогает находить уязвимости безопасности в веб-приложениях во время их работы и является одним из самых популярных инструментов для penetration testing.

Основные возможности OWASP ZAP

  • Автоматическое сканирование — поиск уязвимостей без настройки
  • Пассивное сканирование — анализ трафика без активного воздействия
  • Активное сканирование — проведение атак для поиска уязвимостей
  • Spider/Crawler — автоматическое обнаружение страниц приложения
  • Fuzzing — тестирование с помощью случайных данных
  • API тестирование — поддержка REST API и GraphQL
  • Интеграция в CI/CD — автоматизация security тестирования

Установка OWASP ZAP

 1# Установка через пакетный менеджер
 2# Ubuntu/Debian
 3sudo apt update
 4sudo apt install zaproxy
 5
 6# Или скачать с официального сайта
 7wget https://github.com/zaproxy/zaproxy/releases/download/v2.12.0/ZAP_2_12_0_unix.sh
 8chmod +x ZAP_2_12_0_unix.sh
 9./ZAP_2_12_0_unix.sh
10
11# Docker версия
12docker pull owasp/zap2docker-stable
13docker run -u zap -p 8080:8080 -i owasp/zap2docker-stable zap-webswing.sh

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

 1# Запуск ZAP в headless режиме
 2zap.sh -daemon -host 0.0.0.0 -port 8080
 3
 4# Быстрое сканирование URL
 5zap-baseline.py -t http://example.com
 6
 7# Полное сканирование
 8zap-full-scan.py -t http://example.com
 9
10# API сканирование
11zap-api-scan.py -t http://example.com/openapi.json

Интеграция с CI/CD

 1# GitLab CI пример
 2security_scan:
 3  stage: security
 4  image: owasp/zap2docker-stable
 5  script:
 6    - mkdir -p /zap/wrk
 7    - zap-baseline.py -t $CI_ENVIRONMENT_URL -J zap-report.json
 8  artifacts:
 9    reports:
10      junit: zap-report.json
11    paths:
12      - zap-report.json
13  allow_failure: true

GitHub Actions интеграция

 1# .github/workflows/security.yml
 2name: Security Scan
 3on:
 4  push:
 5    branches: [ main ]
 6  pull_request:
 7    branches: [ main ]
 8
 9jobs:
10  zap_scan:
11    runs-on: ubuntu-latest
12    name: OWASP ZAP Scan
13    steps:
14      - name: Checkout
15        uses: actions/checkout@v3
16
17      - name: ZAP Scan
18        uses: zaproxy/action-baseline@v0.7.0
19        with:
20          target: 'https://example.com'
21          rules_file_name: '.zap/rules.tsv'
22          cmd_options: '-a'

Настройка правил сканирования

 1# .zap/rules.tsv - файл правил
 2# IGNORE - игнорировать правило
 3# WARN - предупреждение
 4# FAIL - ошибка
 5# INFO - информация
 6
 710021	WARN	(X-Content-Type-Options Header Missing)
 810020	IGNORE	(X-Frame-Options Header Not Set)
 910016	IGNORE	(Web Browser XSS Protection Not Enabled)
1010017	IGNORE	(Cross-Domain JavaScript Source File Inclusion)

API тестирование с ZAP

 1# Python скрипт для API тестирования
 2from zapv2 import ZAPv2
 3
 4# Подключение к ZAP
 5zap = ZAPv2(proxies={'http': 'http://127.0.0.1:8080', 
 6                    'https': 'http://127.0.0.1:8080'})
 7
 8# Импорт OpenAPI спецификации
 9zap.openapi.import_url('http://example.com/openapi.json')
10
11# Запуск spider
12zap.spider.scan('http://example.com')
13
14# Активное сканирование
15zap.ascan.scan('http://example.com')
16
17# Получение результатов
18alerts = zap.core.alerts()
19for alert in alerts:
20    print(f"Alert: {alert['alert']}")
21    print(f"Risk: {alert['risk']}")
22    print(f"URL: {alert['url']}")
23    print("---")

Настройка аутентификации

 1# Настройка form-based аутентификации
 2zap = ZAPv2()
 3
 4# Настройка контекста
 5context_name = "MyApp"
 6context_id = zap.context.new_context(context_name)
 7
 8# Добавление URL в контекст
 9zap.context.include_in_context(context_name, "http://example.com.*")
10
11# Настройка аутентификации
12auth_method_name = "formBasedAuthentication"
13login_url = "http://example.com/login"
14login_request_data = "username={%username%}&password={%password%}"
15
16zap.authentication.set_authentication_method(
17    context_id, auth_method_name, 
18    f"loginUrl={login_url}&loginRequestData={login_request_data}"
19)
20
21# Добавление пользователя
22user_name = "testuser"
23zap.users.new_user(context_id, user_name)
24zap.users.set_authentication_credentials(
25    context_id, user_name, "username=admin&password=password"
26)

Создание custom скриптов

 1// ZAP Script для custom проверок
 2// Passive scan script пример
 3function scan(ps, msg, src) {
 4    var url = msg.getRequestHeader().getURI().toString();
 5    var body = msg.getResponseBody().toString();
 6    
 7    // Проверка на наличие debug информации
 8    if (body.indexOf("DEBUG") !== -1) {
 9        ps.raiseAlert(
10            1,  // risk: High=3, Medium=2, Low=1, Info=0
11            1,  // confidence: High=3, Medium=2, Low=1
12            "Debug Information Disclosure",
13            "Debug information found in response",
14            url,
15            "",
16            "",
17            "Remove debug information from production",
18            body,
19            msg
20        );
21    }
22}

Генерация отчетов

 1# HTML отчет
 2zap-cli --zap-url http://localhost:8080 report -o zap-report.html -f html
 3
 4# JSON отчет
 5zap-cli --zap-url http://localhost:8080 report -o zap-report.json -f json
 6
 7# XML отчет
 8zap-cli --zap-url http://localhost:8080 report -o zap-report.xml -f xml
 9
10# Отчет через Python API
11import json
12from zapv2 import ZAPv2
13
14zap = ZAPv2()
15alerts = zap.core.alerts()
16
17with open('security-report.json', 'w') as f:
18    json.dump(alerts, f, indent=2)

Интеграция с Jenkins

 1// Jenkinsfile
 2pipeline {
 3    agent any
 4    
 5    stages {
 6        stage('Security Scan') {
 7            steps {
 8                script {
 9                    // Запуск ZAP в Docker
10                    sh '''
11                        docker run -v $(pwd):/zap/wrk/:rw \
12                            -t owasp/zap2docker-stable \
13                            zap-baseline.py \
14                            -t http://example.com \
15                            -J zap-report.json
16                    '''
17                }
18            }
19            post {
20                always {
21                    // Публикация результатов
22                    publishHTML([
23                        allowMissing: false,
24                        alwaysLinkToLastBuild: true,
25                        keepAll: true,
26                        reportDir: '.',
27                        reportFiles: 'zap-report.html',
28                        reportName: 'ZAP Security Report'
29                    ])
30                }
31            }
32        }
33    }
34}

Best Practices для ZAP

  • Используй пассивное сканирование для production окружений
  • Настрой правила исключений для ложных срабатываний
  • Интегрируй в CI/CD для регулярного тестирования
  • Комбинируй с SAST для полного покрытия безопасности
  • Используй аутентификацию для тестирования защищенных областей
  • Регулярно обновляй ZAP и его правила

Когда использовать OWASP ZAP

  • Тестирование безопасности веб-приложений
  • Penetration testing и security аудит
  • Интеграция security тестирования в CI/CD
  • Обучение и изучение веб-безопасности
  • Compliance требования (PCI DSS, OWASP Top 10)
  • API security тестирование

Преимущества OWASP ZAP

  • Бесплатность — полностью open-source решение
  • Простота использования — интуитивный интерфейс
  • Активное сообщество — регулярные обновления и поддержка
  • Гибкость — множество способов интеграции
  • Расширяемость — поддержка custom скриптов
  • Стандарты — следует OWASP рекомендациям

Альтернативы OWASP ZAP

  • Burp Suite — коммерческий инструмент для pen testing
  • Acunetix — автоматизированный web vulnerability scanner
  • Nessus — comprehensive vulnerability scanner
  • Nikto — web server scanner
  • w3af — web application attack and audit framework
  • Arachni — web application security scanner

FAQ

Можно ли использовать ZAP на production?

Активное сканирование может нарушить работу приложения. Используй пассивное сканирование или тестируй на копии production окружения.

Как избежать ложных срабатываний?

Настрой файл правил (.zap/rules.tsv) для игнорирования известных ложных срабатываний и адаптируй сканирование под твое приложение.

Подходит ли ZAP для API тестирования?

Да, ZAP отлично поддерживает REST API, GraphQL и может импортировать OpenAPI/Swagger спецификации для автоматического тестирования.