bfs-clicker获取动态加载的js-Ai渗透测试前置

admin 2026-08-27 05:09:53 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: bfs-clicker是基于Playwright的自动化工具,解决SPA动态接口发现难题。它通过BFS或DFS自动遍历控件,以标签页隔离实现零成本回退,用状态指纹避免轮询爆炸,自动处理弹窗并跳过付款操作。配合Burp捕获流量并输出接口清单与节点图,建议在授权渗透前期使用以快速摸清攻击面。 综合评分: 88 文章分类: 渗透测试,安全工具,WEB安全,爬虫,红队


bfs-clicker 获取动态加载的js-Ai渗透测试前置

Lior1969 Lior1969

Moonlight安全

2026年8月26日 19:18 北京

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

让 Playwright 开着真浏览器,把「点一下按钮才冒出来的接口」一个一个扒出来。

PlaywrightBFS / DFS断点续跑跳过付款/授权Burp 节点全览图

1. 做安全测试,第一个卡住的往往不是挖洞

而是「这个系统到底有哪些接口」。我们都是从接口摸起:先拿到一份尽量全的清单,后面才好铺开。

问题是,后台这种东西——尤其现在的 SPA 控制台——大量接口根本不在页面源码里。它们是你点一下按钮才发出去的:菜单展开、弹窗确认、点某一行,才带出来一个请求。

试过的几条路,都不太顺:

  • 静态解析

    ,读 HTML 和 JS,只能拿到写死在代码里的 URL,运行时才拼出来的它拿不到。

  • 被动爬虫

    ,像 katana 这种,翻 JS 里的 URL,但「点了才触发」的那批同样漏。

  • 手动点

    ,最靠谱,也最折磨。几百个模块一个个点,点完手都酸,还容易漏。

绕了半圈发现,缺的不是解析能力,是「真的去用一遍」的能力。那就干脆让浏览器替我们点。

2. 于是有了 bfs-clicker

它就是一个很朴素的思路:用 Playwright 开真浏览器,从入口页出发,自动点遍所有能点的控件。能往下钻就钻进去,钻到底就把标签页关掉、往上回一步、点下一个兄弟按钮。

顺手把两个常见麻烦也处理了:

  • 遇到协议弹窗,它自己滚到底、勾选、点同意、关掉,不用你管。
  • 遇到「付款、支付、授权、开通」这种按钮,它躲着走——只记下来标个橙,不真点。这是安全测试的底线,不是我求稳,是真不能点。

流量让它走 Burp 代理(默认 127.0.0.1:8080),全程能看历史,回头想复盘哪条路径都找得到。

3. 几个我自己觉得还算关键的处理

写的时候踩了些坑,有几个点后来觉得挺值,拿出来说下。

1.每个状态开一个标签页

探索子节点时,在新标签页里从根重放路径到达,父标签页不动。回退就零成本——页面没更深的就关,子页面都耗尽就把上一级也关掉。

2.能直达就直接去

控件 href 是真实 URL 时,直接 goto,不重新载根页再点一遍路径。控制台动辄上百个模块链接,这一下省掉上百次根页重载。

3.指纹别只看 URL

状态用 md5(URL+标题+交互面描述)。SPA 页面经常有个数字在轮询,光看 URL 会判定成新状态,不停炸;把「能点什么」算进去就没这问题。

4.危险的干脆不点

skipTextPatterns 把付款、授权、开通这类词全放进去,命中就只记录、不点击。宁可少一个接口,也不能误触一个开通按钮。

遍历顺序我留了个开关 config.orderbfs 一层层铺开,先把 URL 地图的覆盖做全(默认这个);dfs 一个功能往深挖。想要「全」选 BFS,想「深」选 DFS。

4. 它长什么样

bfs-clicker 工作流

是

否

npm run crawl

config.js / index.js 加载配置

login.js 手动登录存 session

根标签页 startUrl

BFS 队列/DFS 栈 标签页即状态

逐控件点击

可交互?

href 直达 或 新标签重放路径

非交互 忽略

协议弹窗 滚到底勾选+同意

付款/授权 只记不点

流量捕获 traffic.jsonl + har

checkpoint 持久化 断点续跑

稳定后截图 states/*.png

tree.json + checkpoint.json

overview.html 节点全览图

5. 能干的事

| 能力 | 说明 | | — | — | | 真浏览器点击 | 真实点所有可交互元素,动态路由 / 接口(菜单、按钮、弹窗触发)能抓到 | | BFS / DFS | order 一键切:逐层全览 or 深度优先 | | 标签页即状态 | 父标签不导航,回退零成本;子页面耗尽自动关 | | URL 级全局去重 | 子节点 URL 撞上任何已访问节点 → 判走错路,只记一条边;重复路径写进 backEdges | | 状态指纹去重 | SPA 轮询数字不会引起状态爆炸 | | 协议弹窗自动同意 | 滚到底 → 勾选 → 点同意 → 确认关 | | 断点续跑 | 每状态写 checkpoint.json,随时 Ctrl+Cnpm run resume 接着跑 | | 流量捕获 + 去重 | traffic.jsonltraffic.har;去重键 = 归一化 URL + 状态 + POST body 指纹 |

6. 用起来,五步

npm install

登录一次,存下会话

npm run login

会开一个有头浏览器让你登录,登录成功自动存到 output/session.json。判断逻辑也是通用的:URL 不再是登录页 + 有会话 cookie(auth/session/token/uid/jwt 这类)。想更精确,加个 loginLoggedInUrlContains 特征串。

开爬

npm run crawl      # 默认 BFS,maxStates=500
npm run resume     # 断点续跑
npm run demo       # 本地演示站冒烟(免登录、无头、不走代理)

不想改配置文件?用环境变量

MAX_STATES=20 npm run crawl   # 限状态总数,先小范围试点
MAX_DEPTH=3  npm run crawl     # 限最大深度
RESUME=1     npm run crawl     # 等价于 resume

7. 换个目标,只动三行

代码没有绑死任何站点。换目标改 config.json

| 项 | 干什么 | | — | — | | startUrl | 入口 URL。控制台太大,建议指到具体产品,不然爬不动 | | includeUrlPattern | 正则,只有匹配的子状态才继续钻,防爬野 | | loginUrl | 登录页 URL,登录一次复用会话 |

常用的还有:

| 项 | 默认 | 说明 | | — | — | — | | order | bfs | bfs 铺开 / dfs 深挖 | | maxDepthmaxStates | 4500 | 深度 / 状态上限(设为 0 不限) | | useProxy | true | 走 Burp 127.0.0.1:8080;demo 自动关 | | skipTextPatterns | 见下 | 只记不点的那些词(付款/授权/开通) | | dedupeByUrl | true | URL 撞上已访问节点 → 判走错路,只记边 | | rediscoverOnReturn | true | 回父标签再采一遍控件,补动态新增的 |

关于跳过词:默认里有「付款、支付、购买、下单、续费、开通、升级」和英文的 payment / purchase / checkout / authorize。命中的按钮不会点,但会进 tree.json 标成 skipped: true,截图也存。哪天你想让它真点,就把对应词删了再跑。

8. 断点续跑,长爬不再虚

每探索一个状态就写 output/checkpoint.json,visited 指纹、全部状态、当前 DFS 栈(或 BFS 队列)都记着。中途 Ctrl+C 没关系,npm run resume 从上次位置继续,已经耗尽的状态不会重跑

中间浏览器崩了也没事,有自愈护盾:崩了自动重启浏览器接着跑。长爬取最怕的就是跑一半全没,这点算是给兜底了。

9. 它留下了什么

| 文件 | 是什么 | | — | — | | tree.json | 嵌套状态树:URL / 标题 / 点击路径 / 控件清单 / 子节点,外加 backEdges 重复路径 | | overview.html | 节点全览图:可折叠状态树 + 截图 + 跳过/失败标记 + 重复路径表 | | states/*.png | 每个新状态一张截图 | | traffic.jsonl | 捕获的请求流量 | | traffic.har | HAR 格式,能导进 Burp 或其他工具 |

所以它的产出其实分三层:

  • 接口层

    traffic.jsonl 把被点出来的请求全记下来,喂给后面的信息提取 / 攻击面汇总。

  • 结构层

    tree.json 是一张能点的地图,动态路由(菜单、按钮触发的)都在里面。

  • 可视化层

    overview.html 一眼看出哪些节点回了老路(重复路径表)、哪些按钮被跳过(橙)。

10. 先说清楚:只做授权测试

这个工具会真点页面上的控件。只用于你拥有、或拿到明确授权的目标。用在没授权的系统上,不管是被人肉点还是被脚本点,都是违规。

  • 跳过付款 / 授权类

    skipTextPatterns 默认覆盖,只记不点,防误触越权改动。

  • 流量走 Burp

    useProxy:true 时所有请求经 127.0.0.1:8080,进 HTTP History,随时复盘。

  • 它发的是页面自身的请求

    :是「点按钮带出来的正常业务流量」,不是主动构造的攻击 payload。

11. 适合谁用

| 场景 | 值不值 | 备注 | | — | — | — | | Web 控制台 / SPA 后台摸底 | ★★★★★ | 主战场,动态路由杀手 | | 授权红队 / 渗透前侦察 | ★★★★ | 快速把攻击面摊开 | | 配合 Burp 抓全量流量 | ★★★★ | 代理一挂,全程可见 | | 纯静态页 / 不用登录的站 | ★★★ | 能用,但优势不大 |

12. 收个尾

配上 Burp 和流量捕获,它给你的就是一份带交互地图的接口清单——该在源码里的、该在 JS 里的、该手动点的,最后都在这张图上。

一句话:把「点按钮」交给机器,把「判断」留给你自己。

https://github.com/8eeth0ven/bfs-clicker

感谢点个star


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Moonlight安全 Lior1969 Lior1969《bfs-clicker 获取动态加载的js-Ai渗透测试前置》

评论:0   参与:  0