Files
2025-03-09 13:49:12 +08:00

135 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
XSS 深度漏洞扫描器
作者: 高级渗透工程师
版本: 1.0.0
描述: 一个全面的XSS漏洞扫描工具能够扫描多种平台的XSS漏洞并提供其他漏洞的辅助扫描功能
"""
import sys
import os
import argparse
import time
import logging
from datetime import datetime
# 导入内部模块
from xss_scanner.core.scanner_engine import ScannerEngine
from xss_scanner.core.config import Config
from xss_scanner.core.logger import setup_logger
from xss_scanner.ui.cli import display_banner, display_progress, display_results
from xss_scanner.utils.validator import validate_target
def parse_arguments():
"""解析命令行参数"""
parser = argparse.ArgumentParser(description='XSS 深度漏洞扫描器')
parser.add_argument('-u', '--url', help='目标URL')
parser.add_argument('-f', '--file', help='包含目标URL的文件')
parser.add_argument('-d', '--depth', type=int, default=2, help='爬虫深度 (默认: 2)')
parser.add_argument('-t', '--threads', type=int, default=5, help='线程数 (默认: 5)')
parser.add_argument('--timeout', type=int, default=10, help='请求超时时间,单位秒 (默认: 10)')
parser.add_argument('--user-agent', help='自定义User-Agent')
parser.add_argument('--cookie', help='请求Cookie')
parser.add_argument('--headers', help='自定义HTTP头格式: "Header1:Value1;Header2:Value2"')
parser.add_argument('--proxy', help='HTTP代理格式: http://user:pass@host:port')
parser.add_argument('--scan-level', type=int, choices=[1, 2, 3], default=2,
help='扫描级别: 1-快速, 2-标准, 3-深度 (默认: 2)')
parser.add_argument('--scan-type', choices=['all', 'xss', 'csrf', 'sqli', 'lfi', 'rfi', 'ssrf', 'xxe'],
default='all', help='扫描类型 (默认: all)')
parser.add_argument('--payload-level', type=int, choices=[1, 2, 3], default=2,
help='Payload复杂度: 1-基础, 2-标准, 3-高级 (默认: 2)')
parser.add_argument('-o', '--output', help='输出报告文件路径')
parser.add_argument('--format', choices=['txt', 'html', 'json', 'xml'], default='html',
help='报告输出格式 (默认: html)')
parser.add_argument('-v', '--verbose', action='store_true', help='显示详细输出')
parser.add_argument('--no-color', action='store_true', help='禁用彩色输出')
# 高级选项
advanced_group = parser.add_argument_group('高级选项')
advanced_group.add_argument('--browser', action='store_true', help='使用真实浏览器进行扫描')
advanced_group.add_argument('--exploit', action='store_true', help='尝试利用发现的漏洞')
advanced_group.add_argument('--custom-payloads', help='自定义Payload文件路径')
advanced_group.add_argument('--exclude', help='排除URL模式 (正则表达式)')
advanced_group.add_argument('--include', help='仅包含URL模式 (正则表达式)')
advanced_group.add_argument('--auth', help='基本认证,格式: username:password')
return parser.parse_args()
def main():
"""主函数"""
# 显示Banner
display_banner()
# 解析命令行参数
args = parse_arguments()
# 配置日志
log_level = logging.DEBUG if args.verbose else logging.INFO
logger = setup_logger(log_level, args.no_color)
# 配置扫描器
config = Config()
config.load_from_args(args)
# 验证目标
targets = []
if args.url:
if validate_target(args.url):
targets.append(args.url)
else:
logger.error(f"无效的目标URL: {args.url}")
sys.exit(1)
elif args.file:
if not os.path.exists(args.file):
logger.error(f"文件不存在: {args.file}")
sys.exit(1)
with open(args.file, 'r') as f:
for line in f:
url = line.strip()
if validate_target(url):
targets.append(url)
else:
logger.error("必须指定目标URL(-u)或包含目标的文件(-f)")
sys.exit(1)
if not targets:
logger.error("没有有效的目标")
sys.exit(1)
# 初始化扫描引擎
scanner = ScannerEngine(config)
# 开始扫描
start_time = time.time()
logger.info(f"扫描开始,目标数量: {len(targets)}")
results = []
for target in targets:
logger.info(f"正在扫描: {target}")
result = scanner.scan(target)
results.append(result)
total_time = time.time() - start_time
# 显示结果
display_results(results, total_time)
# 生成报告
if args.output:
from xss_scanner.reporters.report_generator import generate_report
generate_report(results, args.output, args.format)
logger.info(f"报告已保存至: {args.output}")
logger.info(f"扫描完成,总耗时: {total_time:.2f}")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n用户中断,扫描已停止")
sys.exit(0)
except Exception as e:
print(f"发生错误: {str(e)}")
sys.exit(1)