Website Migration Notice: SafePoint is now operated by CyberServal.Learn more →
DiscussionSLA

六款免费 WAF 的测试报告

Published 3 years ago

# Github Discussion
# Show and tell

Published 3 years ago

profile_photo

maosite

Admin

Updated 3 years ago

0

原文:六款免费 WAF 的测试报告
最近赶上国内某重大网安活动,要给几个客户推荐一些免费好用的安全产品,WAF 是其中之一。

攻击防护是 WAF 最核心的能力,本文将介绍如何使用科学的方法测试 WAF 防护能力的有效性。

为了保证测试结果公平公正,本文中提到的所有靶机、测试工具、测试样本均为开源项目。

测试指标

测试结果以 4 个指标为主:

  • 检出率:用来反应 WAF 检测能力的全面性,没有检出即为 ”漏报“。
  • 误报率:用来反应对正常流量的干扰,不靠谱的结果即为 ”误报“。
  • 准确率:准确率是检出率和误报率的综合指标,避免漏报和误报顾此失彼。
  • 检测耗时:用来反应 WAF 性能,耗时越大则性能越差。

检测耗时用工具直接统计即可,其他这几个指标如何计算,可以对应到统计学中的预测分类概念:

  • TP:将攻击样本拦截的数量。
  • TN:将正常样本放行正确的数量。
  • FN:将攻击样本放行的数量,即 ”漏报“ 数量。
  • FP:将正常请求拦截的数量,即 ”误报“ 数量。

这样就可以给出上面 3 个指标的计算公式:

  • 检出率 = TP / (TP + FN)
  • 误报率 = FP / (TP + FP)
  • 准确率 = (TP + TN) / (TP + TN + FP + FN)

为了减小随机性带来的综合影响,以减小误差,对于 ”检测耗时“ 我将会拆为 “90% 的平均耗时” 和 “99% 的平均耗时” 两个指标。

测试样本

数据来源:所有测试数据均来自于我自己的浏览器。

抓包方式:用 Burp 做代理,浏览器全局指向 Burp,导出 XML 文件后使用 Python 脚本处理成单个请求。

根据以往的经验,在互联网上暴露的服务,通常正常流量和攻击流量的比例是 100:1 左右,我们按这个方式对样本进行配比。

白样本:刷微博、刷知乎、刷B站、刷各种论坛,一共攒了 60707 个 HTTP 请求,总大小 2.7 GB(该过程浪费了我 5 个小时)。

黑样本:为了让测试效果更充分,我使用四个不同的方法采集了黑样本,一共 600 个 HTTP 请求(该过程浪费了我 5 个小时)。

  • 简单的通用攻击流量:部署 DVWA 靶机,所有通用漏洞样例挨个攻击一遍。
  • 常见的攻击流量:把 portswigger 官网提供的所有攻击 Payload 都打一遍。
  • 针对性漏洞流量:部署 VulHub 靶机,所有的经典漏洞使用默认 poc 挨个攻击一遍。
  • 攻击对抗流量:调高 DVWA 的对抗级别,在中级和高级防护的情况下把 DVWA 再攻击一遍。

测试方法

测试指标和测试样本明确之后,现在需要三个东西:WAF、接收流量的靶机,还有测试工具。

所有 WAF 均使用初始配置,不做任何调整。

靶机用 Nginx,无论收到什么请求,均直接返回 200,配置如下:

1location / {
2    return 200 'hello WAF!';
3    default_type text/plain;
4}

测试工具的需求如下:

  • 解析 Burp 的导出结果
  • 按 HTTP 协议重新组包
  • 考虑到后续数据要开源,要删除 Cookie Header
  • 修改 Host Header 字段,让靶机能够正常接收流量
  • 根据请求是不是返回 200 判断是否被 WAF 拦截
  • 对黑白样本混合后均匀发包
  • 自动计算上述 ”测试指标“

找了两款开源 WAF 测试工具,看起来质量都不错,基本符合要求,把两款工具综合一下,再略加其他细节就能用,地址如下:

  • gotestwaf:来自泰国的开源 WAF 测试工具
  • blazehttp:来自长亭的开源 WAF 测试工具

开始测试

雷池社区版

1TP: 426    TN: 33056    FP: 38    FN: 149
2总样本数量: 33669    成功: 33669    错误: 0
3检出率: 74.09%
4误报率: 8.19%
5准确率: 99.44%
6
790% 平均耗时: 0.73毫秒
899% 平均耗时: 0.89毫秒

Coraza

1TP: 404    TN: 27912    FP: 5182    FN: 171
2总样本数量: 33669    成功: 33669    错误: 0
3检出率: 70.26%
4误报率: 92.77%
5准确率: 84.10%
6
790% 平均耗时: 3.09毫秒
899% 平均耗时: 5.10毫秒

ModSecurity

1TP: 400    TN: 25713    FP: 7381    FN: 175
2总样本数量: 33669    成功: 33669    错误: 0
3检出率: 69.57%
4误报率: 94.86%
5准确率: 77.56%
6
790% 平均耗时: 1.36毫秒
899% 平均耗时: 1.71毫秒

宝塔 WAF

1TP: 224    TN: 32998    FP: 96    FN: 351
2总样本数量: 33669    成功: 33669    错误: 0
3检出率: 38.96%
4误报率: 30.00%
5准确率: 98.67%
6
790% 平均耗时: 0.53毫秒
899% 平均耗时: 0.66毫秒

nginx-lua-waf

1TP: 213    TN: 32619    FP: 475    FN: 362
2总样本数量: 33669    成功: 33669    错误: 0
3检出率: 37.04%
4误报率: 69.04%
5准确率: 97.51%
6
790% 平均耗时: 0.41毫秒
899% 平均耗时: 0.49毫秒

SuperWAF

1TP: 138    TN: 33048    FP: 46    FN: 437
2总样本数量: 33669    成功: 33669    错误: 0
3检出率: 24.00%
4误报率: 25.00%
5准确率: 98.57%
6
790% 平均耗时: 0.34毫秒
899% 平均耗时: 0.41毫秒

对比表格

漏报数量误报数量准确率平均
雷池社区版149 条38 条99.44%0.73 毫秒
Coraza171 条5182 条84.10%3.09 毫秒
ModSecurity175 条7381 条77.56%1.36 毫秒
宝塔 WAF351 条96 条98.67%0.53 毫秒
ngx-lua-waf362 条475 条97.51%0.41 毫秒
SuperWAF437 条46 条98.570.34 毫秒

> 雷池社区版的综合表现最好,误报和漏报都是最少的。
>

> Coraza 和 ModSecurity 作为国外的优秀 WAF 引擎项目,检出率很高,但对于国内的场景适配并不会,误报太高。
>

最后

为了保证公平公正,本文中所用到的测试工具和测试数据均已开源,可访问以下地址获取:

https://gitee.com/kxlxbb/testwaf

另外,不同的测试样本和测试方法可能会导致测试结果有比较大的差异,需要根据实际情况选择合适的测试样本和测试方法来进行测试。

本次测试的结果仅供参考,不作为评价产品、工具、算法、模型的唯一标准。

profile_photo

jcomey

Updated 2 years ago

0

mark~

profile_photo

skyhhjmk

Updated 2 years ago

0

不建议使用“宝塔 WAF”这个名字,因为宝塔自己做了一个WAF,是可以独立部署的,但是同时在宝塔面板中有一个“Nginx防火墙”与“Apache防火墙”,在宝塔应用商店中有“Nginx免费防火墙”

profile_photo

youngvery

Updated 2 years ago

0

收藏

profile_photo

lordraiden

Updated a year ago

0

Sorry for answering in English, I have translated the post and I understand that 雷池社区版 is SafeLine and performs pretty well compared to other.
But what is the technology behind SafeLine? how build and maintain the rules? is the core of the WAF a development of chaitin?

六款免费 WAF 的测试报告 | CyberServal | CyberServal