
Un fuzzer guiado basado en mutaciones para cortafuegos de aplicaciones web basados en ML.
Un fuzzer guiado basado en mutaciones para Cortafuegos de Aplicaciones Web basados en ML, inspirado en AFL y basado en el FuzzingBook de Andreas Zeller y otros.
Dada una consulta de inyección SQL de entrada, intenta producir una consulta semánticamente invariante que sea capaz de eludir el WAF objetivo. Puedes usar esta herramienta para evaluar la robustez de tu producto permitiendo que WAF-A-MoLE explore el espacio de soluciones para encontrar "puntos ciegos" peligrosos no cubiertos por el clasificador objetivo.

WAF-A-MoLE toma un payload inicial y lo inserta en el Pool de payloads, que gestiona una cola de prioridad ordenada por la puntuación de confianza del WAF sobre cada payload.
Durante cada iteración, la cabeza del Pool de payloads se pasa al Fuzzer, donde se muta aleatoriamente, aplicando uno de los operadores de mutación disponibles.
Todos los operadores de mutación preservan la semántica y aprovechan el alto poder expresivo del lenguaje SQL (en esta versión, MySQL).
A continuación se muestran los operadores de mutación disponibles en la versión actual de WAF-A-MoLE.
| Mutación | Ejemplo |
|---|---|
| Intercambio de mayúsculas/minúsculas | admin' OR 1=1# ⇒ admin' oR 1=1# |
| Sustitución de espacios en blanco | admin' OR 1=1# ⇒ admin'\t\rOR\n1=1# |
| Inyección de comentarios | admin' OR 1=1# ⇒ admin'/**/OR 1=1# |
| Reescritura de comentarios | admin'/**/OR 1=1# ⇒ admin'/*xyz*/OR 1=1#abc |
| Codificación de enteros | admin' OR 1=1# ⇒ admin' OR 0x1=(SELECT 1)# |
| Intercambio de operadores | admin' OR 1=1# ⇒ admin' OR 1 LIKE 1# |
| Invariante lógica | admin' OR 1=1# ⇒ admin' OR 1=1 AND 0<1# |
| Barajado de números | admin' OR 1=1# ⇒ admin' OR 2=2# |
WAF-A-MoLE implementa la metodología presentada en "WAF-A-MoLE: Evading Web Application Firewalls through Adversarial Machine Learning". También se puede encontrar una preimpresión de nuestro artículo en arXiv.
Si quieres citarnos, por favor usa la siguiente referencia (BibTeX):
@inproceedings{demetrio20wafamole,
title={WAF-A-MoLE: evading web application firewalls through adversarial machine learning},
author={Demetrio, Luca and Valenza, Andrea and Costa, Gabriele and Lagorio, Giovanni},
booktitle={Proceedings of the 35th Annual ACM Symposium on Applied Computing},
pages={1745--1752},
year={2020}
}
pip install -r requirements.txt
Puedes evaluar la robustez de tu propio WAF, o probar WAF-A-MoLE contra algunos clasificadores de ejemplo. En el primer caso, echa un vistazo a la clase Model. Tu modelo personalizado necesita implementar esta clase para ser evaluado por WAF-A-MoLE. Ya proporcionamos wrappers para clasificadores de sci-kit learn y keras que pueden extenderse para adaptarse a tu fase de extracción de características (si la hay).
wafamole --help
Usage: wafamole [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
evade Launch WAF-A-MoLE against a target classifier.
wafamole evade --help
Usage: wafamole evade [OPTIONS] MODEL_PATH PAYLOAD
Launch WAF-A-MoLE against a target classifier.
Options:
-T, --model-type TEXT Type of classifier to load
-t, --timeout INTEGER Timeout when evading the model
-r, --max-rounds INTEGER Maximum number of fuzzing rounds
-s, --round-size INTEGER Fuzzing step size for each round (parallel fuzzing
steps)
--threshold FLOAT Classification threshold of the target WAF [0.5]
--random-engine TEXT Use random transformations instead of evolution
engine. Set the number of trials
--output-path TEXT Location were to save the results of the random
engine. NOT USED WITH REGULAR EVOLUTION ENGINE
--help Show this message and exit.
Proporcionamos algunos modelos preentrenados con los que puedes divertirte, ubicados en wafamole/models/custom/example_models. Los clasificadores que usamos se enumeran en la siguiente tabla.
| Nombre del clasificador | Algoritmo |
|---|---|
| WafBrain | Red Neuronal Recurrente |
| ML-Based-WAF | SVM No Lineal |
| ML-Based-WAF | Descenso de Gradiente Estocástico |
| ML-Based-WAF | AdaBoost |
| Basado en tokens | Naive Bayes |
| Basado en tokens | Bosque Aleatorio |
| Basado en tokens | SVM Lineal |
| Basado en tokens | SVM Gaussiana |
| SQLiGoT - Dirigido Proporcional | SVM Gaussiana |
| SQLiGoT - Dirigido No Proporcional | SVM Gaussiana |
| SQLiGoT - No Dirigido Proporcional | SVM Gaussiana |
| SQLiGoT - No Dirigido No Proporcional | SVM Gaussiana |
Además de los WAF basados en ML, WAF-A-MoLE también soporta WAF basados en reglas. Específicamente, proporciona un wrapper para el WAF ModSecurity equipado con el OWASP Core Rule Set (CRS), basado en el proyecto pymodsecurity.
Bypass del clasificador WAF-Brain preentrenado usando un equivalente de admin' OR 1=1#.
wafamole evade --model-type waf-brain wafamole/models/custom/example_models/waf-brain.h5 "admin' OR 1=1#"
Bypass del clasificador SVM ML-Based-WAF preentrenado usando un equivalente de admin' OR 1=1#.
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_svc.dump "admin' OR 1=1#"
Bypass del clasificador SVM ML-Based-WAF preentrenado usando un equivalente de admin' OR 1=1#. Nota: SQLiV5 es un conjunto de datos obtenido de Kaggle expandido con una serie de consultas generadas por el propio WAF-A-MoLE, como prueba de concepto de que las consultas de WAF-A-MoLE pueden mejorar la robustez de un WAF mediante reentrenamiento. Usa mlbasedwaf_svc_sqliv3.dump para evadir el WAF entrenado con el conjunto de datos original de Kaggle (SQLiV3).