
Framework per testare i WAF (FTW!)
Questo progetto è stato creato da ricercatori di ModSecurity e Fastly per fornire test rigorosi per le regole WAF. Utilizza l'OWASP Core Ruleset V3 come baseline per testare le regole su un WAF. Ogni regola del ruleset viene caricata in un file YAML che emette richieste HTTP che attiveranno queste regole.
Obiettivi / Casi d'uso includono:
git clone [email protected]:fastly/ftw.gitcd ftwapt-get install python-pippip install -r requirements.txtpy.test test/test_default.py --ruledir test/yamlSe hai bisogno di un ambiente per testare le regole WAF, ne è stato creato uno con Apache, Modsecurity e la versione 3.0.0 dell'OWASP core ruleset. Può essere distribuito con:
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 con le importazioni necessarie, un esempio è mostrato in test/integration/test_logcontains.pytest* saranno eseguite da py.test, quindi crea una funzione def test_somewafLogChecker
get_logs(). FTW chiamerà questa funzione dopo aver eseguito il test, e imposterà i datetime di self.start e self.endget_logs()py.test fixtures. Usa un decoratore di funzione @pytest.fixture, restituisci il tuo nuovo oggetto LogChecker. Ogni volta che usi un argomento di funzione nei tuoi test che corrisponde al nome di quel @pytest.fixture, istanzierà il tuo oggetto e renderà più facile eseguire i test. Un esempio di ciò è nel file python del passaggio 1.*.yaml come visto in test/integration/LOGCONTAINSFIXTURE.yaml, la riga log_contains richiede una stringa che è una regex. FTW compilerà la stringa log_contains da ogni stage nel file YAML in una regex. Questa regex verrà poi usata insieme alle righe di log passate da get_logs() per cercare una corrispondenza. La stringa log_contains, quindi, dovrebbe essere un rule-id unico poiché FTW è greedy e passerà alla prima corrispondenza. I falsi positivi sono mitigati dal tempo di inizio/fine passato all'oggetto LogChecker, ma è meglio stare sicuri e usare regex uniche.get_logs(), quindi assicurati di considerare le chiamate API se è così che recuperi i tuoi log.Sebbene sia preferibile effettuare richieste usando il formato YAML, spesso i test automatizzati richiedono molte richieste dinamiche. In tal caso è consigliabile utilizzare il framework py.test per produrre casi di test che possano essere eseguiti come parte dell'intero. In generale, effettuare una richiesta HTTP è semplice:
HttpUA()Input() fornendo qualunque parametro non si voglia siano predefinitiHttpUA.send_request()Per alcuni esempi vedi i test di integrazione http