135 lines
5.3 KiB
Python
135 lines
5.3 KiB
Python
|
|
#!/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)
|