# Pentest JS

> JS信息收集入口 - 提取硬编码凭据、API路径、路由、认证逻辑、运行时存储；检测到框架特征时触发对应子技能

- Skill: `openaisec/pentest-js` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add openaisec/pentest-js`
- Raw SKILL.md: https://api.skillmd.com/api/skills/openaisec/pentest-js/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: openaisec (https://skillmd.com/u/openaisec)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/openaisec/pentest-js

---


# JS 信息收集

## 核心原则

**所有 JS 内容获取必须优先使用 Playwright MCP**，禁止直接用 curl 读取JS：
`playwright_navigate` → `playwright_get` → `playwright_console_logs` → `playwright_evaluate`

curl 仅限 Playwright 不可用时降级。

## 文件组织

所有输出写入 `tmp/<时间戳>/raw/`，项目根目录禁止存放。

## 阶段1：JS 收集

1. `playwright_get_visible_html` 提取 `<script src="...">`
2. `playwright_evaluate` 监听 `performance.getEntriesByType('resource')` 获取动态加载JS

优先级：P0（ipconfig/config/api/setting/routes/permission.js）→ P1（app/chunk-vendors/chunk-*.js）→ P2（第三方SDK/.map）

## 阶段2：凭据提取

搜索关键词覆盖 6 类：认证凭据(apiKey/appSecret/token/password/Basic auth)、云服务Key(AWS/阿里云/腾讯云)、数据库连接串、加密密钥(AES/RSA/HMAC)、注释、内网地址。

发现凭据后记录：类型 | 文件 | 值（脱敏前5+后3）| 风险等级。

## 阶段3：API路径与路由

- 显式API：搜索 `baseUrl`/`axios.create`/`fetch(` 等提取
- 路由表：搜索 `createRouter`/`VueRouter`/`createBrowserRouter`/`<Route path=`
- 运行时提取：`playwright_evaluate` → `$router?.getRoutes()` 或 `$router?.options?.routes`

## 阶段4：认证逻辑

- 登录流程逆向：接口路径、密码加密方式、验证码接口、Token存储/携带方式
- 签名算法：搜索 `sign`/`signature`/`hmac` → 提取字段拼接顺序和secret来源
- Token刷新：搜索 `refreshToken`/`refresh`

## 阶段5：环境配置

- 多环境：搜索 `dev`/`staging`/`production` → 各环境baseURL → 生产JS残留的测试地址
- Debug模式：搜索 `debug`/`VConsole`/`eruda`
- 内网地址：IP + 内部域名(.internal/.oa) + 管理后台域名 + 预发布域名

## 阶段6：运行时提取（Playwright 专属）

- localStorage/sessionStorage：关注 token/userInfo/auth/perms/roles/tenant
- Cookie：document.cookie，分析Token/Session
- 控制台日志：调试信息泄露
- IndexedDB：`indexedDB.databases()`
- iframe/postMessage：目标origin、message处理器
- 错误监控：Sentry DSN/GA ID/GTM配置
- jQuery：`$.ajaxSetup`中的baseURL/headers/CSRF Token

## 阶段7：凭据即时验证

发现即测，不等到最后。

## 子技能触发

| 检测特征 | 触发 |
|----------|------|
| JS末尾含 `sourceMappingURL` | [sourcemap.md](sourcemap.md) |
| `webpackJsonp` 或 chunk hash命名 | [webpack.md](webpack.md) |
| `__vue__`/`__vue_app__`/`createRouter` | [vue.md](vue.md) |
| `__NEXT_DATA__`/`React.createElement`/`jsx(` | [react.md](react.md) |
| `navigator.serviceWorker` | [service-worker.md](service-worker.md) |
| `new WebSocket(`/`io(`/SignalR | [websocket.md](websocket.md) |
| `ApolloClient`/Relay/urql/`gql\`` | [graphql-client.md](graphql-client.md) |

## 输出产物

`js_files.txt` / `hardcoded_creds.txt` / `apis_from_js.txt` / `routes.txt` / `internal_ips.txt` / `auth_logic.txt` / `runtime_storage.txt` / 各子技能目录

