在纯前端(JS)代码里“翻”出隐藏路由和API,其实就像做一道“代码拼图”——把散落各处的字符串、变量、注释拼成可访问的端点。下面按真实审计流程,把常用思路、工具、脚本和踩坑点一次性讲透,照着做基本能把 90% 的“暗接口”扫出来。
- 打开 F12 → Network → 筛选 “JS”/“XHR”/“Fetch”,F5 刷新,把页面加载的所有 js 都下下来(包括 webpack 异步 chunk、.vue、.ts 等)。
- 用
wget -r -np -e robots=off --accept=js,ts,map https://target.com递归拉静态目录,防止漏掉/static/js/2.3456abc.chunk.js这类懒加载文件。 - 若站点开了 CDN 合并/压缩,把 .map 文件也拖下来(SourceMap)——后面可以直接还原符号名,秒看懂路由表。
# 1. 提取所有字面量字符串(含单、双、模板)grep -rhoE '(["`\'])(/[^/"\']+)+(\?[^"`\']*)?\1' *.js | sort -u > path.txt# 2. 提取 axios/fetch/$.ajax 第一个参数grep -rhoE '(axios\.(get|post)|fetch|ajax)\(\s*["`\'][^"`\']+["`\']' *.js | grep -oE '["`\'][^"`\']+["`\']' | tr -d '"`'\'' > api.txt# 3. 合并去重cat path.txt api.txt | sort -u > endpoints.txt
跑完你会拿到一份“疑似路由”清单,形如
/api/user/info /v1/order/list ${BASE_URL}/pay/create
把 ${BASE_URL} 替换成实际域名就能批量验证。
前端框架不管怎么封装,最终都会把路由写死在一个数组或对象里。
1. Vue-Router 搜 `routes:` 或 `createRouter(` 正则: ``` path:\s*["'](\/[^"']+)["'] ```2. React-Router 搜 `<Route` 或 `path:` 正则: ``` (path|from):\s*["'](\/[^"']+)["'] ```3. Angular 搜 `Routes = [` 正则: ``` path:\s*["']([^"']*)["'] ```
把匹配结果丢到脚本里,就能一键生成“白名单路由表”,再跟前面 grep 到的“调用端点”交叉比对,凡是不在白名单里却又被代码引用到的,大概率就是隐藏 API。
有些路由是运行时拼接的,静态正则不灵,就需要浏览器动态插桩:
- 在 Console 里重载网络库
```javascript```// 拦截所有 fetchconst _fetch = window.fetch;window.fetch = function(...args){ console.trace('[FETCH]', args[0]); return _fetch.apply(this, args);};// 拦截 axiosif(window.axios){ window.axios.interceptors.request.use(config=>{ console.trace('[AXIOS]', config.url); return config; });}
- 人工点点点,把后台功能都触发一遍;Console 会打印出所有真实请求路径,包括“只在点击导出按钮时才出现”的
/api/excel/export。 - 把 trace 结果导出到文本,再去重、验证。
生产环境往往把 /api/${e}/detail 压缩成 "/api/"+t+"/detail",变量名被替换成单字母。如果站点把 .map 文件一起丢到 CDN,直接用工具还原:
```bashnpx source-map-explorer main.js# 或npx restore-source-tree -d dist --map```
还原后就能看见原始变量名 userId、orderSn,结合上下文一眼看出 /api/order/${orderSn}/refund 这类隐藏接口。
把前面收集到的路径用 ffuf 或 feroxbuster 批量跑:
```bashffuf -u https://target.com/FUZZ -w endpoints.txt -mc 200,401,403 -fc 404```
返回 200/401/403 的都算“存在”,再按业务重要性挑高危的深入测试。
- 某电商后台
静态 grep 发现
/api/coupon/internal/assign(前端未展示菜单),直接 POST 可给任意用户发券。 - 某 OA 系统
SourceMap 还原后看到
/api/admin/user/exportAll(管理端导出全部员工),但前端按钮被注释掉,访问后直接下载全表。 - 某小程序
webpackChunkName 为
pages__audit的异步包,里面引用/api/audit/video/${vid}/pass,正常流程需要多级审核,但直接调接口可一键过审。
“先拖包,再 grep 字面量;看路由,再动调插桩;有 map,就还原变量;无 map,就打断点。” 按这四步走,基本能把藏在 JS 犄角旮旯里的路由、API 全部翻出来,后续接 SQL 注入、越权、未授权就水到渠成了。
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



