sanghakbae/HttpAnalyzer
GitHub: sanghakbae/HttpAnalyzer
一款集成 mitmproxy、Playwright 和 OpenAI 的本地 HTTP 流量安全分析工具,支持实时捕获、自动爬取、漏洞模式检测和多格式报告导出。
Stars: 0 | Forks: 0
# HTTP Analyzer
`HTTP Analyzer` 是一款本地分析工具,用于捕获浏览器/客户端产生的 HTTP 流量,通过可视化请求/响应,帮助您从安全角度进行快速分类。
本项目由三个核心部分组成:
- 使用 `mitmproxy` 实时拦截、修改和观察流量
- 使用 `Node + Express` 服务器处理捕获状态、HAR 分析、重放以及 Firebase/Cloudflare 存储
- 使用 `React + Vite` 前端展示请求/响应、进行安全模式分析并生成报告
## 核心功能
- 基于谷歌登录的访问控制
- 基于侧边栏的功能划分(`Overview`、`Capture`、`Findings`、`HAR`、`Recent Data`)
- 实时捕获 HTTP 请求/响应
- 基于 Playwright 浏览器的同域名爬取与捕获
- 检测到爬取完成或进入 idle 状态时自动停止捕获
- 基于 SQLMap 的 SQL Injection 候选 endpoint 检测菜单
- 基于 OpenAI API 生成爬取完成的 Summary
- 查看请求/响应 Header 及 Body
- 重新发送特定请求 (Replay)
- 基于捕获流程生成 Mermaid 图表
- 上传 HAR 文件并分析性能/Host/状态码
- 安全模式检测与 `OWASP Top 10` 摘要
- 整理 Endpoint 优先级
- 用于 `Before / After` 对比的 Diff 功能
- 导出 `HTML / PDF / JSON / Markdown / CSV` 格式的报告
- 将 HAR 分析结果、实时捕获事件和检测记录保存至 Firebase Firestore
- 将上传的原始 HAR 文件保存至 Cloudflare R2
## 当前 UI 支持的安全分析
前端会根据捕获到的请求/响应检测以下项目:
- 敏感信息 URL 泄露
- 响应 Body 中的敏感值泄露
- 请求 Body 中包含敏感信息
- 危险的 CORS 配置
- 缺失 Session Cookie 属性(`HttpOnly`、`Secure`、`SameSite`)
- 缺失安全 Header(`CSP`、`HSTS`、`X-Frame-Options`、`Referrer-Policy`、`X-Content-Type-Options`)
- 服务器 Banner/版本信息泄露
- 堆栈跟踪/详细错误信息泄露
- 目录索引暴露
- 缺乏缓存策略
- SQLi / XSS / SSRF / Path Traversal / Command Injection / Open Redirect 痕迹
- 使用 Basic 认证的痕迹
每个 finding 都会附带以下信息:
- 严重度
- OWASP 分类
- Evidence
- Guide
- Remediation
- Reproduction Checklist
- PoC Template
## 项目结构
```
.
├─ proxy/
│ ├─ modify_request.py
│ ├─ requirements.txt
│ └─ rules.json
├─ server/
│ └─ index.js
├─ samples/
│ ├─ sample.har
│ ├─ sample-errors.har
│ ├─ sample-security.har
│ └─ sample-large.har
├─ src/
│ ├─ App.jsx
│ ├─ main.jsx
│ ├─ styles.css
├─ .env.example
├─ package.json
└─ README.md
```
主要文件说明:
- `proxy/modify_request.py`
这是一个 `mitmproxy` addon。它读取 `proxy/rules.json` 规则来修改请求 Body 并输出响应。
- `server/index.js`
前端 API 服务器。负责处理捕获状态查询、Replay、HAR 分析、捕获事件保存以及检测记录保存。
- `src/App.jsx`
主 UI。负责登录、侧边栏菜单、实时请求列表、安全 finding、报告导出、Diff、PoC 注入以及最近历史记录页面等。
- `samples/`
用于 HAR 上传测试的样本文件。
## 环境要求
- Node.js 18+
- npm
- Python 3.9+
- `mitmproxy`
- Firebase 项目 (Firestore)
- Cloudflare R2 存储桶
- SQLMap(可选,进行本地 Injection 检测时需要)
## 快速开始
### 1. 安装依赖
```
npm install
pip install -r proxy/requirements.txt
```
### 2. 配置环境变量
```
cp .env.example .env
```
示例:
```
VITE_API_BASE_URL=https://http-analyzer-api.onrender.com
VITE_LOCAL_API_BASE_URL=http://127.0.0.1:5000
VITE_FIREBASE_API_KEY=
VITE_FIREBASE_AUTH_DOMAIN=.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=
VITE_FIREBASE_STORAGE_BUCKET=.firebasestorage.app
VITE_FIREBASE_MESSAGING_SENDER_ID=
VITE_FIREBASE_APP_ID=
VITE_FIREBASE_MEASUREMENT_ID=
PORT=4000
HOST=127.0.0.1
DISABLE_CAPTURE=false
DISABLE_SQLMAP=false
SQLMAP_BIN=sqlmap
OPENAI_API_KEY=
PLAYWRIGHT_HEADLESS=true
CAPTURE_READY_DELAY_MS=3000
CAPTURE_IDLE_AUTO_STOP_MS=10000
CAPTURE_CRAWL_ENABLED=true
CAPTURE_CRAWL_MAX_PAGES=8
CAPTURE_CRAWL_PAGE_DELAY_MS=1500
CAPTURE_LOGIN_WAIT_MS=3000
FIREBASE_SERVICE_ACCOUNT_JSON={"project_id":"","client_email":"firebase-adminsdk@.iam.gserviceaccount.com","private_key":"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n"}
# 或单独的环境变量
FIREBASE_PROJECT_ID=
FIREBASE_CLIENT_EMAIL=firebase-adminsdk@.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n
# 或本地文件路径
FIREBASE_SERVICE_ACCOUNT_PATH=/absolute/path/to/firebase-service-account.json
CLOUDFLARE_R2_ACCOUNT_ID=
CLOUDFLARE_R2_ACCESS_KEY_ID=
CLOUDFLARE_R2_SECRET_ACCESS_KEY=
CLOUDFLARE_R2_BUCKET=http-analyzer-files
CLOUDFLARE_R2_PUBLIC_BASE_URL=https://
```
在本地同时运行前端和后端时,可以将其修改为 `VITE_API_BASE_URL=http://127.0.0.1:5000`。
在生产环境前端中使用新窗口手动捕获时,由于需要调用用户 PC 上的本地后端,
请保留 `VITE_LOCAL_API_BASE_URL=http://127.0.0.1:5000` 的值。
说明:
- `VITE_*`
前端使用的值。`VITE_FIREBASE_*` 用于 Firebase Auth 和 Firestore 客户端的 fallback。
- `FIREBASE_SERVICE_ACCOUNT_JSON`
或 `FIREBASE_PROJECT_ID`、`FIREBASE_CLIENT_EMAIL`、`FIREBASE_PRIVATE_KEY`、`FIREBASE_SERVICE_ACCOUNT_PATH`
用于在服务器端将检测记录和捕获事件保存至 Firestore。
- `CLOUDFLARE_R2_*`
用于将原始 HAR 文件上传至 Cloudflare R2。
- `HOST`
本地通常使用 `127.0.0.1`,在 Render 等部署环境中使用 `0.0.0.0`。
- `DISABLE_CAPTURE`
如果要在部署的后端屏蔽 Playwright 捕获 API,仅运行保存/查询 API,请将其设置为 `true`。
- `DISABLE_SQLMAP`
决定是否屏蔽 SQLMap 执行 API。在公开部署的环境中,为了防止滥用,建议设置为 `true`。
- `SQLMAP_BIN`
本地安装的 SQLMap 可执行文件路径。默认值为 `sqlmap`。
- `CAPTURE_READY_DELAY_MS`
首次页面加载后,为准备捕获而等待的时间。默认值为 `3000`。
- `CAPTURE_IDLE_AUTO_STOP_MS`
没有网络活动时,等待自动停止的时间。默认值为 `10000`。
- `CAPTURE_CRAWL_ENABLED`、`CAPTURE_CRAWL_MAX_PAGES`、`CAPTURE_CRAWL_PAGE_DELAY_MS`
设置捕获开始后是否自动遍历同域名的链接、最多查看多少页以及页面间等待的时间。
- `CAPTURE_LOGIN_WAIT_MS`
自动输入 ID/PW 后等待登录处理的时间。默认值为 `3000`。
## 运行方式
### 1. 启动代理
```
mitmdump -s proxy/modify_request.py
```
代理默认地址:
- Host: `127.0.0.1`
- Port: `8080`
如果需要查看 HTTPS 流量,必须将 `mitmproxy` 证书安装到目标客户端/浏览器中。
### 2. 启动分析服务器
```
npm run server
```
默认地址:
- `http://127.0.0.1:4000`
### 3. 启动前端
```
npm run dev
```
默认地址:
- `http://localhost:5173`
## 常规使用流程
### 登录
1. 访问前端页面并点击谷歌登录按钮。
2. 必须使用当前被允许的账号登录才能进入主界面。
当前允许的账号:
- `totoriverce@gmail.com`
注意:
- 登录会话通过 Firebase Auth 的浏览器持久化机制进行维护。
- 捕获/检测记录会先加载到本地存储中,然后再同步到后端或 Firestore。
### 实时捕获
1. 在 `Capture` 页面输入要分析的目标 URL。
2. 如有需要,可输入额外的排除模式。
3. 如果目标网站需要登录,请输入 `ID` 和 `PW`,或者在 `Session` 中输入 Cookie 值。
4. 点击 `캡처 시작`(开始捕获)后,服务器会打开 Playwright 浏览器并导航至目标 URL。
5. 如果提供了 `Session` 值,会优先将其作为 Cookie 应用;如果没有,则会自动检测首个页面的登录表单,填入 ID/PW 并提交。
6. 首个页面加载完成并等待 3 秒后,会自动遍历同域名下的链接,最多访问 `CAPTURE_CRAWL_MAX_PAGES` 个页面。
7. 爬取完成后,捕获将自动停止,侧边栏的进度状态会变为 `complete`。
8. 在查看请求/响应列表时,可以检查 finding 和 Diff。
注意:
- 图片请求默认始终会被排除。
- `Excluded` 输入框仅接收额外的排除规则。
- `ID`、`PW` 和 `Session` 仅用于自动化认证,不会保存在应用程序的存储中。
- 对于 `Session`,建议使用类似 `SESSIONID=...` 或 `SESSIONID=...; other=...` 的 Cookie 字符串。如果只输入值,则会将其应用为 `session=<值>` 的 Cookie。
- `Capture` 侧边栏会显示捕获的请求数、总请求数、爬取页面数和错误数。
- 如果想手动停止,点击 `캡처 중지`(停止捕获)即可。
- `Capture` 页面仅展示各个请求的安全 finding 摘要,详细内容可在 `Findings` 菜单中查看。
- 点击 `Findings에서 보기`(在 Findings 中查看)即可过滤并跳转到该请求对应的 finding。
- 在关闭流程中产生的 `net::ERR_ABORTED` 会被视为终止性噪音,在 UI 和 Recent Data 中隐藏。
### 重放
1. 点击请求卡片。
2. 在 Replay 模态框中修改 URL、Header 和 Body。
3. 点击 `요청`(请求)按钮重新发送。
如果存在安全 finding:
- 可以通过 `PoC를 Replay에 주입`(将 PoC 注入到 Replay)按钮,直接将复现模板填入模态框。
- 如果响应过长,可在模态框内部进行滚动查看。
### 生成 Mermaid 图表
通过 `Capture` 页面中的 `Generate Mermaid` 按钮,可以根据当前捕获的请求生成 Mermaid 流程图。
- 结果会在专用弹出窗口中显示,而不是在正文中。
- 通过弹窗右上角的 `복사`(复制)按钮可以直接复制 Mermaid 代码。
- 复制后弹窗会自动关闭。
### SQLMap Injection 扫描
`SQLMap` 菜单是一款本地检测工具,用于从捕获到的请求中筛选出 SQL Injection 检测候选对象,并使用 `sqlmap` 执行扫描。
使用流程:
1. 从 `Capture` 或 `Recent Data` 中获取请求。
2. 进入 `SQLMap` 菜单。
3. 在 `Captured Candidates` 中选择请求,URL、Method、Headers 和 Body 将会自动填入。
4. 如有需要,可调整 `Level`、`Risk`、Header 和 Body 的值。
5. 点击 `SQLMap Scan` 并查看结果。
注意:
- 必须仅对您拥有或明确获得授权的目标使用。
- 由于是在本地服务器上执行 `sqlmap` 二进制文件,因此本地必须安装 SQLMap。
- 在 macOS Homebrew 环境下,安装示例为 `brew install sqlmap`。
- 在公开的 Render 后端中,会通过 `DISABLE_SQLMAP=true` 进行屏蔽。
- 不建议在部署环境中开启 SQLMap,否则可能会被滥用于扫描任意外部目标。
### OpenAI Summary 设置
在 `Settings` 菜单中,可以管理爬取完成后自动生成的 Summary 设置。
如果设置了服务器环境变量 `OPENAI_API_KEY`,则无需在浏览器中输入密钥,可直接使用服务器密钥生成 Summary。
输入项:
- `OPENAI KEY`:选填项。仅当未设置服务器 `OPENAI_API_KEY` 时,才会使用浏览器的 localStorage 密钥生成 Summary。
- `MODEL`:用于生成 Summary 的模型名称。默认值为 `gpt-4.1-mini`。
- `PROMPT`:决定从哪些角度对 HTTP 捕获结果进行摘要的 prompt。
默认 prompt 包含以下角度:
- 整体摘要
- 高风险优先的 endpoint
- SQL Injection、XSS、认证/Session、CORS、敏感信息泄露的依据
- 将基于捕获数据的证据与需要进一步确认的项目区分开
- 提出 SQLMap 检测候选的 URL/参数建议
- 开发者下一步行动的检查清单
当爬取状态变为 `crawl-complete` 并自动停止时,如果已输入 API Key,则会根据当前捕获数据生成 Summary。您也可以手动点击 `현재 데이터로 Summary 생성`(使用当前数据生成 Summary)按钮。
### HAR 分析
在 `HAR` 页面中,您可以选择文件进行上传。服务器会计算以下项目:
- 总请求数
- 平均等待时间
- 最慢的请求
- HTTP 方法分布
- 请求频次最高的 Host
- 状态码分布
- Content-Type 分布
- 失败请求列表
即使不使用 Firebase 也可以进行分析,但如果要将结果保存到数据库,则需要配置 Firestore 服务器密钥和 Cloudflare R2。
### Recent Data
在 `Recent Data` 页面中,可以查看以下内容:
- 最近的检测记录
- 最近的捕获事件
- 基于过去 7 天 / 30 天的统计仪表板
- 检测记录详情模态框
- 针对每条检测记录重新下载 `HTML / PDF` 报告
- 各个项目的保存来源(`DB`)
重要说明:
- 只有在 Firebase/Firestore DB 成功保存捕获结果后,才会在 `Recent Data` 中显示。
- 如果 DB 保存失败,则不会显示为本地待处理项目,而是会展示保存失败的消息。
- 需要配置服务器端 Firestore 认证或 Firebase 客户端。
## Firebase / Cloudflare 存储结构
### 存储目标集合
本项目使用以下 Firestore 集合。
#### 1. HAR 分析
- `capture_har_analyses`
#### 2. 实时捕获事件
- `capture_http_events`
#### 3. 检测记录 / 报告快照
- `capture_inspection_runs`
### 文件存储
- 原始 HAR 文件和生成的报告附件会保存到 Cloudflare R2。
- 存储结构为:元数据保存到 Firestore,二进制文件保存到 R2。
注意:
- `FIREBASE_SERVICE_ACCOUNT_JSON` 和 `CLOUDFLARE_R2_SECRET_ACCESS_KEY` 仅限服务器端使用。
- 绝不能直接暴露在前端代码中。
## GitHub Actions + Render 部署
本仓库配置为分离部署前端和后端。
- 前端:GitHub Pages
- 后端:Render Web Service
- DB:Firebase Firestore
- 文件存储:Cloudflare R2
### GitHub Actions 设置
在 GitHub 仓库的 `Settings > Secrets and variables > Actions` 中注册以下值。
前端 API URL 需注册为仓库变量(`Variables`)。如果未注册该值,GitHub Actions 将默认使用 `https://http-analyzer-api.onrender.com`。
```
VITE_API_BASE_URL=https://http-analyzer-api.onrender.com
VITE_LOCAL_API_BASE_URL=http://127.0.0.1:5000
```
用于触发 Render 自动部署:
```
RENDER_DEPLOY_HOOK_URL=
```
`RENDER_DEPLOY_HOOK_URL` 是在 Render 服务的 `Settings > Deploy Hook` 中生成的 URL。如果没有此值,将只部署前端,并跳过后端部署触发步骤。
### Render 环境变量
在 Render Web Service 中注册以下值。
```
NODE_ENV=production
HOST=0.0.0.0
DISABLE_CAPTURE=false
PLAYWRIGHT_HEADLESS=true
DISABLE_SQLMAP=true
FIREBASE_PROJECT_ID=
FIREBASE_CLIENT_EMAIL=
FIREBASE_PRIVATE_KEY=
CLOUDFLARE_R2_ACCOUNT_ID=
CLOUDFLARE_R2_ACCESS_KEY_ID=
CLOUDFLARE_R2_SECRET_ACCESS_KEY=
CLOUDFLARE_R2_BUCKET=
CLOUDFLARE_R2_PUBLIC_BASE_URL=
```
为了在部署的后端也能使用捕获 API,请将其设置为 `DISABLE_CAPTURE=false`。
- 行为:`/api/health`, `/api/capture/start`, `/api/capture/status`, `/api/capture/stop`, `/api/replay-request`, `/api/recent-analyses`, `/api/inspection-runs`, `/api/capture-events/batch`, `/api/analyze-har`
- 在 Render 中,会以 `PLAYWRIGHT_HEADLESS=true` 在服务器内部运行 headless Chromium。
- Render 中默认屏蔽 SQLMap API。`render.yaml` 中的 `DISABLE_SQLMAP=true` 是有意为之的安全设置。
注意:在 Render 上运行的浏览器位于 Render 服务器内部,而不是用户的 PC。如果是需要人工直接登录和操作的会话捕获,在本地应用程序中执行最为准确。
### Render Blueprint
本项目包含 `render.yaml`,您可以通过 Blueprint 将其连接到 Render。
- Service Name: `http-analyzer-api`
- Build Command: `npm ci`
- Start Command: `npm run start`
- Health Check Path: `/api/health`
- 预期的后端 URL: `https://http-analyzer-api.onrender.com`
如果在 Render 上该服务名称已被占用,则必须将实际生成的 URL 重新注册到 GitHub Actions 变量 `VITE_API_BASE_URL` 中。
### 部署站点行为
在部署的站点上,现有的菜单也会照常显示。
- 显示 `Overview`、`Capture`、`Findings`、`HAR`、`Recent Data` 菜单
- 通过后端 API URL 执行 `HAR` 上传、`Replay` 和报告导出
- 在 Render 环境中,捕获操作通过 headless Chromium 执行
- 对于需要弹出实际浏览器窗口以维持会话的捕获,建议在本地应用程序中执行
### 当前工作区状态
本仓库已配置为在服务器端使用以下集合/存储:
- Firestore
- `capture_har_analyses`
- `capture_http_events`
- `capture_inspection_runs`
- Cloudflare R2
- 将原始 HAR 保存到 `har/YYYY-MM-DD/...` 路径下
## 报告导出
在顶部的 `Export` 菜单中,可以导出以下格式:
- HTML
- PDF
- JSON
- Markdown
- CSV
报告包含以下信息:
- 封面
- 检测者
- 检测时间
- 结论
- 请求/响应列表
- 安全 finding
- OWASP 摘要
- Endpoint 风险度摘要
如果开启了 `Mask Secrets`,敏感信息将以脱敏形式输出。
## 样本 HAR 文件
测试用的 HAR 文件位于 [samples](/Users/mac/Tools/HttpViewer/samples) 中。
- [samples/sample.har](/Users/mac/Tools/HttpViewer/samples/sample.har)
用于确认默认上传/保存行为
- [samples/sample-errors.har](/Users/mac/Tools/HttpViewer/samples/sample-errors.har)
用于检查错误响应和失败请求
- [samples/sample-security.har](/Users/mac/Tools/HttpViewer/samples/sample-security.har)
用于验证安全模式检测
- [samples/sample-large.har](/Users/mac/Tools/HttpViewer/samples/sample-large.har)
用于检查大量请求的流程
- [samples/sample-vulnerable.har](/Users/mac/Tools/HttpViewer/samples/sample-vulnerable.har)
用于测试敏感信息泄露、缺失安全 Header、注入痕迹等漏洞迹象
## UI 辅助功能
### Mask Secrets
默认对敏感值进行脱敏处理。
例如:
- `Authorization`
- `Cookie`
- `Set-Cookie`
- token/JWT/API Key
- Private Key 格式的字符串
### 处理误报
可以针对每个 finding 在以下范围内进行抑制:
- 会话级误报
- Endpoint 级误报
- Host 级误报
- 全局误报
### Diff
比较相同 Endpoint 的先前请求与当前请求。
- 状态码
- 变更的请求 Header
- 变更的响应 Header
- 请求 Body
- 响应 Body
默认处于折叠状态。
### Endpoint 优先级
将集中出现大量 finding 的 Endpoint 整理为优先事项。
- 累积分数
- finding 数量
- 最高严重度
- 最常触发的 OWASP 类别
默认处于折叠状态。
### Recent Data 存储策略
以成功保存至 DB 为标准来管理最近的检测记录和捕获事件。
- 第一步:保存至服务器 Firestore
- 第二步:当没有服务器 Firestore 认时,保存至 Firebase 客户端 Firestore
- 第三步:将原始 HAR/附件文件保存至 Cloudflare R2
如果 DB 保存失败,不会在 `Recent Data` 中生成本地待处理项,而是显示保存失败的消息。`Recent Data` 中仅展示已通过 Firestore 验证的记录。
## 开发提示
### 构建测试
```
npm run build
```
### 仅运行服务器
```
npm run server
```
### 仅运行前端
```
npm run dev
```
## 注意事项
- 本工具的 finding 是基于模式匹配的检测结果,而非已确认的漏洞。
- 必须通过复现测试并审查服务器代码/基础设施配置来确认实际是否存在漏洞。
- 绝对不可将 Firebase 服务账号密钥和 Cloudflare R2 密钥暴露在浏览器或公开的仓库中。
## 未来理想的扩展方向
- 针对项目保存/查询 finding 结果的页面
- 自动对比 Replay 结果
- 针对每个 finding 进行评论及分类 状态管理
- 用于团队共享的报告模板
- 当产生特定 finding 时发送 Slack/邮件通知
标签:CISA项目, GNU通用公共许可证, MITM代理, Node.js, Petitpotam, React, Syscalls, Web安全, 特征检测, 自动化爬虫, 自定义脚本, 蓝队分析, 逆向工具