
Framework for Testing WAFs (FTW!)
Ce projet a été créé par des chercheurs de ModSecurity et Fastly pour fournir des tests rigoureux pour les règles WAF. Il utilise le OWASP Core Ruleset V3 comme référence pour tester les règles sur un WAF. Chaque règle de l'ensemble de règles est chargée dans un fichier YAML qui émet des requêtes HTTP qui déclencheront ces règles.
Objectifs / Cas d'utilisation :
git clone [email protected]:fastly/ftw.gitcd ftwapt-get install python-pippip install -r requirements.txtpy.test test/test_default.py --ruledir test/yamlSi vous avez besoin d'un environnement pour tester les règles WAF, un environnement a été créé avec Apache, Modsecurity et la version 3.0.0 de l'ensemble de règles de base OWASP. Il peut être déployé en :
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 avec les importations nécessaires, un exemple est donné dans test/integration/test_logcontains.pytest* seront exécutées par py.test, créez donc une fonction def test_somewafLogChecker
get_logs(). FTW appellera cette fonction après avoir exécuté le test, et définira les datetime de self.start et self.endget_logs()fixtures py.test. Utilisez un décorateur de fonction @pytest.fixture, retournez votre nouvel objet . Chaque fois que vous utilisez un argument de fonction dans vos tests qui correspond au nom de ce , il instanciera votre objet et facilitera l'exécution des tests. Un exemple est donné dans le fichier python de l'étape 1.Bien qu'il soit préférable d'effectuer des requêtes en utilisant le format YAML, les tests automatisés nécessitent souvent de nombreuses requêtes dynamiques. Dans ce cas, il est recommandé d'utiliser le framework py.test pour produire des cas de test qui peuvent être exécutés dans le cadre de l'ensemble. Généralement, effectuer une requête HTTP est simple :
HttpUA()Input() en fournissant les paramètres que vous ne souhaitez pas par défautHttpUA.send_request()Pour quelques exemples, voir les tests d'intégration http
LogChecker@pytest.fixture*.yaml comme dans test/integration/LOGCONTAINSFIXTURE.yaml, la ligne log_contains nécessite une chaîne qui est une regex. FTW compilera la chaîne log_contains de chaque étape du fichier YAML en une regex. Cette regex sera ensuite utilisée avec les lignes de logs passées depuis get_logs() pour rechercher une correspondance. La chaîne log_contains doit donc être un identifiant de règle unique car FTW est gourmand et passera à la première correspondance. Les faux positifs sont atténués par l'heure de début/fin passée à l'objet LogChecker, mais il est préférable de rester prudent et d'utiliser des regex uniques.get_logs() est appelée, assurez-vous donc de prendre en compte les appels API si c'est ainsi que vous récupérez vos logs.