一个用于 已授权 Vue.js 站点渗透测试的浏览器控制台脚本。 自动提取前端路由、遍历访问隐藏/特权页面、扫描敏感信息泄露,辅助发现 越权访问(Broken Access Control) 漏洞。
很多 Vue SPA(单页应用)会把所有路由(包括管理后台、特权功能)都打包进前端 JS。即使菜单不显示,路由仍然存在。本脚本通过读取 Vue 运行时实例,自动提取这些路由并逐一访问,帮助快速发现:
- 前端未做权限控制的隐藏页面
- 可越权访问的管理/特权功能
- 页面加载后泄露的敏感信息(Token、API Key、内网地址等)
- 更多可深入测试的面(文件上传、JS 泄露、内部接口等)
适用 Vue 2 / Vue 3,自动识别版本与 Router 实例。
1. 遍历 DOM 查找 Vue 根节点 (__vue__ / __vue_app__ / _vnode)
2. 从根节点提取 Vue Router 实例及其 routes 配置
3. 递归遍历路由树, 合并父子路径, 去重
4. 处理动态路由 (:id / * / (.*)) -> 填充测试值
5. 逐条调用 router.push() 跳转访问
6. 每次跳转后扫描页面脚本/DOM 中的敏感信息
由于直接读取的是运行时内存中的路由表,无需手动翻 JS 文件即可拿到完整路由清单。
| 场景 | 说明 |
|---|---|
| 越权访问测试 | 普通用户身份登录后,运行脚本遍历所有路由,观察哪些本应受限的页面能直接打开 |
| 未授权访问测试 | 未登录状态下运行,若跳转登录页则配合代理替换响应(见下文),尝试绕过前端鉴权 |
| 路由资产收集 | 仅提取路由清单(关闭自动跳转),作为后续接口测试、目录爆破的输入 |
| 敏感信息泄露排查 | 遍历各页面时自动扫描 Token / API Key / 内网 URL / 私钥等泄露 |
| 扩大测试面 | 进入隐藏页面后,进一步发现文件上传、富文本、调试接口等可深入测试的功能点 |
- 用浏览器打开目标 Vue 站点(建议已登录测试账号)。
- 按
F12打开开发者工具,切到 Console(控制台) 标签。 - 打开
Vue_optimized.txt,复制全部内容粘贴进控制台,回车执行。 - 观察控制台输出:版本信息、路由清单、跳转日志、敏感信息扫描结果。
若控制台提示「禁止粘贴」,按提示输入
allow pasting后再粘贴。
脚本顶部 CONFIG 对象集中管理所有开关,按需修改:
const CONFIG = {
autoNavigate: true, // 是否自动遍历路由 (false = 仅提取并打印路由, 不跳转)
navDelay: 2000, // 每次跳转间隔 (毫秒); 页面重/接口慢时可调大
scanSecrets: true, // 跳转后是否扫描敏感信息
skipDynamic: false, // true = 跳过动态路由; false = 用测试值填充 :param / *
dynamicParamValue: '1', // 动态参数 (:id 等) 的填充值
dynamicWildcardValue: 'test', // 通配符 (* / (.*)) 的填充值
};常见调整建议:
- 只想拿路由清单、不想真实跳转 →
autoNavigate: false - 页面跳转太快来不及观察 → 调大
navDelay(如4000) - 动态路由(如
/user/:id)想用真实 ID 测越权 → 改dynamicParamValue为目标账号 ID - 不需要扫描、只测访问 →
scanSecrets: false
| 输出项 | 含义 |
|---|---|
[+] Vue 版本 |
检测到的 Vue 版本(2/3) |
[+] 共提取到 N 条路由 |
表格形式展示 raw(原始路径) / nav(实际跳转路径) / dynamic(是否动态) / name(路由名) |
纯文本路由列表 |
可直接复制的路由清单(每行一条) |
window.__vueRoutes__ |
路由数组已挂到 window,可在控制台手动取用 |
[->] (i/N) 跳转: xxx |
正在跳转到某路由 |
[SECRETS] xxx -> 发现 N 处 |
在该页面发现的可疑敏感信息(表格展示类型与匹配值) |
敏感信息扫描覆盖类型: API Key、Token / JWT、Secret、Password、内网 URL(localhost / 内网段)、AWS AccessKey、私钥(PRIVATE KEY)、内部接口路径(/api /admin /internal /debug /actuator /swagger)。
当未登录访问时被强制跳转到登录页,可借助中间人代理(Burp Suite / mitmproxy / Yakit 等)篡改响应,绕过前端鉴权逻辑,从而访问目标页面:
前端鉴权通常体现在:
- 路由守卫(
router.beforeEach)里判断登录态/角色后next('/login') - 接口返回
401/403后前端重定向 - JS 中的权限判断逻辑
代理替换的目标,就是把这些「跳转登录 / 拦截」的逻辑或数据改掉。
- 改路由守卫逻辑:拦截主 JS(bundle),把判断登录的代码(如
if(!token) next('/login'))替换为放行,或把next('/login')替换为next()。 - 改鉴权接口响应:拦截
/api/user/info、/api/permission等接口,把code:403改成code:200、把空权限列表改成完整权限列表、把role: user改成role: admin。 - 伪造登录态:在响应里注入 / 不清除 token,使前端误判为已登录。
前端能打开页面 ≠ 真正越权。后端接口仍可能独立鉴权返回 403/空数据。 必须观察页面实际加载出的数据:若后端也返回了本不该看到的数据,才构成真实越权漏洞。
┌─ 1. 登录测试账号 (低权限用户)
│
├─ 2. 控制台运行脚本, 提取全部路由
│
├─ 3. 观察自动跳转: 哪些管理/特权页面能直接打开?
│ └─ 能打开且有数据 -> 疑似水平/垂直越权
│
├─ 4. 注销 / 未登录状态再跑一次
│ └─ 被踢回登录页 -> 上代理替换响应 -> 再访问
│
├─ 5. 进入隐藏页面后扩大测试面:
│ ├─ 敏感信息泄露 (脚本自动扫描)
│ ├─ 文件上传点
│ ├─ 调试 / swagger / actuator 接口
│ └─ 内部 API
│
└─ 6. 对每个可疑点, 抓包确认后端是否真正放行 (确认漏洞)
Q: 提示「未检测到 Vue」?
A: 站点可能不是 Vue,或 Vue 实例未挂在 document.body 子树。可尝试在 React/其它框架站点上本脚本无效。
Q: 提示「未检测到 Vue Router」? A: 站点用了 Vue 但没用 vue-router(或自实现路由)。此时无路由可提取。
Q: 路由提取到了,但「无法自动跳转」?
A: 未拿到可用 router 实例(push 方法)。路由清单仍会输出,可手动逐个访问,或通过 window.__vueRoutes__ 取用。
Q: 跳转了但页面没变化 / 闪回登录页? A: 被路由守卫拦截。需配合代理替换响应(见上文),或先确保已登录。
Q: 动态路由 /user/:id 怎么测?
A: 默认用 dynamicParamValue('1')填充。测越权时改成其他用户的真实 ID,观察能否访问他人数据。
Q: 会不会误触危险操作(删除等)?
A: 脚本只做 GET 式页面跳转(router.push),不主动提交表单。但部分页面 onMounted 可能自动发请求,生产环境慎用,建议在测试/预发环境操作。
- 本工具仅供 已获得明确书面授权 的安全测试、漏洞研究与学习使用。
- 严禁用于未授权的系统。未经授权的访问、测试或攻击属于违法行为。
- 使用本工具产生的任何后果由使用者本人承担,作者不承担任何责任。
- 请在合法合规的前提下使用,遵守当地法律法规及相关授权协议。