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安全, 特征检测, 自动化爬虫, 自定义脚本, 蓝队分析, 逆向工具