如何科学的测试 WAF - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ncmonster
V2EX    信息安全

如何科学的测试 WAF

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

    最近赶上国内某重大网安活动,要给几个客户推荐一些免费好用的安全产品,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     Solana     841 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 21:29 PVG 05:29 LAX 13:29 JFK 16:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86