
Framework zum Testen von WAFs (FTW!)
Dieses Projekt wurde von Forschern von ModSecurity und Fastly erstellt, um rigorose Tests für WAF-Regeln bereitzustellen. Es verwendet das OWASP Core Ruleset V3 als Grundlage, um Regeln auf einer WAF zu testen. Jede Regel aus dem Regelsatz wird in eine YAML-Datei geladen, die HTTP-Anfragen ausgibt, die diese Regeln auslösen.
Ziele / Anwendungsfälle umfassen:
git clone [email protected]:fastly/ftw.gitcd ftwapt-get install python-pippip install -r requirements.txtpy.test test/test_default.py --ruledir test/yamlWenn Sie eine Umgebung zum Testen von WAF-Regeln benötigen, wurde eine mit Apache, Modsecurity und Version 3.0.0 des OWASP-Kernregelsatzes erstellt. Diese kann wie folgt bereitgestellt werden:
git clone https://github.com/fastly/waf_testbed.gitvagrant up eingebenpy.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-Datei mit den erforderlichen Importen; ein Beispiel finden Sie in test/integration/test_logcontains.pytest* beginnen, werden von py.test ausgeführt, erstellen Sie also eine Funktion def test_somewafLogChecker erbt
get_logs(). FTW ruft diese Funktion nach dem Testlauf auf und legt die Datums-/Uhrzeitwerte von self.start und self.end fest.get_logs() zurück.py.test-Fixtures. Verwenden Sie einen Funktionsdekorator @pytest.fixture, geben Sie Ihr neues LogChecker-Objekt zurück. Immer wenn Sie in Ihren Tests ein Funktionsargument verwenden, das mit dem Namen dieses @pytest.fixture übereinstimmt, wird Ihr Objekt instanziiert und das Ausführen von Tests erleichtert. Ein Beispiel dafür finden Sie in der Python-Datei aus Schritt 1.*.yaml-Format, wie in test/integration/LOGCONTAINSFIXTURE.yaml zu sehen. Die log_contains-Zeile erfordert eine Zeichenfolge, die ein regulärer Ausdruck ist. FTW kompiliert die log_contains-Zeichenfolge aus jeder Stufe in der YAML-Datei in einen regulären Ausdruck. Dieser reguläre Ausdruck wird dann zusammen mit den Protokollzeilen, die von get_logs() übergeben werden, verwendet, um nach einer Übereinstimmung zu suchen. Die log_contains-Zeichenfolge sollte daher eine eindeutige Regel-ID sein, da FTW gierig ist und die erste Übereinstimmung annimmt. Falsch-positive Ergebnisse werden durch die Start-/Endzeit, die an das LogChecker-Objekt übergeben wird, gemildert, aber es ist am besten, auf Nummer sicher zu gehen und eindeutige reguläre Ausdrücke zu verwenden.get_logs() aufgerufen; stellen Sie daher sicher, dass Sie API-Aufrufe berücksichtigen, falls Sie Ihre Protokolle auf diese Weise abrufen.Obwohl es bevorzugt wird, Anfragen im YAML-Format zu stellen, erfordern automatisierte Tests oft viele dynamische Anfragen. In einem solchen Fall wird empfohlen, das py.test-Framework zu verwenden, um Testfälle zu erstellen, die als Teil des Ganzen ausgeführt werden können. Im Allgemeinen ist das Erstellen einer HTTP-Anfrage einfach:
HttpUA()-KlasseInput()-Klasse und geben Sie die Parameter an, die Sie nicht standardmäßig haben möchtenHttpUA.send_request()Einige Beispiele finden Sie in den HTTP-Integrationstests