
Framework para Testar WAFs (FTW!)
Este projeto foi criado por pesquisadores da ModSecurity e da Fastly para ajudar a fornecer testes rigorosos para regras de WAF. Ele usa o OWASP Core Ruleset V3 como base para testar regras em um WAF. Cada regra do conjunto de regras é carregada em um arquivo YAML que emite requisições HTTP que acionarão essas regras.
Metas / Casos de uso incluem:
git clone [email protected]:fastly/ftw.gitcd ftwapt-get install python-pippip install -r requirements.txtpy.test test/test_default.py --ruledir test/yamlSe você precisar de um ambiente para testar regras de WAF, foi criado um com Apache, Modsecurity e versão 3.0.0 do OWASP core ruleset. Isso pode ser implantado por:
git clone https://github.com/fastly/waf_testbed.gitvagrant uppy.test test/test_default.py --ruledir=test/yaml --destaddr=domain.com --port 443 --protocol httpspy.test test/integration/test_logcontains.py -s --ruledir=test/integration/*.py com as importações necessárias; um exemplo é mostrado em test/integration/test_logcontains.pytest* no início serão executadas pelo py.test, então crie uma função def test_somewafLogChecker
get_logs(). O FTW chamará esta função após executar o teste, e definirá os datetime de self.start e self.endget_logs()py.test fixtures. Use um decorador de função @pytest.fixture, retorne seu novo objeto LogChecker. Sempre que você usar um argumento de função em seus testes que corresponda ao nome desse @pytest.fixture, ele instanciará seu objeto e facilitará a execução dos testes. Um exemplo disso está no arquivo python do passo 1.*.yaml conforme visto em test/integration/LOGCONTAINSFIXTURE.yaml; a linha log_contains requer uma string que é uma regex. O FTW compilará a string log_contains de cada estágio no arquivo YAML em uma regex. Esta regex será então usada junto com as linhas de logs passadas de get_logs() para procurar uma correspondência. A string log_contains, portanto, deve ser um ID de regra único, pois o FTW é ganancioso e passará na primeira correspondência. Falsos positivos são mitigados pelo horário de início/fim passado para o objeto LogChecker, mas é melhor ficar seguro e usar regexes únicas.get_logs() é chamada, portanto, certifique-se de considerar as chamadas de API se for assim que você recupera seus logs.Embora seja preferível fazer requisições usando o formato YAML, frequentemente testes automatizados exigem fazer muitas requisições dinâmicas. Nesse caso, é recomendado fazer uso do framework py.test para produzir casos de teste que possam ser executados como parte do todo. Geralmente, fazer uma requisição HTTP é simples:
HttpUA()Input() fornecendo quaisquer parâmetros que você não queira que sejam padrãoHttpUA.send_request()Para alguns exemplos, veja os testes de integração http