最近赶上国内某重大网安活动,要给几个客户推荐一些免费好用的安全产品,WAF 是其中之一。
攻击防护是 WAF 最核心的能力,本文将介绍如何使用科学的方法测试 WAF 防护能力的有效性。
为了保证测试结果公平公正,本文中提到的所有靶机、测试工具、测试样本均为开源项目。
本文的测试对象是业界比较火的几款开源 WAF 项目,测试方法参考了公开的多种样例,其中长亭在线 WAF 效果测试工具相对靠谱,指标和公式看起来很客观、很合理 https://waf-ce.chaitin.cn/detection,本次测试会在这个方法之上略加改动,再添加其他细节作为测评标准。
测试结果以 4 个指标为主:
检测耗时用工具直接统计即可,其他这几个指标如何计算,可以对应到统计学中的预测分类概念:
这样就可以给出上面 3 个指标的计算公式:
对于 ”检测耗时“,长亭只给了一个平均数,数据不够详细,后面我将会拆为 “90% 的平均耗时” 和 “99% 的平均耗时” 用来减小随机性带来的综合影响,以减小误差。
数据来源:所有测试数据均来自于我自己的浏览器。
抓包方式:用 Burp 做代理,浏览器全局指向 Burp ,导出 XML 文件后使用 Python 脚本处理成单个请求。
根据以往的经验,在互联网上暴露的服务,通常正常流量和攻击流量的比例是 100:1 左右,我们按这个方式对样本进行配比。
白样本:刷微博、刷知乎、刷 B 站、刷各种论坛,一共攒了 60707 个 HTTP 请求,总大小 2.7 GB (该过程浪费了我 5 个小时)。
黑样本:为了让测试效果更充分,我使用四个不同的方法采集了黑样本,一共 600 个 HTTP 请求(该过程浪费了我 5 个小时)。
测试指标和测试样本明确之后,现在需要三个东西:WAF 、接收流量的靶机,还有测试工具。
所有 WAF 均使用初始配置,不做任何调整。
靶机用 Nginx ,无论收到什么请求,均直接返回 200 ,配置如下:
location / {
return 200 'hello WAF!';
default_type text/plain;
}
测试工具的需求如下:
找了两款开源 WAF 测试工具,看起来质量都不错,基本符合要求,把两款工具综合一下,再略加其他细节就能用,地址如下:
雷池社区版
TP: 426 TN: 33056 FP: 38 FN: 149
总样本数量: 33669 成功: 33669 错误: 0
检出率: 74.09%
误报率: 8.19%
准确率: 99.44%
90% 平均耗时: 0.73 毫秒
99% 平均耗时: 0.89 毫秒
Coraza
TP: 404 TN: 27912 FP: 5182 FN: 171
总样本数量: 33669 成功: 33669 错误: 0
检出率: 70.26%
误报率: 92.77%
准确率: 84.10%
90% 平均耗时: 3.09 毫秒
99% 平均耗时: 5.10 毫秒
ModSecurity
TP: 400 TN: 25713 FP: 7381 FN: 175
总样本数量: 33669 成功: 33669 错误: 0
检出率: 69.57%
误报率: 94.86%
准确率: 77.56%
90% 平均耗时: 1.36 毫秒
99% 平均耗时: 1.71 毫秒
宝塔 WAF
TP: 224 TN: 32998 FP: 96 FN: 351
总样本数量: 33669 成功: 33669 错误: 0
检出率: 38.96%
误报率: 30.00%
准确率: 98.67%
90% 平均耗时: 0.53 毫秒
99% 平均耗时: 0.66 毫秒
nginx-lua-waf
TP: 213 TN: 32619 FP: 475 FN: 362
总样本数量: 33669 成功: 33669 错误: 0
检出率: 37.04%
误报率: 69.04%
准确率: 97.51%
90% 平均耗时: 0.41 毫秒
99% 平均耗时: 0.49 毫秒
SuperWAF
TP: 138 TN: 33048 FP: 46 FN: 437
总样本数量: 33669 成功: 33669 错误: 0
检出率: 24.00%
误报率: 25.00%
准确率: 98.57%
90% 平均耗时: 0.34 毫秒
99% 平均耗时: 0.41 毫秒
对比表格
漏报数量 | 误报数量 | 平均 | |
---|---|---|---|
雷池社区版 | 149 条 | 38 条 | 0.73 毫秒 |
Coraza | 171 条 | 5182 条 | 3.09 毫秒 |
ModSecurity | 175 条 | 7381 条 | 1.36 毫秒 |
宝塔 WAF | 351 条 | 96 条 | 0.53 毫秒 |
ngx-lua-waf | 362 条 | 475 条 | 0.41 毫秒 |
SuperWAF | 437 条 | 46 条 | 0.34 毫秒 |
为了保证公平公正,本文中所用到的测试工具和测试数据均已开源,可访问以下地址获取:
https://gitee.com/kxlxbb/testwaf
另外,不同的测试样本和测试方法可能会导致测试结果有比较大的差异,需要根据实际情况选择合适的测试样本和测试方法来进行测试。
本次测试的结果仅供参考,不作为评价产品、工具、算法、模型的唯一标准。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.