一个基于引导变异的模糊测试工具,用于基于机器学习的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。 我们使用的分类器如下表所示。
除了基于机器学习的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注入。
提供了一个Google Colaboratory笔记本,其中包含其中一些模型的训练例程,使用了原始WAF-A-MoLE数据集(修改为SQLiV5格式)。只要数据集格式与SQLiV5.json相同,任何数据集都可以使用。
首先,创建一个实现extract_features和classify方法的自定义Model类。
class YourCustomModel(Model):
def extract_features(self, value: str):
# TODO: extract features
feature_vector = your_custom_feature_function(value)
return feature_vector
def classify(self, value):
# TODO: compute confidence
confidence = your_confidence_eval(value)
return confidence
然后,从模型创建一个对象,并实例化一个使用您的模型类的engine对象。
model = YourCustomModel() #your init
engine = EvasionEngine(model)
result = engine.evaluate(payload, max_rounds, round_size, timeout, threshold)
我们针对所有示例模型评估了WAF-A-MoLE。
下图显示了WAF-A-MoLE将admin' OR 1=1#载荷变异,直到每个分类器将其视为良性所花费的时间。
x轴表示时间(秒,对数刻度)。 y轴表示置信度值,即分类器认为给定载荷是SQL注入的确信程度(百分比)。
请注意,“50%确信”一个载荷是SQL注入相当于抛硬币。 这是通常的分类阈值:如果置信度较低,则载荷被分类为良性。

实验在DigitalOcean Standard Droplets上执行。
欢迎提问、报告错误和提交拉取请求。
如果您有兴趣扩展此项目,我们期待以下贡献:
| 分类器名称 | 算法 |
|---|
| WafBrain | 循环神经网络 |
| ML-Based-WAF | 非线性支持向量机 |
| ML-Based-WAF | 随机梯度下降 |
| ML-Based-WAF | AdaBoost |
| 基于令牌 | 朴素贝叶斯 |
| 基于令牌 | 随机森林 |
| 基于令牌 | 线性支持向量机 |
| 基于令牌 | 高斯支持向量机 |
| SQLiGoT - 有向比例 | 高斯支持向量机 |
| SQLiGoT - 有向非比例 | 高斯支持向量机 |
| SQLiGoT - 无向比例 | 高斯支持向量机 |
| SQLiGoT - 无向非比例 | 高斯支持向量机 |