Проект с открытым исходным кодом на 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 после появления сообщения с запросом электронной почты, или вы можете использовать --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-тестов у вас должна быть работающая конечная точка, и нужно использовать опцию CLI --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).
## Проверка результатов оценки