Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
gotestwaf — Проект с открытым исходным кодом на Golang для оценки различных инструментов безопасности API и WAF на предмет логики обнаружения и обходов. | Kitploit
Инструменты/GitHubGitHub/wallarm/gotestwaf
Сканеры уязвимостейСканеры веб-уязвимостейТестирование безопасности APIОбход WAFВеб-безопасностьТестирование на ПроникновениеБезопасность API
GitHubwallarm/gotestwaf

gotestwaf

Проект с открытым исходным кодом на Golang для оценки различных инструментов безопасности API и WAF на предмет логики обнаружения и обходов.

Репозиторий
1.8k2601 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Сайт

GoTestWAF Black Hat Arsenal USA 2022

GoTestWAF — это инструмент для симуляции атак API и OWASP, который поддерживает широкий спектр протоколов API, включая REST, GraphQL, gRPC, SOAP, XMLRPC и другие.

Он был разработан для оценки решений безопасности веб-приложений, таких как прокси безопасности API, межсетевые экраны веб-приложений (WAF), системы предотвращения вторжений (IPS), шлюзы API и другие.


  • Как это работает
  • Требования
  • Быстрый старт с Docker
  • Проверка результатов оценки
  • Демонстрации
  • Другие способы запуска GoTestWAF
  • Параметры конфигурации
  • Запуск с набором регрессионного тестирования OWASP Core Rule Set

Как это работает

GoTestWAF генерирует вредоносные запросы, используя закодированные полезные нагрузки, размещенные в различных частях HTTP-запросов: тело, заголовки, параметры URL и т. д. Сгенерированные запросы отправляются на URL решения безопасности приложения, указанный при запуске GoTestWAF. Результаты оценки решения безопасности записываются в файл отчета, создаваемый на вашей машине.

Условия по умолчанию для генерации запросов определены в папке testcases в YAML-файлах следующего формата:```yaml payload:

  • '"union select -7431.1, name, @aaa from u_base--w-'
  • "'or 123.22=123.22"
  • "' waitfor delay '00:00:10'--"
  • "')) or pg_sleep(5)--" encoder:
  • Base64Flat
  • URL placeholder:
  • UrlPath
  • UrlParam
  • JSUnicode
  • Header type: SQL Injection
root@kitploit:~
* `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-отчета здесь.

Example of GoTestWaf report

Демонстрации

Вы можете попробовать GoTestWAF, запустив демо-среду, которая развертывает ModSecurity на базе NGINX с использованием OWASP Core Rule Set и GoTestWAF, оценивающий ModSecurity на Docker.

Чтобы запустить демо-среду:

  1. Клонируйте этот репозиторий и перейдите в клонированный каталог:

    root@kitploit:~
    git clone https://github.com/wallarm/gotestwaf.git
    cd gotestwaf
    
  2. Запустите ModSecurity из Docker образа с помощью следующей команды make:

    root@kitploit:~
    make modsec
    

    Настройки для запуска Docker-контейнера ModSecurity определены в правиле modsec клонированного Makefile. Он запускает Docker-контейнер ModSecurity на порту 8080 с минимальной конфигурацией, определенной в клонированном файле ./resources/default.conf.template, и значением PARANOIA, установленным на 1.

    При необходимости вы можете изменить эти настройки, отредактировав правило modsec в клонированном Makefile. Доступные параметры конфигурации ModSecurity описаны на Docker Hub.

    Чтобы остановить контейнеры ModSecurity, используйте следующую команду:

    root@kitploit:~
    make modsec_down
    
  3. Запустите GoTestWAF с минимальной конфигурацией, используя один из следующих способов:

    Запустите Docker образ с помощью следующих команд docker pull и :

Другие способы запуска GoTestWAF

В дополнение к запуску Docker образа GoTestWAF, загруженного с Docker Hub, вы можете запустить GoTestWAF, используя следующие варианты:

  • Клонируйте этот репозиторий и соберите Docker образ GoTestWAF из Dockerfile, например:

    root@kitploit:~
    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, например:

    root@kitploit:~
    git clone https://github.com/wallarm/gotestwaf.git
    cd gotestwaf
    go run ./cmd --url=<EVALUATED_SECURITY_SOLUTION_URL>
    
  • Клонируйте этот репозиторий и соберите GoTestWAF как модуль Go:

    root@kitploit:~
    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)

root@kitploit:~
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

root@kitploit:~
## Запуск с набором регрессионного тестирования 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 run
root@kitploit:~
docker 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):

root@kitploit:~
make gotestwaf
make scan_local_from_docker

Запустите GoTestWAF нативно с помощью go, используя следующую команду make: (убедитесь, что ModSec запущен на порту 8080; если нет, обновите значение порта в Makefile):

root@kitploit:~
make scan_local
  • Найдите файл отчета waf-evaluation-report-<date>.pdf в папке reports, которую вы смонтировали в /app/reports внутри контейнера.