文章总结: 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.order:bfs 一层层铺开,先把 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+C,npm run resume 接着跑 |
| 流量捕获 + 去重 | traffic.jsonl + traffic.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 深挖 |
| maxDepth / maxStates | 4 / 500 | 深度 / 状态上限(设为 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渗透测试前置》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论