
Проект с открытым исходным кодом на Golang для оценки различных инструментов безопасности API и WAF на предмет логики обнаружения и обходов.
GoTestWAF — это инструмент для симуляции атак API и OWASP, который поддерживает широкий спектр протоколов API, включая REST, GraphQL, gRPC, SOAP, XMLRPC и другие.
Он был разработан для оценки решений безопасности веб-приложений, таких как прокси безопасности API, межсетевые экраны веб-приложений (WAF), системы предотвращения вторжений (IPS), шлюзы API и другие.
GoTestWAF генерирует вредоносные запросы, используя закодированные полезные нагрузки, размещенные в различных частях HTTP-запросов: тело, заголовки, параметры URL и т. д. Сгенерированные запросы отправляются на URL решения безопасности приложения, указанный при запуске GoTestWAF. Результаты оценки решения безопасности записываются в файл отчета, создаваемый на вашей машине.
Условия по умолчанию для генерации запросов определены в папке testcases в YAML-файлах следующего формата:```yaml
payload:
* `payload` — это образец вредоносной атаки (например, XSS-полезная нагрузка типа ```<script>alert(111)</script>``` или что-то более сложное). Так как для полезных нагрузок требуется формат YAML-строки, они должны быть [закодированы как двоичные данные](https://yaml.org/type/binary.html).
* `encoder` — это кодировщик, применяемый к полезной нагрузке перед помещением её в HTTP-запрос. Возможные кодировщики:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain (чтобы оставить строку полезной нагрузки как есть)
* XML Entity
* `placeholder` — это место внутри HTTP-запроса, куда должна быть помещена закодированная полезная нагрузка. Возможные заполнители:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
Заполнитель `RawRequest` позволяет выполнить произвольный HTTP-запрос. Полезная нагрузка подставляется путём замены строки `{{payload}}` в пути URL, заголовках или теле. Поля заполнителя `RawRequest`:
* `method`
* `path`
* `headers`
* `body`
Обязательные поля для заполнителя `RawRequest`:
* поле `method`
Пример:
```yaml
payload:
- test
encoder:
- Plain
placeholder:
- RawRequest:
method: "POST"
path: "/"
headers:
Content-Type: "multipart/form-data; boundary=boundary"
body: |
--boundary
Content-disposition: form-data; name="field1"
Test
--boundary
Content-disposition: form-data; name="field2"
Content-Type: text/plain; charset=utf-7
Knock knock.
{{payload}}
--boundary--
type: RawRequest test
```
* `type` — это имя всей группы полезных нагрузок в файле. Оно может быть произвольным, но должно отражать тип атак в файле.
Генерация запросов — это трехэтапный процесс, включающий умножение количества полезных нагрузок на количество кодировщиков и заполнителей. Допустим, вы определили 2 **полезные нагрузки**, 3 **кодировщика** (Base64, JSUnicode и URL) и 1 **заполнитель** (URLParameter — HTTP GET параметр). В этом случае GoTestWAF отправит 2x3x1 = 6 запросов в одном тестовом сценарии.
При запуске GoTestWAF вы также можете выбрать тестовые сценарии из двух встроенных: OWASP Top-10, OWASP-API, или свои собственные (используя [параметр конфигурации](#configuration-options) `testCasePath`).
## Требования
* GoTestwaf поддерживает все популярные операционные системы (Linux, Windows, macOS) и может быть собран нативно, если в системе установлен [Go](https://golang.org/doc/install). Если вы хотите запустить GoTestWaf нативно, убедитесь, что у вас есть веб-браузер Chrome для возможности создания PDF-отчетов. Если Chrome отсутствует, вы можете создать отчет в формате HTML.
* При запуске GoTestWAF в качестве Docker-контейнера убедитесь, что у вас [установлен и настроен Docker](https://docs.docker.com/get-docker/), и GoTestWAF с оцениваемым решением безопасности подключены к одной [Docker-сети](https://docs.docker.com/network/).
* Для успешного запуска GoTestWAF убедитесь, что IP-адрес машины, на которой запущен GoTestWAF, внесен в белый список на машине, где работает решение безопасности приложений.
## Быстрый старт с Docker
Ниже описаны шаги по загрузке и запуску GoTestWAF с минимальной конфигурацией в Docker.
1. Скачайте образ [GoTestWAF](https://hub.docker.com/r/wallarm/gotestwaf) из Docker Hub:
```
docker pull wallarm/gotestwaf
```
2. Запустите образ GoTestWAF:
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
```
При необходимости вы можете заменить `${PWD}/reports` на путь к другой папке, используемой для размещения отчета об оценке.
Если вы не хотите отправлять отчет по электронной почте (необязательно), просто нажмите Enter после появления запроса на email, или используйте --noEmailReport, чтобы пропустить сообщение:
```sh
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL> --noEmailReport
```
Если оцениваемый инструмент безопасности доступен извне, можно пропустить опцию `--network="host"`. Эта опция обеспечивает взаимодействие Docker-контейнеров, работающих на 127.0.0.1.
Для выполнения gRPC-тестов необходимо иметь рабочий endpoint и использовать опцию командной строки --grpcPort <port>.
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --grpcPort 9000 --url=http://my.grpc.endpoint
```
3. Проверьте свою электронную почту для получения отчета.
Вы успешно оценили ваше решение безопасности приложений с помощью GoTestWAF с минимальной конфигурацией. Чтобы узнать о расширенных параметрах конфигурации, перейдите по этой [ссылке](#configuration-options).
## Проверка результатов оценки
Проверьте результаты оценки, записанные с помощью сервисов `STDOUT` и `STDERR`. Например:```
INFO[0000] GoTestWAF started version=v0.5.6-7-g48e6959
INFO[0000] Test cases loading started
INFO[0000] Test cases loading finished
INFO[0000] Test cases fingerprint fp=c6d14d6138601d19d215bb97806bcda3
INFO[0000] Try to identify WAF solution
INFO[0000] WAF was not identified
INFO[0000] gohttp is used as an HTTP client to make requests http_client=gohttp
INFO[0000] WAF pre-check url="http://host.docker.internal:8080"
INFO[0000] WAF pre-check blocked=true code=403 status=done
INFO[0000] gRPC pre-check status=started
INFO[0000] gRPC pre-check connection="not available" status=done
INFO[0000] GraphQL pre-check status=started
INFO[0000] GraphQL pre-check connection="not available" status=done
INFO[0000] Scanning started url="http://host.docker.internal:8080"
INFO[0005] Scanning finished duration=5.422700876s
True-Positive Tests:
┌────────────┬───────────────────────────┬──────────────────────┬─────────────────────┬──────────────────────┬────────────────────┬─────────────┬─────────────────┐
│ TEST SET │ TEST CASE │ PERCENTAGE , % │ BLOCKED │ BYPASSED │ UNRESOLVED │ SENT │ FAILED │
├────────────┼───────────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ community │ community-128kb-rce │ 0.00 │ 0 │ 0 │ 1 │ 1 │ 0 │
│ community │ community-128kb-sqli │ 0.00 │ 0 │ 0 │ 1 │ 1 │ 0 │
│ community │ community-128kb-xss │ 0.00 │ 0 │ 0 │ 1 │ 1 │ 0 │
│ community │ community-16kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-16kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-16kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-32kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-32kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-32kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-64kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-64kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-64kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-8kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-8kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-8kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-lfi │ 100.00 │ 8 │ 0 │ 0 │ 8 │ 0 │
│ community │ community-lfi-multipart │ 0.00 │ 0 │ 0 │ 2 │ 2 │ 0 │
│ community │ community-rce │ 50.00 │ 2 │ 2 │ 0 │ 4 │ 0 │
│ community │ community-rce-rawrequests │ 100.00 │ 3 │ 0 │ 0 │ 3 │ 0 │
│ community │ community-sqli │ 100.00 │ 12 │ 0 │ 0 │ 12 │ 0 │
│ community │ community-user-agent │ 66.67 │ 6 │ 3 │ 0 │ 9 │ 0 │
│ community │ community-xss │ 88.46 │ 92 │ 12 │ 0 │ 104 │ 0 │
│ community │ community-xxe │ 0.00 │ 0 │ 1 │ 1 │ 2 │ 0 │
│ owasp │ crlf │ 85.71 │ 6 │ 1 │ 0 │ 7 │ 0 │
│ owasp │ ldap-injection │ 8.33 │ 2 │ 22 │ 0 │ 24 │ 0 │
│ owasp │ mail-injection │ 12.50 │ 3 │ 21 │ 0 │ 24 │ 0 │
│ owasp │ nosql-injection │ 24.00 │ 12 │ 38 │ 0 │ 50 │ 0 │
│ owasp │ path-traversal │ 30.00 │ 6 │ 14 │ 0 │ 20 │ 0 │
│ owasp │ rce │ 33.33 │ 2 │ 4 │ 0 │ 6 │ 0 │
│ owasp │ rce-urlparam │ 33.33 │ 3 │ 6 │ 0 │ 9 │ 0 │
│ owasp │ rce-urlpath │ 0.00 │ 0 │ 3 │ 0 │ 3 │ 0 │
│ owasp │ shell-injection │ 18.75 │ 6 │ 26 │ 0 │ 32 │ 0 │
│ owasp │ sql-injection │ 29.17 │ 14 │ 34 │ 0 │ 48 │ 0 │
│ owasp │ ss-include │ 50.00 │ 12 │ 12 │ 0 │ 24 │ 0 │
│ owasp │ sst-injection │ 29.17 │ 7 │ 17 │ 0 │ 24 │ 0 │
│ owasp │ xml-injection │ 0.00 │ 0 │ 7 │ 0 │ 7 │ 0 │
│ owasp │ xss-scripting │ 39.91 │ 89 │ 134 │ 1 │ 224 │ 0 │
│ owasp-api │ graphql │ 0.00 │ 0 │ 0 │ 0 │ 0 │ 0 │
│ owasp-api │ graphql-post │ 0.00 │ 0 │ 0 │ 0 │ 0 │ 0 │
│ owasp-api │ grpc │ 0.00 │ 0 │ 0 │ 0 │ 0 │ 0 │
│ owasp-api │ non-crud │ 100.00 │ 2 │ 0 │ 0 │ 2 │ 0 │
│ owasp-api │ rest │ 42.86 │ 3 │ 4 │ 0 │ 7 │ 0 │
│ owasp-api │ soap │ 20.00 │ 1 │ 4 │ 0 │ 5 │ 0 │
├────────────┼───────────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ Date: │ Project Name: │ True-Positive Score: │ Blocked (Resolved): │ Bypassed (Resolved): │ Unresolved (Sent): │ Total Sent: │ Failed (Total): │
│ 2025-07-14 │ generic │ 45.36% │ 303/668 (45.36%) │ 365/668 (54.64%) │ 7/675 (1.04%) │ 675 │ 0/675 (0.00%) │
└────────────┴───────────────────────────┴──────────────────────┴─────────────────────┴──────────────────────┴────────────────────┴─────────────┴─────────────────┘
True-Negative Tests:
┌────────────┬───────────────┬──────────────────────┬─────────────────────┬──────────────────────┬────────────────────┬─────────────┬─────────────────┐
│ TEST SET │ TEST CASE │ PERCENTAGE , % │ BLOCKED │ BYPASSED │ UNRESOLVED │ SENT │ FAILED │
├────────────┼───────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ false-pos │ texts │ 90.78 │ 13 │ 128 │ 0 │ 141 │ 0 │
├────────────┼───────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ Date: │ Project Name: │ True-Negative Score: │ Blocked (Resolved): │ Bypassed (Resolved): │ Unresolved (Sent): │ Total Sent: │ Failed (Total): │
│ 2025-07-14 │ generic │ 90.78% │ 13/141 (9.22%) │ 128/141 (90.78%) │ 0/141 (0.00%) │ 141 │ 0/141 (0.00%) │
└────────────┴───────────────┴──────────────────────┴─────────────────────┴──────────────────────┴────────────────────┴─────────────┴─────────────────┘
Summary:
┌──────────────────────┬───────────────────────────────┬──────────────────────────────┬─────────┐
│ TYPE │ TRUE - POSITIVE TESTS BLOCKED │ TRUE - NEGATIVE TESTS PASSED │ AVERAGE │
├──────────────────────┼───────────────────────────────┼──────────────────────────────┼─────────┤
│ API Security │ 42.86% │ n/a │ 42.86% │
│ Application Security │ 45.41% │ 90.78% │ 68.10% │
├──────────────────────┼───────────────────────────────┼──────────────────────────────┼─────────┤
│ │ │ Score │ 55.48% │
└──────────────────────┴───────────────────────────────┴──────────────────────────────┴─────────┘
Файл отчета waf-evaluation-report-<date>.pdf доступен в папке reports в каталоге пользователя. Вы также можете указать каталог для сохранения отчетов с помощью параметра reportPath и имя файла отчета с помощью параметра reportName. Чтобы узнать о расширенных параметрах конфигурации, используйте эту ссылку.
Вы можете найти пример PDF-отчета здесь.

Вы можете попробовать GoTestWAF, запустив демо-среду, которая развертывает ModSecurity на базе NGINX с использованием OWASP Core Rule Set и GoTestWAF, оценивающий ModSecurity на Docker.
Чтобы запустить демо-среду:
Клонируйте этот репозиторий и перейдите в клонированный каталог:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
Запустите ModSecurity из Docker образа с помощью следующей команды make:
make modsec
Настройки для запуска Docker-контейнера ModSecurity определены в правиле modsec клонированного Makefile. Он запускает Docker-контейнер ModSecurity на порту 8080 с минимальной конфигурацией, определенной в клонированном файле ./resources/default.conf.template, и значением PARANOIA, установленным на 1.
При необходимости вы можете изменить эти настройки, отредактировав правило modsec в клонированном Makefile. Доступные параметры конфигурации ModSecurity описаны на Docker Hub.
Чтобы остановить контейнеры ModSecurity, используйте следующую команду:
make modsec_down
Запустите GoTestWAF с минимальной конфигурацией, используя один из следующих способов:
Запустите Docker образ с помощью следующих команд docker pull и :
В дополнение к запуску Docker образа GoTestWAF, загруженного с Docker Hub, вы можете запустить GoTestWAF, используя следующие варианты:
Клонируйте этот репозиторий и соберите Docker образ GoTestWAF из Dockerfile, например:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
DOCKER_BUILDKIT=1 docker build --force-rm -t gotestwaf .
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
Если оцениваемое средство безопасности доступно извне, вы можете пропустить опцию --network="host". Эта опция обеспечивает взаимодействие Docker-контейнеров, работающих на 127.0.0.1.
Клонируйте этот репозиторий и запустите GoTestWAF с помощью go, например:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
go run ./cmd --url=<EVALUATED_SECURITY_SOLUTION_URL>
Клонируйте этот репозиторий и соберите GoTestWAF как модуль Go:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
go build -mod vendor -o gotestwaf ./cmd
Поддерживаемые параметры конфигурации GoTestWAF описаны ниже.
Usage: ./gotestwaf [OPTIONS] --url
Options: --addDebugHeader Add header "X-GoTestWAF-Test" with a hash of the test information in each request --addHeader string An HTTP header to add to requests --blockConnReset If present, connection resets will be considered as block --blockRegex string Regex to detect a blocking page with the same HTTP response status code as a not blocked request --blockStatusCodes ints HTTP status code that WAF uses while blocking requests (default [403]) --configPath string Path to the config file (default "config.yaml") --email string E-mail to which the report will be sent --followCookies If present, use cookies sent by the server. May work only with --maxIdleConns=1 (gohttp only) --graphqlURL string GraphQL URL to check --grpcPort uint16 gRPC port to check --hideArgsInReport If present, GoTestWAF CLI arguments will not be displayed in the report --httpClient string Which HTTP client use to send requests: chrome, gohttp (default "gohttp") --idleConnTimeout int The maximum amount of time a keep-alive connection will live (gohttp only) (default 2) --ignoreUnresolved If present, unresolved test cases will be considered as bypassed (affect score and results) --includePayloads If present, payloads will be included in HTML/PDF report --logFormat string Set logging format: text, json (default "text") --logLevel string Logging level: panic, fatal, error, warn, info, debug, trace (default "info") --maxIdleConns int The maximum number of keep-alive connections (gohttp only) (default 2) --maxRedirects int The maximum number of handling redirects (gohttp only) (default 50) --noEmailReport Save report locally --nonBlockedAsPassed If present, count requests that weren't blocked as passed. If false, requests that don't satisfy to PassStatusCodes/PassRegExp as blocked --openapiFile string Path to openAPI file --passRegex string Regex to a detect normal (not blocked) web page with the same HTTP status code as a blocked request --passStatusCodes ints HTTP response status code that WAF uses while passing requests (default [200,404]) --proxy string Proxy URL to use --quiet If present, disable verbose logging --randomDelay int Random delay in ms in addition to the delay between requests (default 400) --renewSession Renew cookies before each test. Should be used with --followCookies flag (gohttp only) --reportFormat strings Export report in the following formats: none, json, html, pdf (default [pdf]) --reportName string Report file name. Supports `time' package template format (default "waf-evaluation-report-2006-January-02-15-04-05") --reportPath string A directory to store reports (default "reports") --sendDelay int Delay in ms between requests (default 400) --skipWAFBlockCheck If present, WAF detection tests will be skipped --skipWAFIdentification Skip WAF identification --testCase string If set then only this test case will be run --testCasesPath string Path to a folder with test cases (default "testcases") --testSet string If set then only this test set's cases will be run --tlsVerify If present, the received TLS certificate will be verified --url string URL to check --version Show GoTestWAF version and exit --wafName string Name of the WAF product (default "generic") --workers int The number of workers to scan (default 5)
GoTestWAF поддерживает два HTTP-клиента для выполнения запросов, выбираемых с помощью опции `--httpClient`. Клиент по умолчанию — стандартный HTTP-клиент Golang. Второй вариант — Chrome, который можно использовать с аргументом командной строки `--httpClient=chrome`. Обратите внимание, что в системах Linux необходимо добавить аргумент `--cap-add=SYS_ADMIN` к аргументам Docker для запуска GoTestWAF с Chrome в качестве исполнителя запросов.
### Сканирование на основе файла OpenAPI
Для лучшего сканирования GTW поддерживает отправку вредоносных векторов через валидные запросы приложения. Вместо создания простых по структуре запросов и отправки их на URL, указанный при запуске, GoTestWAF создает валидные запросы на основе описания API приложения в формате OpenAPI 3.0.
Как это работает:
1. GoTestWAF загружает файл OpenAPI и создает шаблоны запросов. Все шаблоны затем разделяются на группы в зависимости от того, какие плейсхолдеры они поддерживают (например, если в пути запроса есть строковый параметр, то такой запрос будет отнесен к группе запросов, поддерживающих плейсхолдер URLPath)
2. Следующий вредоносный вектор выбирается из очереди для отправки. На основе указанного для него плейсхолдера выбираются все шаблоны запросов, в которые можно подставить этот вектор. Затем вектор подставляется в шаблон, и запрос отправляется.
3. На основе возможных ответов, указанных в файле OpenAPI, определяется, был ли запрос заблокирован WAF или передан приложению. Если код ответа и его схема соответствуют описанным в файле OpenAPI, запрос помечается как обойденный. В противном случае он будет помечен как заблокированный. Возможно, что приложение отвечает только кодом состояния, и этот код совпадает с ответом от WAF. В этом случае запрос будет помечен как неразрешенный.
Некоторые поддерживаемые функции OpenAPI:
* числовые и строковые параметры в заголовках, путях, параметрах запроса и теле запросов;
* для тела запроса поддерживаются следующие content-type: `application/json`, `application/xml`, `application/x-www-form-urlencoded`, `text/plain`;
* для XML поддерживаются следующие модификаторы: `name`, `wrapped`, `attribute`, `prefix`, `namespace`;
* ограничения длины строк поддерживаются через параметры `minLength` и `maxLength`;
* ограничения значений чисел поддерживаются через `minimum`, `maximum`, `exclusiveMinimum` и `exclusiveMaximum`;
* ограничения длины массивов через `minItems` и `maxItems` поддерживаются;
* поддерживается комбинация схем через `oneOf`, `anyOf`, `allOf`.
Исходя из описанного принципа работы, крайне важно, чтобы файл OpenAPI корректно представлял реализованный API приложения. Поэтому, например, нельзя использовать `default` для описания возможных ответов на запросы.
Note: Необходимо пробросить том с OpenAPI спецификацией в контейнер GoTestWAF.```sh
-v ${PWD}/api.yaml:/app/api.yaml
Полный пример Docker:```sh docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports -v ${PWD}/api.yaml:/app/api.yaml wallarm/gotestwaf --wafName your_waf_name --url=https://example.com/v1 --openapiFile api.yaml
## Запуск с набором регрессионного тестирования OWASP Core Rule Set
GoTestWAF позволяет легко интегрировать дополнительные тестовые наборы.
В этом примере мы покажем, как добавить тесты из набора регрессионного тестирования OWASP Core Rule Set.
Поскольку тесты написаны в другом формате, отличном от формата GoTestWAF, требуется преобразование. Для этой цели предоставляется скрипт **misc/modsec_regression_testset_converter.rb**.
Чтобы преобразовать тесты, выполните `make modsec_crs_regression_tests_convert`.
Затем создайте контейнер с обновлённым набором тестов.
`make gotestwaf`
Обратите внимание, что по умолчанию тесты преобразуются только для подмножества правил. Были выбраны следующие категории:
- REQUEST-932-APPLICATION-ATTACK-RCE
- REQUEST-933-APPLICATION-ATTACK-PHP
- REQUEST-941-APPLICATION-ATTACK-XSS
- REQUEST-930-APPLICATION-ATTACK-LFI
- REQUEST-931-APPLICATION-ATTACK-RFI
- REQUEST-942-APPLICATION-ATTACK-SQLI
- REQUEST-944-APPLICATION-ATTACK-JAVA
- REQUEST-934-APPLICATION-ATTACK-GENERIC
- REQUEST-913-SCANNER-DETECTION
При необходимости измените переменную "crs_testcases" в файле misc/modsec_regression_testset_converter.rb, чтобы добавить или удалить категории тестов.
docker rundocker pull wallarm/gotestwaf
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=http://127.0.0.1:8080 --noEmailReport
Соберите Docker образ GoTestWAF из Dockerfile и запустите образ с помощью следующих команд make (убедитесь, что ModSec запущен на порту 8080; если нет, обновите значение порта в Makefile):
make gotestwaf
make scan_local_from_docker
Запустите GoTestWAF нативно с помощью go, используя следующую команду make: (убедитесь, что ModSec запущен на порту 8080; если нет, обновите значение порта в Makefile):
make scan_local
Найдите файл отчета waf-evaluation-report-<date>.pdf в папке reports, которую вы смонтировали в /app/reports внутри контейнера.