高级 Web 漏洞扫描器 - 模块化设计与实现文档
一、文档概述
本文档对基于 Python 开发的高级 Web 漏洞扫描器进行全维度模块化解析,涵盖架构设计、核心模块功能、使用方式及扩展指南。该扫描器具备 SQL 注入、XSS、敏感文件泄露、目录遍历、HTTP 方法配置不当等多维度漏洞检测能力,采用模块化设计保证可扩展性,内置反反检测机制提升扫描稳定性,支持多格式报告输出满足不同场景需求。
二、整体架构设计
2.1 架构分层
该扫描器遵循模块化、高内聚、低耦合设计原则,整体分为四层结构:
| 层级 | 核心模块 | 功能定位 |
|---|---|---|
| 配置层 | ScanConfig类、VulnerabilityResult数据类 | 统一管理扫描规则、请求参数、漏洞结果结构 |
| 基础能力层 | 会话初始化、安全请求、漏洞结果记录 | 提供扫描基础支撑能力,封装通用操作 |
| 漏洞检测层 | SQL 注入、XSS、敏感文件、目录遍历、HTTP 方法检测 | 实现各类漏洞的核心检测逻辑 |
| 应用层 | 报告生成、全量扫描入口、授权校验 | 对外提供扫描入口,输出检测结果 |
2.2 核心设计理念
- 配置解耦:所有扫描规则、请求参数集中管理,新增漏洞类型无需修改核心逻辑
- 异常容错:全链路异常捕获 + 自动重试机制,保证扫描稳定性
- 反反检测:随机 User-Agent、请求延迟随机化,降低被目标系统识别的概率
- 合规性:强制授权校验,明确法律风险提示,符合网络安全合规要求
- 可扩展:每个漏洞检测模块独立封装,新增检测能力仅需实现对应方法
三、核心模块详细解析
3.1 配置模块(Config Module)
3.1.1 VulnerabilityResult 数据类
模块定位:标准化漏洞检测结果结构,统一数据存储格式
@dataclass
class VulnerabilityResult:
"""漏洞检测结果数据结构"""
vuln_type: str # 漏洞类型(SQLi/XSS/FileLeak等)
risk_level: str # 风险等级(High/Medium/Low/Info)
url: str # 检测URL
payload: str # 触发payload
evidence: str # 漏洞证据(响应特征)
response_code: int # 响应状态码
detection_time: str # 检测时间
核心特性:
- 基于
dataclass实现,自动生成初始化、打印等方法,简化代码 - 字段语义清晰,覆盖漏洞报告所需核心信息
- 支持通过
asdict()方法快速转换为字典,便于报告序列化
3.1.2 ScanConfig 配置类
模块定位:集中管理所有扫描相关配置,实现规则与业务逻辑解耦
class ScanConfig:
"""扫描配置类"""
# 请求相关配置
REQUEST_TIMEOUT = 10 # 默认超时时间(秒)
RETRY_TIMES = 2 # 重试次数
REQUEST_DELAY_BASE = 0.5 # 基础请求延迟(秒)
REQUEST_DELAY_RANGE = 1.0 # 延迟随机范围(秒)
ENABLE_SSL_VERIFY = False # SSL验证开关
# User-Agent池(反反检测)
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...",
# 更多UA...
]
# 各漏洞检测规则配置
SQLI_PAYLOADS = [...] # SQL注入测试载荷
SQLI_ERROR_KEYWORDS = [...] # SQL报错关键词
XSS_PAYLOADS = [...] # XSS测试载荷
SENSITIVE_FILES = {...} # 敏感文件列表及验证规则
PATH_TRAVERSAL_PAYLOADS = [...] # 目录遍历载荷
TEST_METHODS = [...] # HTTP方法测试列表
核心特性:
- 配置分类清晰,按功能模块划分配置项
- 支持动态调整:可通过继承重写配置,适配不同扫描场景
- 规则可扩展:新增 payload / 关键词仅需修改配置,无需改动检测逻辑
3.2 基础能力模块(Basic Capability Module)
3.2.1 授权校验模块 _validate_authorization
模块定位:合规性校验,强制提醒用户获得合法授权,规避法律风险
def _validate_authorization(self):
"""合法性授权校验提示"""
warning_msg = """
==============================================
⚠️ 重要警告:
1. 本工具仅用于合法授权的安全测试场景
2. 未经授权扫描他人网站可能违反《网络安全法》
3. 使用前请确保已获得目标系统所有者的书面授权
==============================================
"""
print(warning_msg)
confirm = input("确认已获得合法授权并承担所有法律责任?(y/N): ")
if confirm.lower() != "y":
print("❌ 未确认授权,程序退出")
exit(1)
核心价值:
- 明确法律风险,符合网络安全合规要求
- 强制交互确认,避免非授权使用
3.2.2 会话初始化模块 _init_session
模块定位:初始化请求会话,配置基础请求参数,实现反反检测基础能力
def _init_session(self, headers: Optional[Dict]) -> requests.Session:
"""初始化请求会话"""
session = requests.Session()
# 基础配置
session.verify = self.config.ENABLE_SSL_VERIFY
session.timeout = self.config.REQUEST_TIMEOUT
# 请求头配置(含随机UA)
default_headers = {
"User-Agent": random.choice(self.config.USER_AGENTS),
"Accept": "text/html,application/xhtml+xml...",
# 更多请求头...
}
# 合并自定义请求头
if headers:
default_headers.update(headers)
session.headers.update(default_headers)
return session
核心特性:
- 会话复用:使用
requests.Session减少 TCP 连接建立开销 - 反反检测:随机选择 User-Agent,模拟真实浏览器请求
- 灵活扩展:支持自定义请求头,适配特殊场景
3.2.3 安全请求模块 _safe_request
模块定位:封装通用请求逻辑,实现异常处理、自动重试、请求延迟等能力
def _safe_request(self, method: str, url: str, **kwargs) -> Optional[requests.Response]:
"""
安全请求方法(带重试、延迟、异常处理)
:param method: 请求方法(GET/POST等)
:param url: 请求URL
:return: 响应对象或None
"""
# 随机请求延迟(反反检测)
delay = self.config.REQUEST_DELAY_BASE + random.uniform(0, self.config.REQUEST_DELAY_RANGE)
time.sleep(delay)
# 重试逻辑
for attempt in range(self.config.RETRY_TIMES + 1):
try:
# 随机更换User-Agent
self.session.headers["User-Agent"] = random.choice(self.config.USER_AGENTS)
response = self.session.request(method, url, **kwargs)
return response
except requests.exceptions.Timeout:
# 超时异常处理
except requests.exceptions.ConnectionError:
# 连接异常处理
except Exception as e:
# 通用异常处理
核心特性:
- 分级异常处理:区分超时、连接错误、通用异常,精准定位问题
- 自动重试:失败请求自动重试,提升扫描成功率
- 反反检测:请求延迟随机化 + 每次请求更换 UA,降低被识别概率
- 超时控制:统一超时配置,避免请求阻塞
3.2.4 漏洞结果记录模块 _add_vulnerability
模块定位:标准化漏洞结果记录逻辑,统一日志输出格式
def _add_vulnerability(self, vuln_type: str, risk_level: str, url: str,
payload: str, evidence: str, response_code: int):
"""添加漏洞结果"""
result = VulnerabilityResult(
vuln_type=vuln_type,
risk_level=risk_level,
url=url,
payload=payload,
evidence=evidence,
response_code=response_code,
detection_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
)
self.results.append(result)
# 标准化日志输出
print(f"[!] 发现{risk_level}风险 {vuln_type}:{url}")
print(f" Payload:{payload}")
print(f" 证据:{evidence[:100]}..." if len(evidence) > 100 else f" 证据:{evidence}")
核心价值:
- 统一结果存储:所有漏洞结果按标准结构存储,便于后续报告生成
- 标准化输出:日志格式统一,提升可读性
- 证据截断:长证据自动截断,避免日志冗余
3.3 漏洞检测模块(Vulnerability Detection Module)
3.3.1 SQL 注入检测模块 scan_sql_injection
模块定位:检测目标 URL 的 SQL 注入漏洞,支持报错注入、时间盲注等多种检测方式
def scan_sql_injection(self, test_urls: List[str]) -> List[VulnerabilityResult]:
"""
增强版SQL注入检测
:param test_urls: 待测试的URL路径(包含参数占位)
:return: SQL注入漏洞结果列表
"""
print("\n=== 开始SQL注入漏洞探测 ===")
sql_results = []
for url_path in tqdm(test_urls, desc="SQL注入检测进度"):
for payload, desc in self.config.SQLI_PAYLOADS:
test_url = urljoin(self.target_url, url_path + quote(payload))
# 基础请求
start_time = time.time()
response = self._safe_request("GET", test_url)
elapsed_time = time.time() - start_time
if not response:
continue
# 1. 报错注入检测
error_evidence = ""
for keyword in self.config.SQLI_ERROR_KEYWORDS:
if keyword in response.text:
error_evidence = f"响应中包含数据库错误关键词:{keyword}"
break
if error_evidence:
self._add_vulnerability(...) # 记录报错注入漏洞
break
# 2. 时间盲注检测
if "SLEEP" in payload and elapsed_time >= 3:
time_evidence = f"请求耗时{elapsed_time:.2f}秒,符合时间盲注特征"
self._add_vulnerability(...) # 记录时间盲注漏洞
break
return sql_results
核心检测逻辑:
- 报错注入:检测响应中是否包含数据库报错关键词
- 时间盲注:检测包含 SLEEP 的 payload 请求耗时是否符合预期
- 进度展示:使用 tqdm 展示检测进度,提升用户体验
- 提前终止:同一 URL 检测到漏洞后跳过其他 payload,提升效率
3.3.2 XSS 检测模块 scan_xss
模块定位:检测 XSS 漏洞及 XSS 防护配置缺失问题,支持多类型 XSS payload 检测
def scan_xss(self, test_urls: List[str]) -> List[VulnerabilityResult]:
"""
增强版XSS检测
:param test_urls: 待测试的URL路径(包含参数占位)
:return: XSS漏洞结果列表
"""
print("\n=== 开始XSS漏洞探测 ===")
xss_results = []
# 先检测响应头安全配置
base_response = self._safe_request("GET", self.target_url)
if base_response:
missing_headers = [h for h in self.config.XSS_SAFE_HEADERS if h not in base_response.headers]
if missing_headers:
self._add_vulnerability(...) # 记录XSS防护缺失
# 检测XSS注入点
for url_path in tqdm(test_urls, desc="XSS检测进度"):
for payload, desc in self.config.XSS_PAYLOADS:
test_url = urljoin(self.target_url, url_path + payload)
response = self._safe_request("GET", test_url)
if not response:
continue
# 解码响应内容以便检测
response_text = response.text
decoded_payload = payload.replace("%3C", "<").replace("%3E", ">").replace("%22", "\"")
# 检测payload是否被原样返回(未转义)
if payload in response_text or decoded_payload in response_text:
# 排除被转义的情况(如<script>)
escaped_payload = payload.replace("<", "<").replace(">", ">")
if escaped_payload not in response_text:
self._add_vulnerability(...) # 记录XSS漏洞
break
return xss_results
核心检测逻辑:
- 防护配置检测:检测响应头是否包含 X-XSS-Protection、CSP 等安全头
- Payload 检测:多类型 XSS payload 测试,覆盖脚本标签、事件触发、编码绕过等场景
- 转义判断:区分 payload 是否被 HTML 转义,降低误报率
- 解码处理:自动解码 URL 编码的 payload,提升检测准确性
3.3.3 敏感文件泄露检测模块 scan_sensitive_files
模块定位:检测目标站点是否存在敏感文件泄露,支持内容特征验证降低误报
def scan_sensitive_files(self) -> List[VulnerabilityResult]:
"""
增强版敏感文件泄露检测(增加内容验证)
:return: 敏感文件泄露结果列表
"""
print("\n=== 开始敏感文件泄露探测 ===")
file_results = []
for file_path, config in tqdm(self.config.SENSITIVE_FILES.items(), desc="敏感文件检测进度"):
test_url = urljoin(self.target_url, file_path)
response = self._safe_request("GET", test_url)
if not response:
continue
# 状态码200且不是404页面
if response.status_code == 200 and "404 Not Found" not in response.text:
# 内容特征验证
content_match = True
if config["keywords"]:
content_match = any(kw in response.text for kw in config["keywords"])
if content_match:
self._add_vulnerability(...) # 记录敏感文件泄露
file_results.append([test_url, config["risk"], evidence])
return file_results
核心检测逻辑:
- 基础检测:状态码 200 且非 404 页面
- 内容验证:基于关键词验证文件内容,避免误报(如.git/config 需包含 [core] 关键词)
- 风险分级:按文件敏感程度划分风险等级(Critical/High/Medium/Info)
3.3.4 目录遍历检测模块 scan_path_traversal
模块定位:检测目标 URL 是否存在目录遍历漏洞,支持多类型遍历 payload
def scan_path_traversal(self, test_urls: List[str]) -> List[VulnerabilityResult]:
"""
新增:目录遍历漏洞检测
:param test_urls: 待测试的URL路径
:return: 目录遍历漏洞结果列表
"""
print("\n=== 开始目录遍历漏洞探测 ===")
traversal_results = []
for url_path in tqdm(test_urls, desc="目录遍历检测进度"):
for payload, desc in self.config.PATH_TRAVERSAL_PAYLOADS:
test_url = urljoin(self.target_url, url_path + quote(payload))
response = self._safe_request("GET", test_url)
if not response:
continue
# 检测敏感内容特征
traversal_keywords = [":x:", "/bin/bash", "root:", "admin:"]
matched_keywords = [kw for kw in traversal_keywords if kw in response.text]
if matched_keywords:
self._add_vulnerability(...) # 记录目录遍历漏洞
traversal_results.append([test_url, payload, evidence])
break
return traversal_results
核心检测逻辑:
- 多 payload 测试:覆盖相对路径、Windows 路径、URL 编码路径等遍历方式
- 内容验证:检测响应中是否包含 /etc/passwd 等敏感文件特征内容
- 高危标记:目录遍历漏洞标记为 Critical 风险等级
3.3.5 HTTP 方法检测模块 scan_http_methods
模块定位:检测目标服务器是否开启危险 HTTP 方法,如 PUT/DELETE/TRACE 等
def scan_http_methods(self) -> List[VulnerabilityResult]:
"""
新增:HTTP方法漏洞检测
:return: HTTP方法漏洞结果列表
"""
print("\n=== 开始HTTP方法检测 ===")
method_results = []
for method in tqdm(self.config.TEST_METHODS, desc="HTTP方法检测进度"):
response = self._safe_request(method, self.target_url)
if not response:
continue
# 检测危险方法是否开启
if method in ["PUT", "DELETE", "TRACE"] and response.status_code not in [403, 405]:
evidence = f"服务器允许{method}方法,状态码:{response.status_code}"
risk_level = "High" if method in ["PUT", "TRACE"] else "Medium"
self._add_vulnerability(...) # 记录HTTP方法配置不当
method_results.append([self.target_url, method, evidence])
return method_results
核心检测逻辑:
- 方法遍历:测试 GET/POST/PUT/DELETE/OPTIONS/TRACE 等常用方法
- 危险判断:PUT/TRACE 方法开启标记为 High 风险,DELETE 为 Medium 风险
- 状态码验证:通过 403/405 状态码判断方法是否被禁止
3.4 报告生成模块(Report Module)
模块定位:支持多格式报告输出,包含控制台、JSON、HTML 三种格式,提供漏洞统计与详情展示
def generate_report(self, output_format: str = "console", output_path: str = None) -> None:
"""
生成检测报告
:param output_format: 输出格式(console/json/html)
:param output_path: 输出路径(文件格式时必填)
"""
if not output_path and output_format != "console":
raise ValueError("文件输出格式必须指定output_path")
# 汇总统计
risk_stats = {"Critical": 0, "High": 0, "Medium": 0, "Low": 0, "Info": 0}
vuln_types = {}
for result in self.results:
risk_stats[result.risk_level] += 1
vuln_types[result.vuln_type] = vuln_types.get(result.vuln_type, 0) + 1
# 基础报告信息
report = {
"scan_info": {
"target_url": self.target_url,
"start_time": self.scan_start_time,
"end_time": self.scan_end_time,
"duration": f"{(datetime.strptime(self.scan_end_time, '%Y-%m-%d %H:%M:%S') - datetime.strptime(self.scan_start_time, '%Y-%m-%d %H:%M:%S')).total_seconds():.2f}秒"
},
"risk_statistics": risk_stats,
"vuln_type_statistics": vuln_types,
"vulnerabilities": [asdict(r) for r in self.results]
}
# 控制台输出
if output_format == "console":
# 控制台格式化输出逻辑
# JSON输出
elif output_format == "json":
# JSON文件生成逻辑
# HTML输出
elif output_format == "html":
# HTML报告生成逻辑(含样式美化)
核心特性:
- 多格式支持:
- 控制台:实时展示,适合快速查看
- JSON:结构化数据,适合自动化分析
- HTML:可视化展示,适合人工审核(含样式美化、风险等级颜色标记)
- 统计分析:提供风险等级统计、漏洞类型统计,直观展示扫描结果
- 信息完整:包含扫描时间、目标 URL、耗时、漏洞详情等全量信息
- 易用性:HTML 报告支持 URL 跳转、内容截断,提升阅读体验
3.5 全量扫描入口模块(Full Scan Module)
模块定位:提供统一的扫描入口,整合所有检测模块,自动生成报告
def full_scan(self, test_urls: List[str]) -> None:
"""
全量扫描入口
:param test_urls: 待测试的URL路径列表
"""
self.scan_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"\n=== 开始全量安全扫描 ===")
print(f"目标URL:{self.target_url}")
print(f"开始时间:{self.scan_start_time}")
# 执行各项检测
self.scan_sql_injection(test_urls)
self.scan_xss(test_urls)
self.scan_sensitive_files()
self.scan_path_traversal(test_urls)
self.scan_http_methods()
self.scan_end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 生成报告
self.generate_report(output_format="console")
# 自动保存JSON和HTML报告
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
self.generate_report(output_format="json", output_path=f"scan_report_{timestamp}.json")
self.generate_report(output_format="html", output_path=f"scan_report_{timestamp}.html")
核心价值:
- 统一入口:一键执行所有检测模块,简化使用流程
- 自动报告:扫描完成后自动生成控制台报告,并保存 JSON/HTML 文件
- 时间记录:记录扫描开始 / 结束时间,计算总耗时
- 扩展性:新增检测模块后,仅需在此处添加调用即可集成
四、使用指南
4.1 环境准备
# 安装依赖
pip install requests tqdm
4.2 基础使用
# 1. 导入模块
from advanced_web_scanner import AdvancedWebScanner
# 2. 配置目标信息(必须获得合法授权)
TARGET_URL = "https://example.com" # 授权测试目标
TEST_URLS = [
"search.php?q=",
"article.php?id=",
"user.php?uid=",
"file.php?path="
]
# 3. 初始化扫描器
scanner = AdvancedWebScanner(TARGET_URL)
# 4. 执行全量扫描
scanner.full_scan(TEST_URLS)
4.3 自定义使用
4.3.1 单独执行某类漏洞检测
# 仅检测SQL注入
scanner = AdvancedWebScanner(TARGET_URL)
sql_vulns = scanner.scan_sql_injection(TEST_URLS)
# 仅检测敏感文件
file_vulns = scanner.scan_sensitive_files()
4.3.2 自定义扫描配置
python
运行
# 继承ScanConfig重写配置
class CustomScanConfig(ScanConfig):
REQUEST_TIMEOUT = 15 # 延长超时时间
SQLI_PAYLOADS = [("' OR '1'='1 -- ", "自定义SQL payload")] # 自定义payload
# 使用自定义配置初始化扫描器
custom_config = CustomScanConfig()
scanner = AdvancedWebScanner(TARGET_URL, config=custom_config)
4.3.3 生成指定格式报告
# 生成JSON报告
scanner.generate_report(output_format="json", output_path="custom_report.json")
# 生成HTML报告
scanner.generate_report(output_format="html", output_path="custom_report.html")
五、扩展指南
5.1 新增漏洞检测模块
- 添加配置:在
ScanConfig类中添加新漏洞的检测规则(如 payload、关键词) - 实现检测方法:在
AdvancedWebScanner类中实现scan_xxx方法,遵循现有模块的设计规范 - 集成到全量扫描:在
full_scan方法中调用新增的检测方法 - 更新报告逻辑:如需特殊报告展示,可扩展
generate_report方法
示例 - 新增弱口令检测模块:
# 1. 添加配置
class ScanConfig:
# 新增弱口令配置
WEAK_PASSWD_PATHS = ["/admin/login.php", "/login"]
WEAK_CREDENTIALS = [("admin", "admin"), ("admin", "123456"), ("root", "root")]
# 2. 实现检测方法
def scan_weak_password(self) -> List[VulnerabilityResult]:
print("\n=== 开始弱口令检测 ===")
weak_results = []
for path in tqdm(self.config.WEAK_PASSWD_PATHS, desc="弱口令检测进度"):
test_url = urljoin(self.target_url, path)
for username, password in self.config.WEAK_CREDENTIALS:
data = {"username": username, "password": password}
response = self._safe_request("POST", test_url, data=data)
if response and "登录成功" in response.text:
evidence = f"弱口令成功登录:{username}/{password}"
self._add_vulnerability(
vuln_type="弱口令",
risk_level="Critical",
url=test_url,
payload=f"{username}/{password}",
evidence=evidence,
response_code=response.status_code
)
weak_results.append([test_url, username, password])
break
return weak_results
# 3. 集成到full_scan
def full_scan(self, test_urls: List[str]) -> None:
# 原有检测逻辑...
self.scan_weak_password() # 新增调用
# 报告生成逻辑...
5.2 性能优化建议
- 并发扫描:引入
asyncio+aiohttp替代同步 requests,提升扫描效率 - 代理池集成:添加代理 IP 轮换机制,避免 IP 被封禁
- 任务队列:使用 Celery 实现分布式扫描,支持大规模目标检测
- 缓存机制:缓存已检测 URL 的结果,避免重复扫描
- 增量扫描:记录历史扫描结果,仅检测新增 / 变更 URL
5.3 反反检测增强
- 请求头随机化:除 UA 外,随机生成 Accept、Referer 等请求头
- Cookie 池:使用真实浏览器 Cookie,模拟已登录状态
- 行为模拟:添加鼠标移动、页面滚动等浏览器行为模拟
- 验证码处理:集成 2Captcha 等验证码识别服务,应对验证码拦截
六、安全与合规说明
- 合法授权:本工具仅用于合法授权的安全测试,未经授权扫描他人网站可能违反《网络安全法》
- 风险控制:内置请求延迟、重试次数限制,避免对目标服务器造成拒绝服务攻击
- 数据处理:扫描结果仅保存在本地,不收集 / 上传任何目标数据
- 免责声明:使用者需自行承担使用本工具带来的法律责任,开发者不承担任何连带责任
七、总结
该高级 Web 漏洞扫描器通过模块化设计实现了多维度漏洞检测能力,具备高扩展性、高稳定性、高合规性的特点。核心优势包括:
- 模块化架构:各功能模块独立封装,便于扩展与维护
- 精准检测:多维度验证机制降低误报率,提升检测准确性
- 用户友好:多格式报告、进度展示、标准化日志,提升使用体验
- 安全合规:强制授权校验、风险控制机制,符合网络安全规范
适用于安全测试人员、开发人员进行 Web 应用安全检测,可根据实际需求灵活扩展检测能力,是 Web 安全防护的重要工具。


1869

被折叠的 条评论
为什么被折叠?



