Samagna-Pandiri/Web-vulnerability-scanner
GitHub: Samagna-Pandiri/Web-vulnerability-scanner
一个基于 Python 的轻量级 Web 漏洞扫描器,附带刻意设计漏洞的 Flask 靶场,帮助学习者和安全测试人员检测并理解常见的 OWASP Top 10 漏洞。
Stars: 0 | Forks: 0
# WebVulnScanner
一个基于 Python 的 Web 应用程序漏洞扫描器,用于检测常见的 OWASP Top 10 漏洞。专为教育目的和授权安全测试而构建。
## 它能检测什么
| 漏洞 | 严重程度 | OWASP 类别 |
|---|---|---|
| 缺失安全标头 | 中 | A05: Security Misconfiguration |
| 跨站脚本攻击 (XSS) | 高 | A03: Injection |
| SQL 注入 | 严重 | A03: Injection |
| 开放重定向 | 中 | A01: Broken Access Control |
| 目录遍历 | 高 | A01: Broken Access Control |
| 敏感文件暴露 | 高/低 | A05: Security Misconfiguration |
## 项目结构
```
web-vuln-scanner/
├── scanner/
│ └── scanner.py # Main scanner tool
├── target_app/
│ └── app.py # Deliberately vulnerable Flask app (test target)
├── reports/ # JSON scan reports saved here
├── requirements.txt
└── README.md
```
## 设置
```
# 1. Clone 或下载项目
cd web-vuln-scanner
# 2. 创建 virtual environment(良好习惯)
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
```
## 如何测试(循序渐进)
### 第 1 步 — 启动存在漏洞的目标应用程序
打开终端并运行:
```
cd target_app
python app.py
```
你应该会看到:
```
VulnBank test app running → http://localhost:5000
```
在浏览器中访问 `http://localhost:5000` 查看目标应用程序。随便看看——它包含一个登录表单、一个搜索框、一个文件查看器等等。
### 第 2 步 — 对其运行扫描器
打开**第二个**终端:
```
cd web-vuln-scanner
# 运行所有检查
python scanner/scanner.py http://localhost:5000
# 或者仅运行特定检查
python scanner/scanner.py http://localhost:5000 --checks xss sqli
# 选择报告的保存位置
python scanner/scanner.py http://localhost:5000 --output reports/my_scan.json
```
### 第 3 步 — 查看输出
扫描器会在终端打印带有颜色编码的结果,并保存一份完整的 JSON 报告。你会看到类似以下的发现:
```
[Critical] SQL Injection
└─ Field 'username' triggers SQL error with payload
URL : http://localhost:5000/search
Payload: ' OR 1=1--
[High] Cross-Site Scripting (XSS)
└─ Field 'name' reflects payload unescaped
URL : http://localhost:5000/feedback
[Medium] Missing Security Header
└─ Content-Security-Policy not present
```
### 第 4 步 — 手动验证发现结果
**SQL 注入 —— 在浏览器中亲自尝试:**
1. 访问 `http://localhost:5000/search`
2. 输入 `' OR '1'='1` 作为用户名
3. 点击 Search —— 你会看到返回了所有用户,从而绕过了查询
**XSS —— 亲自尝试:**
1. 访问 `http://localhost:5000/feedback`
2. 输入 `` 作为你的名字
3. 提交 —— 脚本将在浏览器中执行
这个手动验证步骤很重要——它证明了扫描器没有给出误报。
## 可用标志
```
python scanner/scanner.py [target_url] [options]
positional arguments:
url Target URL (e.g. http://localhost:5000)
optional arguments:
--checks Checks to run: headers xss sqli redirect traversal files all
--output Path to save JSON report (default: reports/scan_report.json)
--delay Delay between requests in seconds (default: 0.3)
```
## 示例命令
```
# Full scan 并将报告保存到自定义路径
python scanner/scanner.py http://localhost:5000 --output reports/vulnbank_$(date +%Y%m%d).json
# Headers-only scan(速度快,适合快速检查)
python scanner/scanner.py http://localhost:5000 --checks headers
# 带有 1s 延迟的 Slow scan(对服务器更友好)
python scanner/scanner.py http://localhost:5000 --delay 1.0
# 仅运行 injection 测试
python scanner/scanner.py http://localhost:5000 --checks xss sqli
```
## 扫描器工作原理(技术概述)
### XSS 检测
1. 获取目标页面并使用 BeautifulSoup 解析所有 HTML 表单
2. 对于每个文本/textarea 输入字段,使用已知的 XSS payload 提交表单
3. 检查 payload 是否以未转义的形式出现在 HTTP 响应体中
4. 如果是 → 确认存在反射型 XSS
### SQL 注入检测
1. 遍历表单输入并提交 SQL 元字符(`'`、`OR 1=1` 等)
2. 检查响应中是否包含已知的数据库错误字符串(MySQL、SQLite、PostgreSQL、MSSQL)
3. 基于错误的检测非常可靠,因为大多数配置不当的应用程序都会泄露数据库错误
### 安全标头
1. 向目标发送一个 GET 请求
2. 对照推荐的安全标头列表检查 `response.headers`
3. 报告任何缺失的标头并解释其重要性
### 开放重定向检测
1. 在 URL 后附加常见的重定向参数(`?redirect=`、`?next=`、`?url=`)
2. 将其值设置为攻击者控制的域
3. 检查服务器是否以 3xx 状态码响应,并且 `Location` 标头指向外部
### 目录遍历
1. 在 URL 后附加常见的文件参数名(`?file=`、`?path=`、`?page=`)
2. 使用类似 `../../../../etc/passwd` 的遍历序列
3. 检查响应体是否包含已知的文件内容签名(`root:x:0:0`)
## 理解 JSON 报告
```
{
"scan_target": "http://localhost:5000",
"scan_date": "2025-03-14T10:30:00",
"total_findings": 8,
"severity_summary": {
"Critical": 1,
"High": 3,
"Medium": 3,
"Low": 1
},
"findings": [
{
"type": "SQL Injection",
"severity": "Critical",
"detail": "Field 'username' triggers SQL error with payload",
"payload": "' OR 1=1--",
"url": "http://localhost:5000/search"
}
]
}
```
报告按严重程度排序。你可以在任何文本编辑器中打开 JSON 文件,或使用另一个脚本对其进行解析以供进一步分析。
## 扩展项目(为你的简历加分的建议)
一旦你熟悉了该项目,这些添加项会使你的项目令人印象深刻得多:
- **HTML 报告输出** —— 将发现结果渲染为样式化的 HTML 页面,而不仅仅是 JSON
- **爬虫** —— 自动发现目标上的所有页面,而不仅仅是主页
- **CSRF 检测** —— 检查表单是否缺少 CSRF token
- **速率限制** —— 检测服务器是否以 429 状态码响应快速请求
- **Cookie 标志** —— 检查会话 cookie 是否缺少 `HttpOnly` 和 `Secure` 标志
- **API 扫描** —— 将 payload 扩展到 JSON body 参数,用于 REST API 测试
- **CI/CD 集成** —— 添加一个 GitHub Actions 工作流,在每次推送时运行扫描器
## 在面试中谈论此项目
**“你的扫描器能做什么?”**
**“你的 XSS 检测是如何工作的?”**
**“它有什么局限性?”**
**“你为什么还要构建一个存在漏洞的目标应用程序?”**
## 漏洞解释(供你参考)
**SQL 注入** —— 攻击者提供的输入被直接嵌入到 SQL 查询中。`' OR '1'='1` 绕过了 WHERE 子句,因为它始终评估为真。
**XSS(反射型)** —— 用户输入未经 HTML 编码就直接渲染回页面中。如果在反映你的查询的搜索框中输入 ``,它将在受害者的浏览器中执行。
**开放重定向** —— `?redirect=https://evil.com` 参数在没有验证的情况下被跟随。用于网络钓鱼——该 URL 看起来像一个受信任的域,但却将用户发送到其他地方。
**目录遍历** —— `?file=../../../../etc/passwd` 向上导航目录树,以读取 Web 根目录之外的文件。可通过 `os.path.basename()` 或白名单来修复。
**缺失安全标头** —— 像 `Content-Security-Policy` 和 `X-Frame-Options` 这样的 HTTP 标头告诉浏览器该如何表现。缺失它们会导致 XSS 和点击劫持缓解措施被禁用。
**敏感文件暴露** —— 公开可访问的 `.env` 文件、`.git/config` 和 debug 端点会暴露凭据、API 密钥和内部架构。
标签:CISA项目, DOE合作, Flask, JSON报告生成, meg, OWASP Top 10, Python3, Python安全工具, Splunk, SQL注入检测, Web安全, Web漏洞扫描器, XSS检测, 信息安全, 反取证, 安全头缺失检测, 安全教育, 安全评估, 开放重定向检测, 敏感文件暴露检测, 目录遍历检测, 网络安全, 网络安全扫描, 自动化扫描工具, 蓝队分析, 跨站脚本攻击, 逆向工具, 隐私保护