
Программа для тестирования функциональности WAF
Инструмент оценки WAF для предприятий — Реальные полезные нагрузки. Реальные результаты. Отчеты, готовые к соответствию требованиям.
WAF Tester оценивает Web Application Firewalls, отправляя реальные атакующие полезные нагрузки на заданный URL и сообщая, были ли они заблокированы. Доступен как настольное приложение для Windows (Electron), так и CLI на Python, работающий где угодно.

Этот инструмент предназначен только для авторизованного тестирования безопасности. Используйте его только против систем, которые вы контролируете или на тестирование которых имеете явное письменное разрешение. Несанкционированное тестирование сторонних систем может нарушать Закон о компьютерном мошенничестве и злоупотреблениях (CFAA) и аналогичные законы в вашей юрисдикции. Авторы не несут ответственности за неправомерное использование.
| Набор | Тесты | Что охватывает |
|---|
| OWASP / CWE Core | 44 | SQL-инъекции (12 вариантов), XSS (10 вариантов), path traversal, command injection, XXE, SSRF, Log4Shell, SSTI, open redirect |
| Rate Limiting | 3 | Burst flood (30 параллельных), последовательный флуд, обход X-Forwarded-For с ротацией IP |
| Bot Detection | 10 | sqlmap, Nikto, Nmap, Scrapy, Masscan, HeadlessChrome, python-requests, curl, пустой UA, отсутствие заголовка Accept |
| Bypass Attempts | 15 | Двойное URL-кодирование, Unicode fullwidth, null-байты, вариации регистра, обфускация комментариями, CRLF-инъекция, инъекция заголовка Host, переопределение метода, трюки с путями |
| API Security | 10 | GraphQL introspection/batch/enumeration, JWT none-algorithm и путаница алгоритмов, массовое присвоение, подмена HTTP-глаголов, BOLA, путаница content-type |
| Business Logic | 8 | Отрицательное количество, отправка с нулевой ценой, доступ к эндпоинтам администратора, загрязнение HTTP-параметров, перебор аккаунтов, чрезмерное раскрытие данных, принудительный просмотр, повышение привилегий |
Каждый тест помечен одной или несколькими системами соответствия:
HIGH, LIKELY или UNCERTAIN вместо бинарного проход/непроходgit clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
Результат появляется в dist/ в виде NSIS-установщика и портативного .exe. На целевой машине не требуется предустановленного ПО — Electron содержит собственный рантайм.
Однофайловая версия на Python, работающая везде, где есть Python — на серверах Linux, в CI/CD-пайплайнах, Docker-контейнерах, WSL или в любой среде, где неподходящ Windows .exe.
pip install rich requests
python waf_tester.py --url https://target.example.com
Запускает все 90 тестов, запрашивает подтверждение авторизации, выводит цветные результаты в терминал и сохраняет отчеты в форматах JSON и HTML в текущую директорию.
| Флаг | Описание | По умолчанию |
|---|---|---|
--url | Целевой URL (обязательно) | — |
--suites | Наборы тестов через запятую | все |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | Токен, строка cookie или значение API-ключа | — |
--auth-header | Имя заголовка для аутентификации по API-ключу | X-API-Key |
--auth-user | Имя пользователя для Basic Auth | — |
--auth-pass | Пароль для Basic Auth | — |
--no-baseline | Отключить сравнение с базовым уровнем | выкл |
--no-rotate-ua | Отключить ротацию User-Agent | выкл |
--waf-header | Отправлять идентификационный заголовок X-WAF-Tester | выкл |
--output | terminal, json, html (через запятую) | все три |
--output-dir | Директория для сохранения отчетов | . |
--timeout | Таймаут на запрос в секундах | 10 |
--proxy | URL прокси для всех запросов (например, http://127.0.0.1:8080) | выкл |
--confirm | Пропустить запрос на подтверждение авторизации | выкл |
# Запуск всех наборов
python waf_tester.py --url https://app.example.com
# Запуск только наборов OWASP и API
python waf_tester.py --url https://app.example.com --suites owasp,api
# Аутентификация Bearer token
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# Аутентификация по API-ключу
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# Сохранение отчетов в папку, пропуск подтверждения (CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# Только терминальный вывод — файлы не сохраняются
python waf_tester.py --url https://app.example.com --output terminal
# Маршрутизация трафика через Burp Suite
python waf_tester.py --url https://app.example.com --proxy http://127.0.0.1:8080
docker run --rm -v $(pwd)/reports:/reports \
python:3.12-slim sh -c \
"pip install rich requests -q && python waf_tester.py \
--url https://target.example.com \
--output-dir /reports --confirm"
- name: WAF Evaluation
run: |
pip install rich requests
python waf_tester.py \
--url ${{ secrets.WAF_TARGET_URL }} \
--suites owasp,api,bypass \
--output json \
--output-dir ./reports \
--confirm
- name: Upload report
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
CLI на Python может направлять весь тестовый трафик через Burp Suite, предоставляя полную HTTP-историю каждой полезной нагрузки, отправленной WAF Tester. Это полезно для ручного анализа запросов и ответов, точной настройки полезных нагрузок, устранения неожиданного поведения WAF, а также для использования собственного сканера или Repeater Burp для интересных находок.
Burp Suite запускает локальный прокси-слушатель (по умолчанию 127.0.0.1:8080). Когда вы указываете WAF Testerу адрес прокси через переменные окружения, каждый запрос инструмента проходит через Burp перед достижением цели. Вы видите каждую полезную нагрузку в HTTP-истории Burp с полным запросом и ответом — код состояния, заголовки, тело — точно так, как их видел WAF.
1. Запустите Burp Suite и убедитесь, что прокси-слушатель активен:
Откройте Burp → Proxy → Proxy Settings → убедитесь, что слушатель на 127.0.0.1:8080 (или запомните ваш порт, если он другой).
2. Экспортируйте CA-сертификат Burp и доверьте ему (однократная настройка):
WAF Tester подключается к HTTPS-целям, поэтому Burp должен перехватывать TLS. Перейдите в Burp → Proxy → Proxy Settings → Import/Export CA Certificate → Export as DER. Установите его как доверенный корневой CA в вашей системе, или задайте переменную окружения, чтобы пропустить проверку (подходит для лабораторных условий, не для продакшена).
3. Запустите WAF Tester с параметром --proxy:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
На Windows:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Вы также можете использовать переменные окружения, если предпочитаете:
HTTPS_PROXY=http://127.0.0.1:8080 HTTP_PROXY=http://127.0.0.1:8080 \
python waf_tester.py --url https://target.example.com
4. Отключите перехват Burp:
В Burp → Proxy → Intercept убедитесь, что перехват выключен — иначе Burp будет приостанавливаться на каждом запросе в ожидании ручной пересылки, и WAF Tester выйдет по таймауту. Вам нужно, чтобы Burp пассивно записывал трафик, а не перехватывал его.
5. Наблюдайте за запросами в HTTP-истории Burp:
Каждая полезная нагрузка WAF Tester отображается отдельной записью. Вы можете щелкнуть правой кнопкой мыши по любому запросу и отправить его в Repeater для ручной модификации и повторной отправки, или в Intruder для дальнейшего фаззинга.
Если CA-сертификат Burp не является доверенным, можно использовать временную обходную меру --no-verify, отключив проверку SSL в инструменте. Альтернативно, доверьте CA-сертификат Burp системно или используйте цель по HTTP (не HTTPS) для начального тестирования.
| Оценка | Оценка (букв.) | Значение |
|---|---|---|
| 90–100% | A | Отлично — WAF блокирует почти все атакующие векторы |
| 80–89% | B | Хорошо — есть незначительные пробелы, которые стоит изучить |
| 65–79% | C | Удовлетворительно — присутствуют заметные обходные векторы |
| 50–64% | D | Плохо — значительные пробелы в защите |
| < 50% | F | Критично — WAF в значительной степени неэффективен |
Уровни достоверности:
HIGH — жесткий блок (403, 406, 429) без двусмысленностиLIKELY — ключевые слова WAF в теле ответа, или статус отличается от базового уровняUNCERTAIN — мягкий блок (400, 503), который может быть ошибкой легитимного приложения# Juice Shop (без WAF — ожидается, что все обойдено)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity с OWASP CRS (ожидается, что большинство заблокировано)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Основной процесс Electron — вся логика тестов и IPC
│ ├── preload.js # Безопасный мост контекста
│ └── renderer/
│ ├── index.html # Оболочка приложения
│ ├── styles.css # Темная тема UI в стиле военных/SOC
│ └── app.js # Логика UI, фильтры, живая лента, экспорт
├── waf_tester.py # Python CLI — один файл, не требует конфигурации
├── package.json
└── README.md
waf_tester.py) — один файл, работает где угодноMIT — подробности см. в LICENSE.
Создано для инженеров по безопасности, которым нужна проверка WAF, выходящая за рамки формального соответствия.