ncmonster

如何科学的测试 WAF

  •  
  •   ncmonster · Jul 14, 2023 · 3313 views
    This topic created in 1043 days ago, the information mentioned may be changed or developed.

    最近赶上国内某重大网安活动,要给几个客户推荐一些免费好用的安全产品,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 replies    2023-07-15 14:02:21 +08:00
    96368a
        1
    96368a  
       Jul 14, 2023
    长亭的大佬啊,支持一下,另外,这个测试里面雷池是真的强啊
    emnkcn
        2
    emnkcn  
       Jul 14, 2023
    这个项目外人访问不了?
    googlefans
        3
    googlefans  
       Jul 15, 2023
    阿里云有 waf 服务
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1309 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 17:34 · PVG 01:34 · LAX 10:34 · JFK 13:34
    ♥ Do have faith in what you're doing.