DAST: динамическое тестирование безопасности приложения
DAST (Dynamic Application Security Testing) тестирует работающее приложение — атакует как внешний злоумышленник. Находит уязвимости, которые SAST не видит: неправильная конфигурация сервера, runtime-уязвимости, проблемы с аутентификацией.
OWASP ZAP
# Baseline scan: быстрая проверка (5-10 минут)
docker run --rm \
-v $(pwd)/reports:/zap/wrk:rw \
ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py \
-t https://staging.mysite.com \
-r zap-baseline-report.html \
-J zap-baseline-report.json \
-l WARN # Только WARNING и выше
# Full scan: активное сканирование (30-60 минут)
docker run --rm \
-v $(pwd)/reports:/zap/wrk:rw \
ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py \
-t https://staging.mysite.com \
-r zap-full-report.html \
-J zap-full-report.json
# API scan: тестирование по OpenAPI спецификации
docker run --rm \
-v $(pwd)/reports:/zap/wrk:rw \
ghcr.io/zaproxy/zaproxy:stable \
zap-api-scan.py \
-t https://api.staging.mysite.com/openapi.json \
-f openapi \
-r zap-api-report.html
GitHub Actions: ZAP в CI/CD
# .github/workflows/dast.yml
name: DAST
on:
push:
branches: [main]
schedule:
- cron: '0 2 * * 1' # Еженедельно в 2:00
jobs:
zap-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Start application
run: |
docker compose -f docker-compose.test.yml up -d
sleep 30 # Ждём старта
- name: Run ZAP Baseline Scan
uses: zaproxy/[email protected]
with:
target: http://localhost:3000
rules_file_name: .zap/rules.tsv
cmd_options: '-a' # Активное сканирование
- name: Upload ZAP report
uses: actions/upload-artifact@v4
if: always()
with:
name: zap-report
path: report_html.html
- name: Stop application
if: always()
run: docker compose -f docker-compose.test.yml down
# .zap/rules.tsv: настройка правил (WARN/IGNORE/FAIL)
# rule_id action reason
10017 WARN # X-Frame-Options header — предупреждение
10038 WARN # Content Security Policy — предупреждение
40012 FAIL # Cross Site Scripting — критично
40018 FAIL # SQL Injection — критично
90011 IGNORE # Charset mismatch — игнорируем
Nuclei: сканирование по шаблонам CVE
# Установка
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Обновление шаблонов
nuclei -update-templates
# Сканирование по критическим уязвимостям
nuclei -u https://staging.mysite.com \
-severity critical,high \
-tags cve,owasp \
-o nuclei-results.txt \
-json-export nuclei-results.json
# Сканирование по категории
nuclei -u https://staging.mysite.com \
-tags sqli,xss,ssrf,rce \
-rate-limit 50 \
-timeout 10
Burp Suite: ручное тестирование
# Burp Suite API: запуск scan через REST API
import requests
BURP_API = "http://localhost:1337/v0.1"
# Создаём новый scan
response = requests.post(f"{BURP_API}/scan", json={
"urls": ["https://staging.mysite.com"],
"scope": {
"include": [{"rule": "https://staging.mysite.com/.*"}],
},
"scan_configurations": [
{"name": "Crawl and Audit - Balanced"}
]
})
scan_id = response.json()["task_id"]
print(f"Scan ID: {scan_id}")
DAST для API: правила
DAST особенно важен для API:
- Тестирование авторизации: доступ к чужим ресурсам (IDOR)
- Injection через все input points
- Business logic flaws (обход ограничений)
# Платформа для API security testing
# OWASP ZAP + Postman Collection
zap-cli --port 8090 start
zap-cli --port 8090 open-url https://api.staging.mysite.com
zap-cli --port 8090 spider https://api.staging.mysite.com
zap-cli --port 8090 active-scan https://api.staging.mysite.com
zap-cli --port 8090 report -o api-security-report.html -f html
DAST проводится на staging-среде, не на production. Активное сканирование создаёт нагрузку и может изменять данные.
Настройка DAST pipeline с ZAP в GitHub Actions — 1–2 рабочих дня.







