Что такое OWASP ZAP?

OWASP (как обсуждается в Penetration Testing Basics for QA Testers) Zed Attack Proxy (ZAP) — самый популярный бесплатный инструмент тестирования безопасности в мире, активно поддерживаемый сообществом OWASP. Для QA-инженеров ZAP предоставляет автоматизированное сканирование безопасности для обнаружения уязвимостей вроде SQL (как обсуждается в Security Testing for QA: A Practical Guide) injection, XSS и небезопасных конфигураций до того, как они попадут в продакшен.

Почему ZAP для QA?

  • Бесплатный и Open Source - Без лицензионных затрат, полный доступ к функциям
  • Легко Автоматизировать - CLI, Docker, API для интеграции CI/CD
  • Комплексное Сканирование - Активное/пассивное сканирование, spidering, fuzzing
  • Тестирование API - Поддержка OpenAPI/Swagger, тестирование GraphQL
  • Обширная Отчетность - HTML, JSON, XML отчеты с рекомендациями по исправлению
  • Активное Сообщество - Регулярные обновления, плагины, marketplace

Режимы Сканирования ZAP

1. Пассивное Сканирование

Анализирует HTTP трафик без отправки дополнительных запросов. Безопасно запускать в продакшене.

# Запустить ZAP в daemon режиме
docker run -u zap -p 8080:8080 owasp/zap2docker-stable zap.sh -daemon \
  -host 0.0.0.0 -port 8080 -config api.disablekey=true

# Получить доступ к target через ZAP proxy
curl -x http://localhost:8080 https://example.com

# Сгенерировать отчет пассивного сканирования
curl "http://localhost:8080/JSON/core/action/jsonreport/"

Пассивное Сканирование Обнаруживает:

  • Отсутствующие security headers (CSP, X-Frame-Options, HSTS)
  • Небезопасные cookies (отсутствуют флаги HttpOnly, Secure)
  • Раскрытие информации (stack traces, комментарии в коде)
  • Устаревшие библиотеки и фреймворки

2. Активное Сканирование

Отправляет атакующие payloads для поиска уязвимостей. Использовать только на авторизованных целях.

# Spider target для обнаружения URL
docker run owasp/zap2docker-stable zap-baseline.py \
  -t https://example.com \
  -r report.html

# Полное активное сканирование
docker run owasp/zap2docker-stable (как обсуждается в [SQL Injection and XSS: Finding Vulnerabilities](/blog/sql-injection-xss)) zap-full-scan.py \
  -t https://example.com \
  -r full-report.html \
  -z "-config api.disablekey=true"

Активное Сканирование Обнаруживает:

  • SQL Injection
  • Cross-Site Scripting (XSS)
  • Path Traversal
  • Remote Code Execution
  • XML External Entity (XXE)
  • Server-Side Request Forgery (SSRF)

3. Сканирование API

Тестирование REST API используя спецификации OpenAPI/Swagger.

# Импортировать OpenAPI spec и сканировать
docker run -v $(pwd):/zap/wrk:rw owasp/zap2docker-stable \
  zap-api-scan.py \
  -t https://api.example.com \
  -f openapi \
  -d /zap/wrk/openapi.json \
  -r /zap/wrk/api-report.html

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

GitHub Actions

# .github/workflows/security-scan.yml
name: OWASP ZAP Security Scan

on:
  pull_request:
    branches: [main]

jobs:
  zap_scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Build application
        run: docker-compose up -d

      - name: ZAP Baseline Scan
        uses: zaproxy/action-baseline@v0.7.0
        with:
          target: 'http://localhost:3000'
          rules_file_name: '.zap/rules.tsv'

      - name: Upload ZAP Report
        uses: actions/upload-artifact@v3
        with:
          name: zap-report
          path: report_html.html

Кастомные Политики Сканирования

Конфигурация rules.tsv

# Игнорировать ложные срабатывания
10021	IGNORE	(CSP: Wildcard Directive)
10038	IGNORE	(Content Security Policy Header Not Set)

# Fail на конкретных уязвимостях
40012	FAIL	(Cross Site Scripting - Reflected)
90018	FAIL	(SQL Injection)

# Предупреждение на средней серьезности
10054	WARN	(Cookie Without SameSite Attribute)

Интерпретация Результатов

Уровни Риска

РискОписаниеТребуемое Действие
ВысокийКритические уязвимости (SQL Injection, RCE)Исправить немедленно
СреднийЗначительные проблемы (XSS, слабая крипто)Исправить перед релизом
НизкийМинорные проблемы (отсутствующие headers)Исправить когда возможно

Частые Уязвимости и Исправления

SQL Injection:

# Уязвимо
query = f"SELECT * FROM users WHERE id = {user_input}"

# Исправлено - Использовать параметризованные запросы
cursor.execute("SELECT * FROM users WHERE id = ?", (user_input,))

XSS:

// Уязвимо
document.getElementById('output').innerHTML = userInput;

// Исправлено - Экранировать вывод
document.getElementById('output').textContent = userInput;

Отсутствующие Security Headers:

# Добавить в nginx.conf
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'";

Заключение

OWASP ZAP необходим для интеграции тестирования безопасности в QA workflows. От автоматизированных CI/CD сканов до комплексного тестирования API, ZAP помогает идентифицировать уязвимости рано, когда их дешевле всего исправить.

Ключевые Выводы:

  • Начинайте с baseline сканов в CI/CD
  • Используйте пассивное сканирование для мониторинга продакшена
  • Реализуйте кастомные политики для вашей толерантности к риску
  • Автоматизируйте аутентификацию для сканирования с авторизацией
  • Отслеживайте уязвимости во времени
  • Исправляйте высокие/критические проблемы немедленно