Салют 👋,
Данная лабораторная работа посвящена динамическому анализу безопасности web‑приложений DAST с использованием OWASP ZAP. Вы развернёте уязвимое приложение в Docker, проведете ручное тестирование по инструкции для понимания принципа и логики работы, далее выполните автоматическое сканирование, проанализируете отчёт и опишете уязвимости как и каким образом они реализуются. Аналогично вы проанализируете риски ИБ и предложите меры защиты, внесете необходимые исправления.
Для сдачи данной работы также будет требоваться ответить на дополнительные вопросы по описанным темам.
lab08
├── dast
│ ├── convert_reports.py
│ ├── zap_scan.sh
│ └── zap-baseline.conf
├── docker-compose.yml
├── README.md
├── requirements.txt
└── vulnerable-app
├── app.py
├── Dockerfile
├── files
│ └── secret.txt
└── requirements.txt- DAST Dynamic Application Security Testing обеспечивает тестирование «чёрного ящика», когда сканер не знает исходного кода и взаимодействует с приложением как внешний клиент:
- Отправляет
HTTP‑запросы - Анализирует ответы
- Пытается воспроизвести реальные атаки
XSS,SQLi, уязвимости в заголовках, слабую авторизацию и т.д.
- Отправляет
В отличие от
SAST/SCA, здесь обязательно нужно живое, запущенное приложение (стенд), к которому есть сетевой доступ и разрешить доступ сканеру Инструмент ведёт себя как автоматизированный атакующий: обходит страницы, подставляет полезные нагрузки payloads и фиксирует подозрительные ответы
Особенности:
-
Чёрный ящик: анализ идёт по внешнему интерфейсу
HTTP/HTTPS -
Фокус на эксплуатацию:
SQLi,XSS,LFI/RFI, небезопасные заголовки, слабые cookies, открытые админки и т.д. Сканировать как простыми профилями baseline scan, так и агрессивными активными проверками- Автоматически обходить сайт
spider/crawlerи находить новые эндпоинты (входные точки) - Выполнять пассивный анализ - заголовки,
cookies, версии серверов, утечки данных и активные атакиXSS,SQLiи др.
- Автоматически обходить сайт
-
Формировать отчёты в форматах
HTML,JSON,XMLдля дальнейшего анализа и интеграции вCI/CD
Мы используем owasp/zap2docker-stable и CLI‑скрипт zap_scan.sh для сканирования по URL http://localhost:8080/ уязвимого приложения Flask. Скрипт запускает baseline‑скан, сохраняет отчёты и передаёт JSON на генерацию ODT/XLSX.
- 1. Разверните и подготовьте окружение для уязвимого приложения
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txt && vulnerable-app/requirements.txt - 2. Запустите уязвимое приложение
$ docker-compose up -d --build # http://localhost:8080- 3. Проверьте доступность приложения
$ curl -i http://localhost:8080Вывод такой:
HTTP/1.1 200 OK
Server: xxxxx/xxxxx Python/xxxxx
Date: xxxxx, xxxxx xxxxx 2025 xxxxx GMT
Content-Type: text/html; charset=utf-8
Content-Length: 625
Set-Cookie: session=guest-session-id; Path=/
Connection: close
<h1>Vulnerable DAST Demo App</h1>
<p>Пример уязвимого приложения для лабораторной по DAST.</p>
<ul>
<li><a href="/echo?msg=Hello">Reflected XSS / echo</a></li>
<li><a href="/search?username=admin">SQL Injection / search</a></li>
<li><a href="/login">Небезопасный логин</a></li>
<li><a href="/profile">Профиль (зависит от cookie)</a></li>
<li><a href="/admin">«Админка» без нормальной авторизации</a></li>
<li><a href="/files/">Directory listing</a></li>
</ul>- 4. Проведите ручное исследование уязвимостей и опишите почему такое происходит, каким образом реализуются уязвимости и дайте им определение
- 4.1.
/echo- проверить отражение параметраmsgвHTMLи использоватьpayloadвида<script>alert('XSS')</script>зафиксировав его поведение
http://localhost:8080/echo?msg=<script>alert('hack with XSS')</script>- 4.2.
/search- проверить обычный запрос?username=adminи использовать строку?username=admin' OR '1'='1зафиксировав его поведение описав признак SQLi
http://localhost:8080/search?username=admin' OR '1'='1- 4.3.
/login- войти подadminиuserпроверив логику на открытые пароли и простые SQL‑запросы - 4.4.
/profile- изменитьcookie roleнаadminчерезDevTools→Application→Cookiesи обновить/profile(возможно создатьcookie - 4.5.
/admin- проверить, что доступ запрещён безcookie role=adminи далее подделатьcookie, что «админка» открывается путем изменения черезDevTools. Подсказка: доступ завязан на значение cookie, без подписи/ токена/ серверной проверки. - 4.6.
/files/- просмотритеdirectory listingи откройте один из файлов убедившись, что оно выводится
http://localhost:8080/files/secret.txt- 5. Доработайте по пп 4 лабораторную работу развив их содержимое, которое может выводиться (мин 1 пример)
- 6. Поставьте
OWASP ZAPи стяните образ конкретной версии для него
$ brew install --cask zap
$ docker pull ghcr.io/zaproxy/zaproxy:stable- 7. Задайте переменные окружения для работы скриптов
$ export ZAP_IMAGE=ghcr.io/zaproxy/zaproxy:stable
$ TARGET_URL="${TARGET_URL:-http://host.docker.internal:8080}"- 8. Запустите скрипт автоматического сканирования DAST
OWASP ZAP
$ ./zap_scan.sh- 9. Изучите сгенерированные отчеты в
dast/reportsи опишите риски ИБ для них, без сценариев, так как ранее вы видели часть из их реализации - 10. Внесите исправления по данному отчету
DASTдляvulnerable-app/app.py - 11. Делайте все необходимые коммиты по шагам и отправляйте изменения в удалённый репозиторий
- 12. Подготовьте отчет
gist. - 13. Почистите кеш от
venvи остановите уязвимое приложение
$ deactivate
$ rm -rf venv
$ docker-compose -f docker-compose.yml down
$ docker system prune -fXSSнаecho— отражение входных данных без экранирования
Заменить прямую подстановку строки на безопасный рендер с автоматическим экранированием или ручной фильтрацией
SQL Injectionнаsearch— небезопасная конкатенация строки запроса
Перейти на параметризованные запросы
sqliteи передачей параметров отдельным аргументом, включая отказа от конкатенацииSQL‑строк с пользовательским вводом
- Небезопасные
cookies(session,user,role) — безSecure,HttpOnly,SameSite
Задать флаги
HttpOnly,Secure(еслиHTTPS),SameSite=Lax/ Strict
- Отсутствие основных
security‑headers(X-Frame-Options,X-Content-Type-Options,Content-Security-Policyи т.д.) - Усилить авторизацию на
adminиз-за доступа по подделанному cookie Directory listingнаfiles
Ограничить список отдаваемых ресурсов, либо скрыть
directory listing, либо добавить проверки и фильтрацию путей.
Если столкнулись с проблемами — смотрите Troubleshooting.