一个基于引导变异的模糊测试工具,用于基于机器学习的Web应用防火墙,灵感来自AFL,并基于Andreas Zeller等人的FuzzingBook。
给定一个SQL注入查询,它尝试生成一个语义不变的查询,能够绕过目标WAF。 您可以使用此工具来评估您的产品的鲁棒性,让WAF-A-MoLE探索解决方案空间,以发现目标分类器未覆盖的危险“盲点”。

WAF-A-MoLE接收一个初始载荷并将其插入池中,该池管理一个按每个载荷的WAF置信度分数排序的优先级队列。
每次迭代中,池的头部被传递给模糊器,在其中通过应用一个可用的变异操作符进行随机变异。
所有变异操作符都是保持语义不变的,并利用了SQL语言的高表达能力(在此版本中为MySQL)。
以下是WAF-A-MoLE当前版本中可用的变异操作符。
| 变异操作 | 示例 |
|---|---|
| 大小写交换 | admin' OR 1=1# ⇒ admin' oR 1=1# |
| 空白替换 | admin' OR 1=1# ⇒ admin'\t\rOR\n1=1# |
| 注释注入 | admin' OR 1=1# ⇒ admin'/**/OR 1=1# |
| 注释重写 | admin'/**/OR 1=1# ⇒ admin'/*xyz*/OR 1=1#abc |
| 整数编码 | admin' OR 1=1# ⇒ admin' OR 0x1=(SELECT 1)# |
| 运算符交换 | admin' OR 1=1# ⇒ admin' OR 1 LIKE 1# |
| 逻辑不变 | admin' OR 1=1# ⇒ admin' OR 1=1 AND 0<1# |
| 数字洗牌 | admin' OR 1=1# ⇒ admin' OR 2=2# |
WAF-A-MoLE实现了"WAF-A-MoLE: Evading Web Application Firewalls through Adversarial Machine Learning"中提出的方法。 我们的文章预印本也可在arXiv上找到。
如果您想引用我们,请使用以下(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
您可以评估自己WAF的鲁棒性,或者尝试WAF-A-MoLE对抗一些示例分类器。 在第一种情况下,请查看Model类。您的自定义模型需要实现此类才能被WAF-A-MoLE评估。 我们已为sci-kit learn和keras分类器提供了包装器,可根据您的特征提取阶段(如果有)进行扩展。
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.
我们提供了一些预训练模型供您尝试,位于wafamole/models/custom/example_models。 我们使用的分类器如下表所示。
| 分类器名称 | 算法 |
|---|---|
| WafBrain | 循环神经网络 |
| ML-Based-WAF | 非线性支持向量机 |
| ML-Based-WAF | 随机梯度下降 |
| ML-Based-WAF | AdaBoost |
| 基于令牌 | 朴素贝叶斯 |
| 基于令牌 | 随机森林 |
| 基于令牌 | 线性支持向量机 |
| 基于令牌 | 高斯支持向量机 |
| SQLiGoT - 有向比例 | 高斯支持向量机 |
| SQLiGoT - 有向非比例 | 高斯支持向量机 |
| SQLiGoT - 无向比例 | 高斯支持向量机 |
| SQLiGoT - 无向非比例 | 高斯支持向量机 |
除了基于机器学习的WAF外,WAF-a-MoLE还支持基于规则的WAF。 具体来说,它为配备了OWASP核心规则集(CRS)的ModSecurity WAF提供了一个包装器,基于pymodsecurity项目。
使用admin' OR 1=1#的等价形式绕过预训练的WAF-Brain分类器。
wafamole evade --model-type waf-brain wafamole/models/custom/example_models/waf-brain.h5 "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的ML-Based-WAF支持向量机分类器。
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_svc.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的ML-Based-WAF支持向量机分类器。请注意,SQLiV5是一个来自Kaggle的数据集,并由WAF-A-MoLE自身生成的一系列查询进行了扩展,作为概念证明,表明WAF-A-MoLE查询可以通过再训练增强WAF的鲁棒性。使用mlbasedwaf_svc_sqliv3.dump绕过使用原始Kaggle数据集(SQLiV3)训练的WAF。
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_svc_sqliv5.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的ML-Based-WAF随机梯度下降分类器。
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_sgd.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的ML-Based-WAF AdaBoost分类器(运行时间较其他模型更长,大约需要2到5分钟)。
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_ada.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的基于令牌的朴素贝叶斯分类器。
wafamole evade --model-type token wafamole/models/custom/example_models/naive_bayes_trained.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的基于令牌的随机森林分类器。
wafamole evade --model-type token wafamole/models/custom/example_models/random_forest_trained.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的基于令牌的线性支持向量机分类器。
wafamole evade --model-type token wafamole/models/custom/example_models/lin_svm_trained.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的基于令牌的高斯支持向量机分类器。
wafamole evade --model-type token wafamole/models/custom/example_models/gauss_svm_trained.dump "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过预训练的SQLiGOT分类器。
使用DP、UP、DU或UU分别表示有向比例、无向比例、有向非比例和无向非比例。
wafamole evade --model-type DP wafamole/models/custom/example_models/graph_directed_proportional_sqligot "admin' OR 1=1#"
使用admin' OR 1=1#的等价形式绕过OWASP ModSecurity CRS。
用户还需要指定偏执等级以及CRS规则所在路径(例如/etc/coreruleset)。
wafamole evade --model-type modsecurity_pl[1-4] /etc/coreruleset "admin' OR 1=1#"
在SQLiGoT上启动评估前注意
这些分类器比其他分类器更鲁棒,因为特征提取阶段产生的向量结构更复杂,并且所有预训练分类器都经过了强正则化。 某些变体可能需要数小时才能生成实现绕过的载荷(请参见基准测试部分)。
关于较新的ML-Based-WAF模型的说明
最近添加了一些基于vladan-stojnic的ML-Based-WAF稍作修改的模型,它们来自WAF-A-MoLE的扩展版本,名为wafamole++,由nidnogg开发。测试AdaBoost模型可能需要比平时更长的时间(通常2到5分钟)。
存在使用SQLiV5.json数据集训练的变体,而大多数默认使用WAF-A-MoLE数据集中的原始SQL注入。