跳到主要内容

功能发布:Web Fuzzer 组并发能力

· 阅读需 4 分钟
Yak Project
网络安全垂直语言团队

在日常渗透测试里,WebFuzzer 已经成了各位读者最常使用的模块:发/改包、测试 Payload、复现漏洞,基本都离不开它。但对于一些特殊的场景,诸如“并发抢订单”“库存被超刷”这类必须多条请求同时冲击的场景,单个 Web-fuzzer 还是力不从心--多个标签页来回点既耗时间,也很难保持同样节奏。

为了解决这个缺口,我们把 WebFuzzer 做成“组”:一次把多个 webfuzzer 标签拉进同一个组,统一设置并发线程、重复次数、随机延迟等关键参数,最后一键发起,让不同请求同时发送。

接下来就围绕这项能力,介绍它适用的场景、靶场演示方式,以及在实际测试中如何快速上手。

功能要点

  • 多标签一键调度:把需要的 webfuzzer 数据包全部加入同一个组里,启动和停止都只需一次点击。
  • 原配置保持不变: 原始请求包的各种配置、提取器、变量继承、热加载等特性全部沿用,组只是额外的调度层。
  • 组级覆盖(组设置): 可统一设置并发、RepeatTimes、随机延迟、禁用连接池等高频选项,快速覆盖所有成员。

哪些场景最受益

  • 库存/支付/领券竞态:同一 session 下并发触发 buy / cancel / pay,观察是否超卖或重复扣款。
  • 权限/状态穿越:多个身份同时访问敏感接口,验证状态同步和锁机制。
  • 轻量压测**:快速堆叠大量类似请求,辅助排查限流与缓存问题。

靶场演示

更新 vulinbox 后,点击启动,找到如下的靶场入口:

点击进入后,可以看见靶场前端如下:

启动 MITM,点击“初始化”,获得 session_id 生成的流量。

关于 session_id:在靶场里我们把它当成“活动/库存实例 ID”,所有 buy 请求只要共享同一个 session_id,就会竞争同一份库存,方便复现超卖。实际业务中虽然是不同用户、不同登录态在抢,但它们指向的库存标识通常相同(商品 ID、活动 ID、券批次等)。因此只需让 WebFuzzer 们共享同一个“库存 ID”,同时把 user/cookie/token 换成各自的账号信息,就能更贴近真实的并发抢购场景。

再点击 “单次抢购”,获取抢购接口的数据包:

将上面的两个关键的数据包,发送到 Webfuzzer 模块,处理一下,变成如下的 init 初始页,和并发竞争测试组。**

首先,初始化库存,获得 session_id,本次测试为 aa4fc679-fb6c-4f34-87a5-64e0237371db

设置 user1 和 user2 为相同的 session_id ,并且设置组并发配置如下图,保存后,点击开始执行。

可以看见如下数据包:

user1

user2

可以发现,远不止我们初始化库存时设置的 5 个,在 vulinbox 页面输入我们测试的 session_id,点击刷新状态,可以发现库存直接变成负数了。

靶场源码

后端实现位于 common/vulinbox/vul_groupfuzzer.goinventorySession 结构体记录商品、剩余库存和成功列表;

groupFuzzerSessions 则充当线程安全的会话存储。

主要部分就是 /buy 先用读锁判断库存,再 time.Sleep(20 * time.Millisecond) 后进入写锁扣减,刻意制造“检查—扣减”之间的竞态窗口,方便并发冲击触发超卖。

具体函数在 vulinbox:https://github.com/yaklang/yaklang/blob/main/common/vulinbox /vul_groupfuzzer.go#L105-L158

总结

组并发没有改变 WebFuzzer 的核心玩法,只是提供了一个更顺手的调度层:把几个常用 Fuzzer 丢进同一个组,就能统一调并发、重复次数,集中启动或停止。

对于需要验证竞态、状态同步、轻量压测的渗透测试场景,这套组合能更快复现真实情况。

靶场只是示范,真正的实践是把手头的 Fuzzer 模板整理成组,随时对目标接口发起定制化的并发测试。


本文首发于 Yak Project 公众号,阅读原文