Um projeto open-source em Golang para avaliar diferentes ferramentas de segurança de API e WAF quanto à lógica de detecção e bypasses
GoTestWAF é uma ferramenta para simulação de ataques a APIs e OWASP que suporta uma ampla variedade de protocolos de API, incluindo REST, GraphQL, gRPC, SOAP, XMLRPC, entre outros.
Foi projetada para avaliar soluções de segurança de aplicações web, como proxies de segurança de API, Web Application Firewalls, IPS, gateways de API, entre outros.
O GoTestWAF gera requisições maliciosas usando payloads codificados inseridos em diferentes partes das requisições HTTP: seu corpo, cabeçalhos, parâmetros de URL, etc. As requisições geradas são enviadas para a URL da solução de segurança de aplicações especificada durante a inicialização do GoTestWAF. Os resultados da avaliação da solução de segurança são registrados no arquivo de relatório criado na sua máquina.
As condições padrão para geração de requisições são definidas na pasta testcases nos arquivos YAML com o seguinte formato:```yaml
payload:
* `payload` é uma amostra de ataque malicioso (por exemplo, payload XSS como ```<script>alert(111)</script>``` ou algo mais sofisticado).
Como o formato da string YAML é obrigatório para payloads, eles devem ser [codificados como dados binários](https://yaml.org/type/binary.html).
* `encoder` é um codificador a ser aplicado ao payload antes de colocá-lo na requisição HTTP. Os codificadores possíveis são:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain (para manter a string do payload como está)
* XML Entity
* `placeholder` é um local dentro da requisição HTTP onde o payload codificado deve estar. Os placeholders possíveis são:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
O placeholder `RawRequest` permitirá que você faça uma requisição HTTP arbitrária. O payload é substituído pela substituição da string `{{payload}}` no caminho da URL, nos Headers ou no corpo. Campos do placeholder `RawRequest`:
* `method`
* `path`
* `headers`
* `body`
Campos obrigatórios para o placeholder `RawRequest`:
* campo `method`
Exemplo:
```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` é um nome de todo o grupo de payloads no arquivo. Pode ser arbitrário, mas deve refletir o tipo de ataques no arquivo.
A geração de requisições é um processo de três etapas que envolve a multiplicação da quantidade de payloads pela quantidade de encoders e placeholders.
Digamos que você definiu 2 **payloads**, 3 **encoders** (Base64, JSUnicode e URL) e 1 **placeholder** (URLParameter - parâmetro HTTP GET).
Neste caso, o GoTestWAF enviará 2x3x1 = 6 requisições em um caso de teste.
Durante a execução do GoTestWAF, você também pode escolher casos de teste entre dois incorporados: OWASP Top-10, OWASP-API,
ou o seu próprio (usando a [opção de configuração](#configuration-options) `testCasePath`).
## Requisitos
* O GoTestwaf suporta todos os sistemas operacionais populares (Linux, Windows, macOS) e pode ser compilado nativamente
se o [Go](https://golang.org/doc/install) estiver instalado no sistema. Se você quiser executar o GoTestWaf nativamente,
certifique-se de ter o navegador Chrome para poder gerar relatórios em PDF. Caso você não tenha o Chrome,
você pode criar um relatório em formato HTML.
* Se estiver executando o GoTestWAF como contêiner Docker, certifique-se de ter [instalado e configurado o Docker](https://docs.docker.com/get-docker/),
e que o GoTestWAF e a solução de segurança de aplicação avaliada estejam conectados à mesma [rede Docker](https://docs.docker.com/network/).
* Para que o GoTestWAF seja iniciado com sucesso, certifique-se de que o endereço IP da máquina que executa o GoTestWAF esteja na lista de permissões
da máquina que executa a solução de segurança de aplicação.
## Início rápido com Docker
As etapas abaixo mostram como baixar e iniciar o GoTestWAF com configuração mínima no Docker.
1. Baixe a [imagem do GoTestWAF](https://hub.docker.com/r/wallarm/gotestwaf) do Docker Hub:
```
docker pull wallarm/gotestwaf
```
2. Inicie a imagem do GoTestWAF:
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
```
Se necessário, você pode substituir `${PWD}/reports` pelo caminho para outra pasta usada para colocar o relatório de avaliação.
Se você não quiser enviar o relatório por e-mail opcionalmente, basta pressionar Enter após a mensagem de solicitação de e-mail aparecer, ou você pode usar --noEmailReport para pular a mensagem:
```sh
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL> --noEmailReport
```
Se a ferramenta de segurança avaliada estiver disponível externamente, você pode omitir a opção `--network="host"`. Esta opção permite a interação de contêineres Docker em execução em 127.0.0.1.
Para realizar os testes gRPC você deve ter um endpoint funcional e usar a opção de 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. Verifique seu e-mail para o relatório.
Você avaliou com sucesso sua solução de segurança de aplicação usando o GoTestWAF com configuração mínima.
Para aprender opções de configuração avançadas, use este [link](#configuration-options).
## Verificando os resultados da avaliação