V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ncmonster
V2EX  ›  信息安全

如何科学的测试 WAF

  •  
  •   ncmonster · 2023-07-14 20:11:28 +08:00 · 2249 次点击
    这是一个创建于 528 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    本文的测试对象是业界比较火的几款开源 WAF 项目,测试方法参考了公开的多种样例,其中长亭在线 WAF 效果测试工具相对靠谱,指标和公式看起来很客观、很合理 https://waf-ce.chaitin.cn/detection,本次测试会在这个方法之上略加改动,再添加其他细节作为测评标准。

    测试指标

    测试结果以 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 ,配置如下:

    location / {
        return 200 'hello WAF!';
        default_type text/plain;
    }
    

    测试工具的需求如下:

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

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

    • gotestwaf:来自泰国的开源 WAF 测试工具
    • blazehttp:来自长亭的开源 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

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

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

    3 条回复    2023-07-15 14:02:21 +08:00
    96368a
        1
    96368a  
       2023-07-14 23:43:11 +08:00
    长亭的大佬啊,支持一下,另外,这个测试里面雷池是真的强啊
    emnkcn
        2
    emnkcn  
       2023-07-14 23:49:23 +08:00
    这个项目外人访问不了?
    googlefans
        3
    googlefans  
       2023-07-15 14:02:21 +08:00
    阿里云有 waf 服务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5402 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:52 · PVG 14:52 · LAX 22:52 · JFK 01:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.