
Framework for Testing 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 -Objekt zurück. Immer wenn Sie in Ihren Tests ein Funktionsargument verwenden, das mit dem Namen dieses ü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.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
LogChecker@pytest.fixture*.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.