安全研究/安全视界/渗透测试实战:基于JS逆向的Web资产深度分析
渗透测试实战:基于JS逆向的Web资产深度分析
2026-07-27 07:31分享

在现代Web渗透测试中,前端代码往往是信息收集的“金矿”。随着SPA(单页应用)架构的普及,大量业务逻辑、API接口路径甚至敏感配置被打包进JavaScript文件中。掌握JS逆向与资产分析技术,能够帮助安全测试人员在不触发后端WAF的情况下,快速构建攻击面地图。

本文将深入探讨基于JS逆向的Web资产分析核心技术,涵盖接口提取、构建工具分析、源码恢复及主流框架特征识别。

 

 

1. JS接口提取

JavaScript文件中通常硬编码了后端API路径。高效提取这些接口是资产发现的第一步。

1.1 静态正则匹配

通过正则表达式匹配常见的URL模式,是最基础的手段。

  • 相对路径:/api/v1/user, /admin/login
  • 绝对路径:https://api.target.com/v2/data
  • 动态拼接:`${baseUrl}/orders/${id}`

注意:需过滤掉CDN资源、第三方库引用及纯前端路由路径,避免误报。

1.2 动态AST分析

对于混淆或模板字符串拼接的接口,正则往往失效。利用抽象语法树(AST)进行语义分析更为精准:

  • 使用@babel/parser 解析JS代码。
  • 遍历CallExpression 节点,识别 get, fetch, $http 等请求函数。
  • 提取第一个参数(URL)及第二个参数(Config)中的baseURL 进行拼接。

1.3 运行时Hook提取

当接口路径在运行时动态生成时,需通过浏览器Hook技术捕获:

  • 重写prototype.open 和 fetch。
  • 拦截createElement('script') 监控动态脚本加载。
  • 结合无头浏览器(Puppeteer/Selenium)遍历页面交互,收集所有发出的请求。

2. Webpack源码分析

Webpack是目前最主流的前端构建工具,其打包产物具有显著特征,理解其机制有助于还原业务逻辑。

2.1 识别打包特征

Webpack打包文件通常包含以下特征:

  • 全局变量:webpackJsonp, __webpack_require__, webpackChunk
  • 模块映射:modules: { ... }或 chunks: { ... } 对象
  • 入口标记:entry: ...或自执行函数包裹的模块数组

2.2 模块ID与依赖分析

Webpack将每个文件编译为一个模块,通过ID索引:

  • 数字ID:早期版本常见,如0: function(module, exports, require) {...}
  • 字符串ID:新版本或配置moduleIds: 'named' 后出现,如 "./src/api/user.js": function(...) {...}

技巧:若发现字符串ID,可直接通过文件名定位业务模块,大幅降低逆向难度。

2.3 Chunk拆分与懒加载

分析 __webpack_require__.e 或 import() 调用,可发现懒加载的Chunk文件。这些文件往往包含非首屏的关键业务接口(如支付、个人中心),是资产发现的盲区。

3. Source Map恢复源码

Source Map是开发环境的调试映射文件,若在生产环境未正确配置 .gitignore 或服务器策略,将导致源码泄露。

3.1 发现Source Map

  • 文件头注释:检查JS文件末尾//# sourceMappingURL=xxx.js.map
  • HTTP响应头:检查X-SourceMap 或 SourceMap 头
  • 常见路径:尝试访问/static/js/main.js.map, /dist/main.js.map

3.2 源码还原工具

获取 .map 文件后,可使用以下工具恢复原始工程结构:

  • reversesource:命令行工具,一键还原目录结构。
  • source-map-visualization:可视化查看映射关系。
  • Custom Script:解析sources 和 sourcesContent 字段,按路径写入本地文件。

3.3 安全价值

恢复源码后,可直接获得: - 完整的API路由定义 - 环境变量与密钥配置(.env 内容) - 未混淆的业务逻辑与注释 - 组件间的数据流转关系

4. Vue源码分析

Vue.js在打包后仍保留部分框架特征,可用于识别版本及提取路由/状态信息。

4.1 版本识别

  • Vue 2:查找version, __VUE_DEVTOOLS_GLOBAL_HOOK__
  • Vue 3:查找createApp, defineComponent, __VUE_OPTIONS_API__

4.2 路由表提取

Vue Router的配置通常在打包后以数组形式存在:

  • 搜索path:, component:, children: 关键字。
  • 关注meta 字段,常包含权限标识(如 requiresAuth: true)。
  • 动态路由(/:id)可直接转化为Fuzzing字典。

4.3 Vuex/Pinia状态分析

状态管理库常存储敏感数据结构:

  • 搜索mutations, actions, state 定义。
  • 关注commit 和 dispatch 调用,可推断业务操作流。
  • 部分开发者会将API请求封装在Action中,直接提取即可。

5. React打包分析

React应用通常配合React Router及状态管理库,其打包特征与Vue有所不同。

5.1 组件树识别

  • 查找createElement, jsx, _jsx 等编译产物。
  • 组件名在开发模式或配置displayName 后保留,如 UserProfile。
  • Hooks调用:useState, useEffect的调用顺序可辅助理解组件生命周期。

5.2 React Router分析

  • v5:搜索<Route path=, <Switch>。
  • v6:搜索createBrowserRouter, element:, loader:。
  • 注意:ReactRouter v6的 loader 函数常包含数据获取逻辑,是API提取的重点。

5.3 状态管理识别

  • Redux:搜索createStore, combineReducers, useSelector。
  • MobX:搜索makeObservable, @observable。
  • Zustand/Jotai:搜索create(, atom(。

6. API接口枚举

基于前述分析,需对提取的接口进行系统化枚举与验证。

6.1 接口归一化

将提取的原始路径标准化:

  • 去除BaseURL前缀,保留相对路径。
  • 替换动态参数为占位符:/user/123→ /user/{id}。
  • 合并重复路径,去重排序。

6.2 方法推断

JS代码中常隐含HTTP方法信息:

  • get(url)→ GET
  • post(url, data)→ POST
  • fetch(url, { method: 'PUT' })→ PUT
  • 无方法指定时,默认按GET/POST双测。

6.3 参数提取

从请求构造代码中提取参数名:

  • Query参数:params: { page: 1, size: 20 }
  • Body参数:data: { username, password }
  • Header参数:headers: { 'X-Token': token }

6.4 自动化验证

生成接口清单后,结合以下工具进行存活与权限验证:

  • Burp Suite:导入接口列表,使用Intruder进行参数Fuzz。
  • Nuclei:编写自定义模板,批量检测未授权访问。
  • Custom Script:基于提取的参数结构,自动生成合法请求进行基线测试。

核心原则:JS逆向不是目的,而是手段。所有提取的资产必须经过验证,避免将死链或前端路由误判为后端接口。

总结

基于JS逆向的Web资产分析,本质是将前端“黑盒”转化为“灰盒”的过程。通过系统化的接口提取、构建工具分析、源码恢复及框架特征识别,测试人员能够:

  • 发现隐藏API与未授权端点
  • 理解业务逻辑与数据流向
  • 获取敏感配置与调试信息
  • 构建精准的Fuzzing字典

在实际渗透中,建议将JS分析作为信息收集的标准SOP,结合动态调试与自动化脚本,最大化攻击面覆盖。同时,务必遵守授权范围,所有操作仅限于合法测试场景。