diff --git a/backend/apps/engine/management/commands/init_fingerprints.py b/backend/apps/engine/management/commands/init_fingerprints.py new file mode 100644 index 00000000..43f6b6a5 --- /dev/null +++ b/backend/apps/engine/management/commands/init_fingerprints.py @@ -0,0 +1,111 @@ +"""初始化内置指纹库 + +- EHole 指纹: ehole.json -> 导入到数据库 + +可重复执行:如果数据库已有数据则跳过,只在空库时导入。 +""" + +import json +import logging +from pathlib import Path + +from django.conf import settings +from django.core.management.base import BaseCommand + +from apps.engine.models import EholeFingerprint +from apps.engine.services.fingerprints import EholeFingerprintService + + +logger = logging.getLogger(__name__) + + +# 内置指纹配置 +DEFAULT_FINGERPRINTS = [ + { + "type": "ehole", + "filename": "ehole.json", + "model": EholeFingerprint, + "service": EholeFingerprintService, + "data_key": "fingerprint", # JSON 中指纹数组的 key + }, + # TODO: 后续添加 Goby, Wappalyzer +] + + +class Command(BaseCommand): + help = "初始化内置指纹库" + + def handle(self, *args, **options): + project_base = Path(settings.BASE_DIR).parent # /app/backend -> /app + fingerprints_dir = project_base / "backend" / "fingerprints" + + initialized = 0 + skipped = 0 + failed = 0 + + for item in DEFAULT_FINGERPRINTS: + fp_type = item["type"] + filename = item["filename"] + model = item["model"] + service_class = item["service"] + data_key = item["data_key"] + + # 检查数据库是否已有数据 + existing_count = model.objects.count() + if existing_count > 0: + self.stdout.write(self.style.SUCCESS( + f"[{fp_type}] 数据库已有 {existing_count} 条记录,跳过初始化" + )) + skipped += 1 + continue + + # 查找源文件 + src_path = fingerprints_dir / filename + if not src_path.exists(): + self.stdout.write(self.style.WARNING( + f"[{fp_type}] 未找到内置指纹文件: {src_path},跳过" + )) + failed += 1 + continue + + # 读取并解析 JSON + try: + with open(src_path, "r", encoding="utf-8") as f: + json_data = json.load(f) + except (json.JSONDecodeError, OSError) as exc: + self.stdout.write(self.style.ERROR( + f"[{fp_type}] 读取指纹文件失败: {exc}" + )) + failed += 1 + continue + + # 提取指纹数据 + fingerprints = json_data.get(data_key, []) + if not fingerprints: + self.stdout.write(self.style.WARNING( + f"[{fp_type}] 指纹文件中没有有效数据,跳过" + )) + failed += 1 + continue + + # 使用 Service 批量导入 + try: + service = service_class() + result = service.batch_create_fingerprints(fingerprints) + created = result.get("created", 0) + failed_count = result.get("failed", 0) + + self.stdout.write(self.style.SUCCESS( + f"[{fp_type}] 导入成功: 创建 {created} 条,失败 {failed_count} 条" + )) + initialized += 1 + except Exception as exc: + self.stdout.write(self.style.ERROR( + f"[{fp_type}] 导入失败: {exc}" + )) + failed += 1 + continue + + self.stdout.write(self.style.SUCCESS( + f"指纹初始化完成: 成功 {initialized}, 已存在跳过 {skipped}, 失败 {failed}" + )) diff --git a/backend/apps/engine/models/__init__.py b/backend/apps/engine/models/__init__.py new file mode 100644 index 00000000..0631d10f --- /dev/null +++ b/backend/apps/engine/models/__init__.py @@ -0,0 +1,17 @@ +"""Engine Models + +导出所有 Engine 模块的 Models +""" + +from .engine import WorkerNode, ScanEngine, Wordlist, NucleiTemplateRepo +from .fingerprints import EholeFingerprint + +__all__ = [ + # 核心 Models + "WorkerNode", + "ScanEngine", + "Wordlist", + "NucleiTemplateRepo", + # 指纹 Models + "EholeFingerprint", +] diff --git a/backend/apps/engine/models.py b/backend/apps/engine/models/engine.py similarity index 98% rename from backend/apps/engine/models.py rename to backend/apps/engine/models/engine.py index d7e48b8c..4359af1d 100644 --- a/backend/apps/engine/models.py +++ b/backend/apps/engine/models/engine.py @@ -1,3 +1,8 @@ +"""Engine 模块核心 Models + +包含 WorkerNode, ScanEngine, Wordlist, NucleiTemplateRepo +""" + from django.db import models @@ -78,6 +83,7 @@ class ScanEngine(models.Model): indexes = [ models.Index(fields=['-created_at']), ] + def __str__(self): return str(self.name or f'ScanEngine {self.id}') diff --git a/backend/apps/engine/models/fingerprints.py b/backend/apps/engine/models/fingerprints.py new file mode 100644 index 00000000..8248785e --- /dev/null +++ b/backend/apps/engine/models/fingerprints.py @@ -0,0 +1,43 @@ +"""指纹相关 Models + +包含 EHole、Goby、Wappalyzer 等指纹格式的数据模型 +""" + +from django.db import models + + +class EholeFingerprint(models.Model): + """EHole 格式指纹规则(字段与 ehole.json 一致)""" + + cms = models.CharField(max_length=200, help_text='产品/CMS名称') + method = models.CharField(max_length=200, default='keyword', help_text='匹配方式') + location = models.CharField(max_length=200, default='body', help_text='匹配位置') + keyword = models.JSONField(default=list, help_text='关键词列表') + is_important = models.BooleanField(default=False, help_text='是否重点资产') + type = models.CharField(max_length=100, blank=True, default='-', help_text='分类') + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + db_table = 'ehole_fingerprint' + verbose_name = 'EHole 指纹' + verbose_name_plural = 'EHole 指纹' + ordering = ['-created_at'] + indexes = [ + # 搜索过滤字段索引 + models.Index(fields=['cms']), + models.Index(fields=['method']), + models.Index(fields=['location']), + models.Index(fields=['type']), + # 排序字段索引 + models.Index(fields=['-created_at']), + ] + constraints = [ + # 唯一约束:cms + method + location 组合不能重复 + models.UniqueConstraint( + fields=['cms', 'method', 'location'], + name='unique_ehole_fingerprint' + ), + ] + + def __str__(self) -> str: + return f"{self.cms} ({self.method}@{self.location})" diff --git a/backend/apps/engine/serializers/fingerprints/__init__.py b/backend/apps/engine/serializers/fingerprints/__init__.py new file mode 100644 index 00000000..3505cbd0 --- /dev/null +++ b/backend/apps/engine/serializers/fingerprints/__init__.py @@ -0,0 +1,10 @@ +"""指纹管理 Serializers + +导出所有指纹相关的 Serializer 类 +""" + +from .ehole import EholeFingerprintSerializer + +__all__ = [ + "EholeFingerprintSerializer", +] diff --git a/backend/apps/engine/serializers/fingerprints/ehole.py b/backend/apps/engine/serializers/fingerprints/ehole.py new file mode 100644 index 00000000..4376bb1a --- /dev/null +++ b/backend/apps/engine/serializers/fingerprints/ehole.py @@ -0,0 +1,27 @@ +"""EHole 指纹 Serializer""" + +from rest_framework import serializers + +from apps.engine.models import EholeFingerprint + + +class EholeFingerprintSerializer(serializers.ModelSerializer): + """EHole 指纹序列化器""" + + class Meta: + model = EholeFingerprint + fields = ['id', 'cms', 'method', 'location', 'keyword', + 'is_important', 'type', 'created_at'] + read_only_fields = ['id', 'created_at'] + + def validate_cms(self, value): + """校验 cms 字段""" + if not value or not value.strip(): + raise serializers.ValidationError("cms 字段不能为空") + return value.strip() + + def validate_keyword(self, value): + """校验 keyword 字段""" + if not isinstance(value, list): + raise serializers.ValidationError("keyword 必须是数组") + return value diff --git a/backend/apps/engine/services/fingerprints/__init__.py b/backend/apps/engine/services/fingerprints/__init__.py new file mode 100644 index 00000000..64083e87 --- /dev/null +++ b/backend/apps/engine/services/fingerprints/__init__.py @@ -0,0 +1,12 @@ +"""指纹管理 Services + +导出所有指纹相关的 Service 类 +""" + +from .base import BaseFingerprintService +from .ehole import EholeFingerprintService + +__all__ = [ + "BaseFingerprintService", + "EholeFingerprintService", +] diff --git a/backend/apps/engine/services/fingerprints/base.py b/backend/apps/engine/services/fingerprints/base.py new file mode 100644 index 00000000..54b25df1 --- /dev/null +++ b/backend/apps/engine/services/fingerprints/base.py @@ -0,0 +1,143 @@ +"""指纹管理基类 Service + +提供通用的批量操作和缓存逻辑,供 EHole/Goby/Wappalyzer 等子类继承 +""" + +import json +import logging +from typing import Any + +logger = logging.getLogger(__name__) + + +class BaseFingerprintService: + """指纹管理基类 Service,提供通用的批量操作和缓存逻辑""" + + model = None # 子类必须指定 + BATCH_SIZE = 1000 # 每批处理数量 + + def validate_fingerprint(self, item: dict) -> bool: + """ + 校验单条指纹,子类必须实现 + + Args: + item: 单条指纹数据 + + Returns: + bool: 是否有效 + """ + raise NotImplementedError("子类必须实现 validate_fingerprint 方法") + + def validate_fingerprints(self, raw_data: list) -> tuple[list, list]: + """ + 批量校验指纹数据 + + Args: + raw_data: 原始指纹数据列表 + + Returns: + tuple: (valid_items, invalid_items) + """ + valid, invalid = [], [] + for item in raw_data: + if self.validate_fingerprint(item): + valid.append(item) + else: + invalid.append(item) + return valid, invalid + + def to_model_data(self, item: dict) -> dict: + """ + 转换为 Model 字段,子类必须实现 + + Args: + item: 原始指纹数据 + + Returns: + dict: Model 字段数据 + """ + raise NotImplementedError("子类必须实现 to_model_data 方法") + + def bulk_create(self, fingerprints: list) -> int: + """ + 批量创建指纹记录(已校验的数据) + + Args: + fingerprints: 已校验的指纹数据列表 + + Returns: + int: 成功创建数量 + """ + if not fingerprints: + return 0 + + objects = [self.model(**self.to_model_data(item)) for item in fingerprints] + created = self.model.objects.bulk_create(objects, ignore_conflicts=True) + return len(created) + + def batch_create_fingerprints(self, raw_data: list) -> dict: + """ + 完整流程:分批校验 + 批量创建 + + Args: + raw_data: 原始指纹数据列表 + + Returns: + dict: {'created': int, 'failed': int} + """ + total_created = 0 + total_failed = 0 + + for i in range(0, len(raw_data), self.BATCH_SIZE): + batch = raw_data[i:i + self.BATCH_SIZE] + valid, invalid = self.validate_fingerprints(batch) + total_created += self.bulk_create(valid) + total_failed += len(invalid) + + logger.info( + "批量创建指纹完成: created=%d, failed=%d, total=%d", + total_created, total_failed, len(raw_data) + ) + return {'created': total_created, 'failed': total_failed} + + def get_export_data(self) -> dict: + """ + 获取导出数据,子类必须实现 + + Returns: + dict: 导出的 JSON 数据 + """ + raise NotImplementedError("子类必须实现 get_export_data 方法") + + def export_to_file(self, output_path: str) -> str: + """ + 导出所有指纹到 JSON 文件 + + Args: + output_path: 输出文件路径 + + Returns: + str: 导出的文件路径 + """ + data = self.get_export_data() + with open(output_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False) + logger.info("导出指纹文件: %s", output_path) + return output_path + + def get_fingerprint_version(self) -> str: + """ + 获取指纹库版本标识(用于缓存校验) + + Returns: + str: 版本标识,格式 "{count}_{latest_timestamp}" + + 版本变化场景: + - 新增记录 → count 变化 + - 删除记录 → count 变化 + - 清空全部 → count 变为 0 + """ + count = self.model.objects.count() + latest = self.model.objects.order_by('-created_at').first() + latest_ts = int(latest.created_at.timestamp()) if latest else 0 + return f"{count}_{latest_ts}" diff --git a/backend/apps/engine/services/fingerprints/ehole.py b/backend/apps/engine/services/fingerprints/ehole.py new file mode 100644 index 00000000..674a2cfe --- /dev/null +++ b/backend/apps/engine/services/fingerprints/ehole.py @@ -0,0 +1,84 @@ +"""EHole 指纹管理 Service + +实现 EHole 格式指纹的校验、转换和导出逻辑 +""" + +from apps.engine.models import EholeFingerprint +from .base import BaseFingerprintService + + +class EholeFingerprintService(BaseFingerprintService): + """EHole 指纹管理服务(继承基类,实现 EHole 特定逻辑)""" + + model = EholeFingerprint + + def validate_fingerprint(self, item: dict) -> bool: + """ + 校验单条 EHole 指纹 + + 校验规则: + - cms 字段必须存在且非空 + - keyword 字段必须是数组 + + Args: + item: 单条指纹数据 + + Returns: + bool: 是否有效 + """ + cms = item.get('cms', '') + keyword = item.get('keyword') + return bool(cms and str(cms).strip()) and isinstance(keyword, list) + + def to_model_data(self, item: dict) -> dict: + """ + 转换 EHole JSON 格式为 Model 字段 + + 字段映射: + - isImportant (JSON) → is_important (Model) + + Args: + item: 原始 EHole JSON 数据 + + Returns: + dict: Model 字段数据 + """ + return { + 'cms': str(item.get('cms', '')).strip(), + 'method': item.get('method', 'keyword'), + 'location': item.get('location', 'body'), + 'keyword': item.get('keyword', []), + 'is_important': item.get('isImportant', False), + 'type': item.get('type', '-'), + } + + def get_export_data(self) -> dict: + """ + 获取导出数据(EHole JSON 格式) + + Returns: + dict: EHole 格式的 JSON 数据 + { + "fingerprint": [ + {"cms": "...", "method": "...", "location": "...", + "keyword": [...], "isImportant": false, "type": "..."}, + ... + ], + "version": "1000_1703836800" + } + """ + fingerprints = self.model.objects.all() + data = [] + for fp in fingerprints: + data.append({ + 'cms': fp.cms, + 'method': fp.method, + 'location': fp.location, + 'keyword': fp.keyword, + 'isImportant': fp.is_important, # 转回 JSON 格式 + 'type': fp.type, + }) + return { + 'fingerprint': data, + 'version': self.get_fingerprint_version(), + } diff --git a/backend/apps/engine/urls.py b/backend/apps/engine/urls.py index 46679a24..151071f6 100644 --- a/backend/apps/engine/urls.py +++ b/backend/apps/engine/urls.py @@ -7,6 +7,7 @@ from .views import ( WordlistViewSet, NucleiTemplateRepoViewSet, ) +from .views.fingerprints import EholeFingerprintViewSet # 创建路由器 @@ -15,6 +16,8 @@ router.register(r"engines", ScanEngineViewSet, basename="engine") router.register(r"workers", WorkerNodeViewSet, basename="worker") router.register(r"wordlists", WordlistViewSet, basename="wordlist") router.register(r"nuclei/repos", NucleiTemplateRepoViewSet, basename="nuclei-repos") +# 指纹管理 +router.register(r"fingerprints/ehole", EholeFingerprintViewSet, basename="ehole-fingerprint") urlpatterns = [ path("", include(router.urls)), diff --git a/backend/apps/engine/views/fingerprints/__init__.py b/backend/apps/engine/views/fingerprints/__init__.py new file mode 100644 index 00000000..6f69f39a --- /dev/null +++ b/backend/apps/engine/views/fingerprints/__init__.py @@ -0,0 +1,12 @@ +"""指纹管理 ViewSets + +导出所有指纹相关的 ViewSet 类 +""" + +from .base import BaseFingerprintViewSet +from .ehole import EholeFingerprintViewSet + +__all__ = [ + "BaseFingerprintViewSet", + "EholeFingerprintViewSet", +] diff --git a/backend/apps/engine/views/fingerprints/base.py b/backend/apps/engine/views/fingerprints/base.py new file mode 100644 index 00000000..13e04bc2 --- /dev/null +++ b/backend/apps/engine/views/fingerprints/base.py @@ -0,0 +1,194 @@ +"""指纹管理基类 ViewSet + +提供通用的 CRUD 和批量操作,供 EHole/Goby/Wappalyzer 等子类继承 +""" + +import json +import logging + +from django.http import HttpResponse +from rest_framework import viewsets, status, filters +from rest_framework.decorators import action +from rest_framework.response import Response +from rest_framework.exceptions import ValidationError + +from apps.common.pagination import BasePagination +from apps.common.utils.filter_utils import apply_filters + +logger = logging.getLogger(__name__) + + +class BaseFingerprintViewSet(viewsets.ModelViewSet): + """指纹管理基类 ViewSet,供 EHole/Goby/Wappalyzer 等子类继承 + + 提供的 API: + + 标准 CRUD(继承自 ModelViewSet): + - GET / 列表查询(分页 + 智能过滤) + - POST / 创建单条 + - GET /{id}/ 获取详情 + - PUT /{id}/ 更新 + - DELETE /{id}/ 删除 + + 批量操作(本类实现): + - POST /batch_create/ 批量创建(JSON body) + - POST /import_file/ 文件导入(multipart/form-data,适合 10MB+ 大文件) + - POST /bulk-delete/ 批量删除 + - POST /delete-all/ 删除所有 + - GET /export/ 导出下载 + + 智能过滤语法(filter 参数): + - field="value" 模糊匹配(包含) + - field=="value" 精确匹配 + - 多条件空格分隔 AND 关系 + - || 或 or OR 关系 + + 子类必须实现: + - service_class Service 类 + - parse_import_data 解析导入数据格式 + - get_export_filename 导出文件名 + """ + + pagination_class = BasePagination + filter_backends = [filters.OrderingFilter] + ordering = ['-created_at'] + + # 子类必须指定 + service_class = None # Service 类 + + # 智能过滤字段映射,子类必须覆盖 + FILTER_FIELD_MAPPING = {} + + def get_queryset(self): + """支持智能过滤语法""" + queryset = super().get_queryset() + filter_query = self.request.query_params.get('filter', None) + if filter_query: + queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) + return queryset + + def get_service(self): + """获取 Service 实例""" + if self.service_class is None: + raise NotImplementedError("子类必须指定 service_class") + return self.service_class() + + def parse_import_data(self, json_data: dict) -> list: + """ + 解析导入数据,子类必须实现 + + Args: + json_data: 解析后的 JSON 数据 + + Returns: + list: 指纹数据列表 + """ + raise NotImplementedError("子类必须实现 parse_import_data 方法") + + def get_export_filename(self) -> str: + """ + 导出文件名,子类必须实现 + + Returns: + str: 文件名 + """ + raise NotImplementedError("子类必须实现 get_export_filename 方法") + + @action(detail=False, methods=['post']) + def batch_create(self, request): + """ + 批量创建指纹规则 + POST /api/engine/fingerprints/{type}/batch_create/ + + 请求格式: + { + "fingerprints": [ + {"cms": "WordPress", "method": "keyword", ...}, + ... + ] + } + + 返回: + { + "created": 2, + "failed": 0 + } + """ + fingerprints = request.data.get('fingerprints', []) + if not fingerprints: + raise ValidationError('fingerprints 不能为空') + if not isinstance(fingerprints, list): + raise ValidationError('fingerprints 必须是数组') + + result = self.get_service().batch_create_fingerprints(fingerprints) + return Response(result, status=status.HTTP_201_CREATED) + + @action(detail=False, methods=['post']) + def import_file(self, request): + """ + 文件导入(适合大文件,10MB+) + POST /api/engine/fingerprints/{type}/import_file/ + + 请求格式:multipart/form-data + - file: JSON 文件 + + 返回:同 batch_create + """ + file = request.FILES.get('file') + if not file: + raise ValidationError('缺少文件') + + try: + json_data = json.load(file) + except json.JSONDecodeError as e: + raise ValidationError(f'无效的 JSON 格式: {e}') + + fingerprints = self.parse_import_data(json_data) + if not fingerprints: + raise ValidationError('文件中没有有效的指纹数据') + + result = self.get_service().batch_create_fingerprints(fingerprints) + return Response(result, status=status.HTTP_201_CREATED) + + @action(detail=False, methods=['post'], url_path='bulk-delete') + def bulk_delete(self, request): + """ + 批量删除 + POST /api/engine/fingerprints/{type}/bulk-delete/ + + 请求格式:{"ids": [1, 2, 3]} + 返回:{"deleted": 3} + """ + ids = request.data.get('ids', []) + if not ids: + raise ValidationError('ids 不能为空') + if not isinstance(ids, list): + raise ValidationError('ids 必须是数组') + + deleted_count = self.queryset.model.objects.filter(id__in=ids).delete()[0] + return Response({'deleted': deleted_count}) + + @action(detail=False, methods=['post'], url_path='delete-all') + def delete_all(self, request): + """ + 删除所有指纹 + POST /api/engine/fingerprints/{type}/delete-all/ + + 返回:{"deleted": 1000} + """ + deleted_count = self.queryset.model.objects.all().delete()[0] + return Response({'deleted': deleted_count}) + + @action(detail=False, methods=['get']) + def export(self, request): + """ + 导出指纹(前端下载) + GET /api/engine/fingerprints/{type}/export/ + + 返回:JSON 文件下载 + """ + data = self.get_service().get_export_data() + content = json.dumps(data, ensure_ascii=False, indent=2) + response = HttpResponse(content, content_type='application/json') + response['Content-Disposition'] = f'attachment; filename="{self.get_export_filename()}"' + return response diff --git a/backend/apps/engine/views/fingerprints/ehole.py b/backend/apps/engine/views/fingerprints/ehole.py new file mode 100644 index 00000000..9e6f796d --- /dev/null +++ b/backend/apps/engine/views/fingerprints/ehole.py @@ -0,0 +1,66 @@ +"""EHole 指纹管理 ViewSet""" + +from apps.common.pagination import BasePagination +from apps.engine.models import EholeFingerprint +from apps.engine.serializers.fingerprints import EholeFingerprintSerializer +from apps.engine.services.fingerprints import EholeFingerprintService + +from .base import BaseFingerprintViewSet + + +class EholeFingerprintViewSet(BaseFingerprintViewSet): + """EHole 指纹管理 ViewSet + + 继承自 BaseFingerprintViewSet,提供以下 API: + + 标准 CRUD(ModelViewSet): + - GET / 列表查询(分页) + - POST / 创建单条 + - GET /{id}/ 获取详情 + - PUT /{id}/ 更新 + - DELETE /{id}/ 删除 + + 批量操作(继承自基类): + - POST /batch_create/ 批量创建(JSON body) + - POST /import_file/ 文件导入(multipart/form-data) + - POST /bulk-delete/ 批量删除 + - POST /delete-all/ 删除所有 + - GET /export/ 导出下载 + + 智能过滤语法(filter 参数): + - cms="word" 模糊匹配 cms 字段 + - cms=="WordPress" 精确匹配 + - type="CMS" 按类型筛选 + - method="keyword" 按匹配方式筛选 + - location="body" 按匹配位置筛选 + """ + + queryset = EholeFingerprint.objects.all() + serializer_class = EholeFingerprintSerializer + pagination_class = BasePagination + service_class = EholeFingerprintService + + # 排序配置 + ordering_fields = ['created_at', 'cms'] + ordering = ['-created_at'] + + # EHole 过滤字段映射 + FILTER_FIELD_MAPPING = { + 'cms': 'cms', + 'method': 'method', + 'location': 'location', + 'type': 'type', + } + + def parse_import_data(self, json_data: dict) -> list: + """ + 解析 EHole JSON 格式的导入数据 + + 输入格式:{"fingerprint": [...]} + 返回:指纹列表 + """ + return json_data.get('fingerprint', []) + + def get_export_filename(self) -> str: + """导出文件名""" + return 'ehole.json' diff --git a/backend/apps/scan/utils/fingerprint_helpers.py b/backend/apps/scan/utils/fingerprint_helpers.py new file mode 100644 index 00000000..686f652e --- /dev/null +++ b/backend/apps/scan/utils/fingerprint_helpers.py @@ -0,0 +1,73 @@ +"""指纹文件本地缓存工具 + +提供 Worker 侧的指纹文件缓存和版本校验功能,用于: +- 指纹识别扫描 (fingerprint_scan_flow) +""" + +import logging +import os + +from django.conf import settings + +logger = logging.getLogger(__name__) + + +def ensure_ehole_fingerprint_local() -> str: + """ + 确保本地存在最新的 EHole 指纹文件(带缓存) + + 流程: + 1. 获取当前指纹库版本 + 2. 检查缓存文件是否存在且版本匹配 + 3. 版本不匹配则重新导出 + + Returns: + str: 本地指纹文件路径 + + 使用场景: + Worker 执行扫描任务前调用,获取最新指纹文件路径 + """ + from apps.engine.services.fingerprints import EholeFingerprintService + + service = EholeFingerprintService() + current_version = service.get_fingerprint_version() + + # 缓存目录和文件 + base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') + os.makedirs(base_dir, exist_ok=True) + cache_file = os.path.join(base_dir, 'ehole.json') + version_file = os.path.join(base_dir, 'ehole.version') + + # 检查缓存版本 + cached_version = None + if os.path.exists(version_file): + try: + with open(version_file, 'r') as f: + cached_version = f.read().strip() + except OSError as e: + logger.warning("读取版本文件失败: %s", e) + + # 版本匹配,直接返回缓存 + if cached_version == current_version and os.path.exists(cache_file): + logger.info("EHole 指纹文件缓存有效(版本匹配): %s", cache_file) + return cache_file + + # 版本不匹配,重新导出 + logger.info( + "EHole 指纹文件需要更新: cached=%s, current=%s", + cached_version, current_version + ) + service.export_to_file(cache_file) + + # 写入版本文件 + try: + with open(version_file, 'w') as f: + f.write(current_version) + except OSError as e: + logger.warning("写入版本文件失败: %s", e) + + logger.info("EHole 指纹文件已更新: %s", cache_file) + return cache_file + + +__all__ = ["ensure_ehole_fingerprint_local"] diff --git a/backend/fingerprints/ehole.json b/backend/fingerprints/ehole.json new file mode 100644 index 00000000..b7941af0 --- /dev/null +++ b/backend/fingerprints/ehole.json @@ -0,0 +1,4793 @@ +{ + "fingerprint": [{ + "cms": "致远OA", + "method": "keyword", + "location": "body", + "keyword": ["/seeyon/USER-DATA/IMAGES/LOGIN/login.gif"] + }, { + "cms": "致远OA", + "method": "keyword", + "location": "body", + "keyword": ["/seeyon/common/"] + }, { + "cms": "通用企业管理软件", + "method": "keyword", + "location": "body", + "keyword": ["/cwbase/web/Login.aspx"] + }, { + "cms": "致远OA M3 Server", + "method": "keyword", + "location": "title", + "keyword": ["M3 Server"] + }, { + "cms": "iDS联网数字标牌管理系统", + "method": "keyword", + "location": "title", + "keyword": ["iDS联网数字标牌管理系统"] + }, { + "cms": "Nexus Repository Manager", + "method": "keyword", + "location": "title", + "keyword": ["Nexus Repository Manager"] + }, { + "cms": "网动统一通信平台(Active UC)", + "method": "keyword", + "location": "title", + "keyword": ["网动统一通信平台(Active UC)"] + }, { + "cms": "禅道 zentao", + "method": "keyword", + "location": "title", + "keyword": ["Welcome to use zentao"] + }, { + "cms": "快云服务器小助手", + "method": "keyword", + "location": "title", + "keyword": ["快云服务器助手"] + }, { + "cms": "禅道 zentao", + "method": "keyword", + "location": "title", + "keyword": ["Welcome to zentao"] + }, { + "cms": "富通天下外贸ERP", + "method": "keyword", + "location": "title", + "keyword": ["用户登录_富通天下外贸ERP"] + }, { + "cms": "海翔D8药业云平台", + "method": "keyword", + "location": "title", + "keyword": ["登录海翔"] + }, { + "cms": "Kibana", + "method": "keyword", + "location": "title", + "keyword": ["Kibana"] + }, { + "cms": "永中在线编辑软件系统", + "method": "keyword", + "location": "body", + "keyword": ["Web Office","img/eio.png"] + }, { + "cms": "南方数码交易一体化系统", + "method": "keyword", + "location": "body", + "keyword": ["/SouthUIContent/themes/easydropdown.css"] + }, { + "cms": "朗新天霁人力资源管理系统", + "method": "keyword", + "location": "body", + "keyword": ["hrsoft.com.cn","chkLogindiv","CustStyle"] + }, { + "cms": "科荣 AIO 运营管理系统", + "method": "keyword", + "location": "body", + "keyword": ["style1/css/ListRange.css","主账套","login.jsp"] + }, { + "cms": "联达动力医院综合办公管理系统", + "method": "keyword", + "location": "body", + "keyword": ["login.aspx?Method=AJAX&UserName=","Login_Return_XML.aspx"] + }, { + "cms": "中农信达三资云平台", + "method": "keyword", + "location": "body", + "keyword": ["技术支持:北京中农信达信息技术有限公司"] + }, { + "cms": "电子申请客户端管理系统(EAC)", + "method": "keyword", + "location": "body", + "keyword": ["script/css/gwssi.css"] + }, { + "cms": "青纺联物联查询平台", + "method": "keyword", + "location": "body", + "keyword": ["青纺联物联查询平台","Themes/default/login.css"] + }, { + "cms": "致梦科技-管家婆物联通", + "method": "keyword", + "location": "body", + "keyword": ["HtmlPages/Vue/vue.js","GetLoginValidate"] + }, { + "cms": "广联达 Glodon", + "method": "keyword", + "location": "body", + "keyword": ["/ConsoleCommon/Content/weebox.css","广联达"] + }, { + "cms": "任我行 CRM", + "method": "keyword", + "location": "body", + "keyword": ["/Handlers/IdentifyingCode.ashx"] + }, { + "cms": "广联达 广讯通", + "method": "keyword", + "location": "body", + "keyword": ["gtp.standard","JS/gxtAutoLogin.js"] + }, { + "cms": "智能表综合管理系统", + "method": "keyword", + "location": "body", + "keyword": ["js/jsCore.js","Ajax_Code/Login.ashx","login.css"] + }, { + "cms": "科德电子智慧水务平台", + "method": "keyword", + "location": "body", + "keyword": ["山东科德电子有限公司","J_LoginSub"] + }, { + "cms": "秦川燃气综合管理系统", + "method": "keyword", + "location": "body", + "keyword": ["系统登录","res/icon/key.png","login"] + }, { + "cms": "东胜物流软件", + "method": "keyword", + "location": "body", + "keyword": ["js/dhtmlxcombo_whp.js","login.aspx"] + }, { + "cms": "九思 OA 协同办公系统", + "method": "keyword", + "location": "body", + "keyword": ["/jsoa/login.jsp"] + }, { + "cms": "润申信息企业标准化管理系统", + "method": "keyword", + "location": "body", + "keyword": ["润申信息","企业标准化管理系统","loginForm"] + }, { + "cms": "银达汇智智慧综合管理平台", + "method": "keyword", + "location": "body", + "keyword": ["福州银达云创信息科技有限公司","miniui/crypto/CodeManage.js"] + }, { + "cms": "同鑫T9eHR信息化管理系统", + "method": "keyword", + "location": "body", + "keyword": ["T9eHR-iconfont","Authentication/Login"] + }, { + "cms": "NortekControlLineareMerge", + "method": "keyword", + "location": "body", + "keyword": ["img/emerge.ico","login_pw"] + }, { + "cms": "致远OA M1 Server", + "method": "keyword", + "location": "title", + "keyword": ["M1-Server"] + }, { + "cms": "顶讯科技-易宝OA系统", + "method": "keyword", + "location": "title", + "keyword": ["欢迎登录易宝OA系统"] + }, { + "cms": "惠商+管理系统", + "method": "keyword", + "location": "title", + "keyword": ["惠商+管理系统"] + }, { + "cms": "红帆-ioffice OA", + "method": "keyword", + "location": "title", + "keyword": ["iOffice.net"] + }, { + "cms": "管家婆全渠道业务同步中心", + "method": "keyword", + "location": "title", + "keyword": ["管家婆全渠道业务同步中心"] + }, { + "cms": "Spring env", + "method": "keyword", + "location": "body", + "keyword": ["servletContextInitParams"] + }, { + "cms": "微三云管理系统", + "method": "keyword", + "location": "body", + "keyword": ["WSY_logo","管理系统 MANAGEMENT SYSTEM"] + }, { + "cms": "日志易", + "method": "keyword", + "location": "body", + "keyword": ["auth/passwordReset","yw-login-","yw-login-logo"] + }, { + "cms": "思迪数据池管理平台", + "method": "keyword", + "location": "body", + "keyword": ["Ajax/Login","思迪","canvas"] + }, { + "cms": "科迈 RAS", + "method": "keyword", + "location": "body", + "keyword": ["科迈RAS","CmxGoUrl.php"] + }, { + "cms": "Spring env", + "method": "keyword", + "location": "body", + "keyword": ["logback"] + }, { + "cms": "Weblogic", + "method": "keyword", + "location": "body", + "keyword": ["Error 404--Not Found"] + }, { + "cms": "Weblogic", + "method": "keyword", + "location": "body", + "keyword": ["Error 403--"] + }, { + "cms": "Weblogic", + "method": "keyword", + "location": "body", + "keyword": ["/console/framework/skins/wlsconsole/images/login_WebLogic_branding.png"] + }, { + "cms": "TWCMS", + "method": "keyword", + "location": "body", + "keyword": ["href=\"/twcms/theme/default/css/global.css"] + }, { + "cms": "Weblogic", + "method": "keyword", + "location": "body", + "keyword": ["Welcome to Weblogic Application Server"] + }, { + "cms": "Weblogic", + "method": "keyword", + "location": "body", + "keyword": ["Hypertext Transfer Protocol -- HTTP/1.1"] + }, { + "cms": "Sangfor SSL VPN", + "method": "keyword", + "location": "body", + "keyword": ["/por/login_psw.csp"] + }, { + "cms": "Sangfor SSL VPN", + "method": "keyword", + "location": "body", + "keyword": ["loginPageSP/loginPrivacy.js"] + }, { + "cms": "e-mobile", + "method": "keyword", + "location": "body", + "keyword": ["weaver,e-mobile"] + }, { + "cms": "ecology", + "method": "keyword", + "location": "header", + "keyword": ["ecology_JSessionid"] + }, { + "cms": "天融信VPN设备", + "method": "keyword", + "location": "header", + "keyword": ["topsecsvportalname"] + }, { + "cms": "PbootCMS", + "method": "keyword", + "location": "header", + "keyword": ["PbootSystem"] + }, { + "cms": "启明某VPN设备", + "method": "keyword", + "location": "body", + "keyword": ["cover_admin.css","SSLVPN LOGIN"] + }, { + "cms": "天玥运维安全网关", + "method": "keyword", + "location": "body", + "keyword": ["css/fw/full.css","js/p/login.js","login"] + }, { + "cms": "TP-LINK 产品", + "method": "keyword", + "location": "header", + "keyword": ["TP-LINK"] + }, { + "cms": "Influxdb", + "method": "keyword", + "location": "header", + "keyword": ["X-Influxdb"] + }, { + "cms": "微宏 OA", + "method": "keyword", + "location": "body", + "keyword": ["wh/servlet/MainServer"] + }, { + "cms": "Shiro", + "method": "keyword", + "location": "header", + "keyword": ["rememberMe="] + }, { + "cms": "Dreamer CMS-Shiro", + "method": "keyword", + "location": "header", + "keyword": ["dreamer-"] + }, { + "cms": "Dreamer CMS", + "method": "faviconhash", + "location": "body", + "keyword": ["-748565678"] + }, { + "cms": "慧星自来水营业管理信息系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1704826498"] + }, { + "cms": "Bonobo Git Server", + "method": "faviconhash", + "location": "body", + "keyword": ["-219625874"] + }, { + "cms": "晶奇科技救助管理系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-1185226132"] + }, { + "cms": "用友BIP 数据应用服务", + "method": "faviconhash", + "location": "body", + "keyword": ["1183274548"] + }, { + "cms": "流量通 流量平台", + "method": "faviconhash", + "location": "body", + "keyword": ["325583172"] + }, { + "cms": "北京朗新天霁人力资源系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1143915194"] + }, { + "cms": "护卫神·主机大师", + "method": "faviconhash", + "location": "body", + "keyword": ["1188645141"] + }, { + "cms": "友加畅捷U+财会通", + "method": "faviconhash", + "location": "body", + "keyword": ["2049187099"] + }, { + "cms": "万户ezOFFICE", + "method": "faviconhash", + "location": "body", + "keyword": ["-1827521324"] + }, { + "cms": "信锐物联平台", + "method": "faviconhash", + "location": "body", + "keyword": ["147973611"] + }, { + "cms": "WiseGrid慧敏应用交付网关", + "method": "faviconhash", + "location": "body", + "keyword": ["910523681"] + }, { + "cms": "Dreamer CMS", + "method": "keyword", + "location": "header", + "keyword": ["dreamer-cms"] + }, { + "cms": "Shiro", + "method": "keyword", + "location": "header", + "keyword": ["=deleteMe"] + }, { + "cms": "重庆佰鼎-佰鼎OA", + "method": "keyword", + "location": "body", + "keyword": ["default.aspx","Style/Style.css","Skin2017","TxtUserPwd"] + }, { + "cms": "PbootCMS", + "method": "keyword", + "location": "header", + "keyword": ["PbootCMS"] + }, { + "cms": "泛微云桥 e-Bridge", + "method": "keyword", + "location": "body", + "keyword": ["wx.weaver"] + }, { + "cms": "泛微 OA", + "method": "faviconhash", + "location": "body", + "keyword": ["1578525679"] + }, { + "cms": "泛微云桥 e-Bridge", + "method": "keyword", + "location": "body", + "keyword": ["e-Bridge"] + }, { + "cms": "Swagger UI", + "method": "keyword", + "location": "body", + "keyword": ["Swagger UI"] + }, { + "cms": "Ruijie", + "method": "keyword", + "location": "body", + "keyword": ["4008 111 000"] + }, { + "cms": "Huawei SMC", + "method": "keyword", + "location": "body", + "keyword": ["Script/SmcScript.js?version="] + }, { + "cms": "H3C Router", + "method": "keyword", + "location": "body", + "keyword": ["/wnm/ssl/web/frame/login.html"] + }, { + "cms": "Cisco SSLVPN", + "method": "keyword", + "location": "body", + "keyword": ["/+CSCOE+/logon.html"] + }, { + "cms": "通达OA", + "method": "keyword", + "location": "body", + "keyword": ["/images/tongda.ico"] + }, { + "cms": "通达OA", + "method": "keyword", + "location": "body", + "keyword": ["Office Anywhere"] + }, { + "cms": "通达OA", + "method": "keyword", + "location": "body", + "keyword": ["通达OA","login"] + }, { + "cms": "深信服 waf", + "method": "keyword", + "location": "body", + "keyword": ["rsa.js", "commonFunction.js"] + }, { + "cms": "深信服防火墙数据中心", + "method": "keyword", + "location": "body", + "keyword": ["Redirect to...", "/LogInOut.php"] + }, { + "cms": "深信服一体化网关 MIG", + "method": "keyword", + "location": "body", + "keyword": ["cgi-bin/login.cgi", "/html/wz_tooltip.js"] + }, { + "cms": "天融信防火墙", + "method": "keyword", + "location": "body", + "keyword": ["TOPSEC", "image/aaa.png","username"] + }, { + "cms": "天融信TopAPP负载均衡系统", + "method": "keyword", + "location": "body", + "keyword": ["TopAPP负载均衡系统", "天融信"] + }, { + "cms": "网御 vpn", + "method": "keyword", + "location": "body", + "keyword": ["/vpn/common/js/leadsec.js", "/vpn/user/common/custom/auth_home.css"] + }, { + "cms": "Typecho", + "method": "keyword", + "location": "body", + "keyword": ["typecho", "usr/themes"] + }, { + "cms": "401 登陆认证", + "method": "keyword", + "location": "title", + "keyword": ["401 Authorization"] + }, { + "cms": "唯德科创 IPEasy 知易通", + "method": "keyword", + "location": "title", + "keyword": ["_IPEasy知易通"] + }, { + "cms": "Apache Airflow", + "method": "keyword", + "location": "title", + "keyword": ["Airflow - Login"] + }, { + "cms": "启明星辰天清汉马USG防火墙", + "method": "keyword", + "location": "body", + "keyword": ["/cgi-bin/webui?op=get_product_model"] + }, { + "cms": "蓝凌 OA", + "method": "keyword", + "location": "body", + "keyword": ["sys/ui/extend/theme/default/style/icon.css", "sys/ui/extend/theme/default/style/profile.css"] + }, { + "cms": "蓝凌 OA", + "method": "keyword", + "location": "body", + "keyword": ["蓝凌软件", "App_Themes/Login"] + }, { + "cms": "飞鱼星上网行为管理", + "method": "keyword", + "location": "body", + "keyword": ["css/R1Login.css", "share.ti_username","login_logo"] + }, { + "cms": "深信服上网行为管理系统", + "method": "keyword", + "location": "body", + "keyword": ["utccjfaewjb = function(str, key)"] + }, { + "cms": "深信服上网行为管理系统", + "method": "keyword", + "location": "body", + "keyword": ["document.write(WRFWWCSFBXMIGKRKHXFJ"] + }, { + "cms": "深信服应用交付报表系统", + "method": "keyword", + "location": "body", + "keyword": ["/reportCenter/index.php?cls_mode=cluster_mode_others"] + }, { + "cms": "群晖 NAS", + "method": "keyword", + "location": "body", + "keyword": ["Synology","webman/"] + }, { + "cms": "金蝶云星空", + "method": "keyword", + "location": "body", + "keyword": ["HTML5/content/themes/kdcss.min.css"] + }, { + "cms": "金蝶云星空", + "method": "keyword", + "location": "body", + "keyword": ["/ClientBin/Kingdee.BOS.XPF.App.xap"] + }, { + "cms": "CoreMail", + "method": "keyword", + "location": "body", + "keyword": ["coremail/common"] + }, { + "cms": "启明星辰天清汉马USG防火墙", + "method": "keyword", + "location": "body", + "keyword": ["天清汉马USG"] + }, { + "cms": "Jboss", + "method": "keyword", + "location": "body", + "keyword": ["jboss.css"] + }, { + "cms": "Gitlab", + "method": "keyword", + "location": "body", + "keyword": ["assets/gitlab_logo"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["入口校验失败"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["没有找到站点","可能原因","CDN产品","Web服务","检查端口是否正确"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["恭喜,站点创建成功","面板系统后台","系统自动生成"] + }, { + "cms": "DouPHP", + "method": "keyword", + "location": "body", + "keyword": ["Powered by DouPHP","DouPHP","theme"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["扫码登录更安全","bt.cn","/login"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["站点创建成功","bt.cn"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["站点创建成功","宝塔"] + }, { + "cms": "宝塔-BT.cn", + "method": "faviconhash", + "location": "body", + "keyword": ["-386189083"] + }, { + "cms": "禅道", + "method": "keyword", + "location": "body", + "keyword": ["self.location", "Lw=="] + }, { + "cms": "禅道", + "method": "keyword", + "location": "body", + "keyword": ["/theme/default/images/main/zt-logo.png"] + }, { + "cms": "禅道", + "method": "keyword", + "location": "header", + "keyword": ["zentaosid"] + }, { + "cms": "用友软件", + "method": "keyword", + "location": "body", + "keyword": ["UFIDA Software CO.LTD all rights reserved"] + }, { + "cms": "用友NC", + "method": "keyword", + "location": "body", + "keyword": ["logo/images/ufida_nc.png","用友NC"] + }, { + "cms": "YONYOU NC", + "method": "keyword", + "location": "body", + "keyword": ["uclient.yonyou.com", "UClient"] + }, { + "cms": "宝塔-BT.cn", + "method": "keyword", + "location": "body", + "keyword": ["宝塔Linux面板"] + }, { + "cms": "RabbitMQ", + "method": "keyword", + "location": "body", + "keyword": ["<title>RabbitMQ Management"] + }, { + "cms": "Zabbix", + "method": "keyword", + "location": "body", + "keyword": ["zabbix", "Zabbix SIA"] + }, { + "cms": "联软准入", + "method": "keyword", + "location": "body", + "keyword": ["网络准入", "leagsoft", "redirect"] + }, { + "cms": "列目录", + "method": "keyword", + "location": "body", + "keyword": ["Index of /"] + }, { + "cms": "列目录", + "method": "keyword", + "location": "body", + "keyword": [" - /"] + }, { + "cms": "浪潮服务器IPMI管理口", + "method": "keyword", + "location": "body", + "keyword": ["img/inspur_logo.png", "Management System"] + }, { + "cms": "RegentApi_v2.0", + "method": "keyword", + "location": "body", + "keyword": ["RegentApi_v2.0"] + }, { + "cms": "Tomcat默认页面", + "method": "keyword", + "location": "body", + "keyword": ["/manager/status", "/manager/html"] + }, { + "cms": "slack-instance", + "method": "faviconhash", + "location": "body", + "keyword": ["99395752"] + }, { + "cms": "spring-boot", + "method": "faviconhash", + "location": "body", + "keyword": ["116323821"] + }, { + "cms": "Jenkins", + "method": "faviconhash", + "location": "body", + "keyword": ["81586312"] + }, { + "cms": "Cnservers LLC", + "method": "faviconhash", + "location": "body", + "keyword": ["-235701012"] + }, { + "cms": "Atlassian", + "method": "faviconhash", + "location": "body", + "keyword": ["743365239"] + }, { + "cms": "Chainpoint", + "method": "faviconhash", + "location": "body", + "keyword": ["2128230701"] + }, { + "cms": "LaCie", + "method": "faviconhash", + "location": "body", + "keyword": ["-1277814690"] + }, { + "cms": "Parse", + "method": "faviconhash", + "location": "body", + "keyword": ["246145559"] + }, { + "cms": "Atlassian", + "method": "faviconhash", + "location": "body", + "keyword": ["628535358"] + }, { + "cms": "JIRA", + "method": "faviconhash", + "location": "body", + "keyword": ["855273746"] + }, { + "cms": "Avigilon", + "method": "faviconhash", + "location": "body", + "keyword": ["1318124267"] + }, { + "cms": "Atlassian – Confluence", + "method": "faviconhash", + "location": "body", + "keyword": ["-305179312"] + }, { + "cms": "OpenStack", + "method": "faviconhash", + "location": "body", + "keyword": ["786533217"] + }, { + "cms": "Pi Star", + "method": "faviconhash", + "location": "body", + "keyword": ["432733105"] + }, { + "cms": "Atlassian", + "method": "faviconhash", + "location": "body", + "keyword": ["705143395"] + }, { + "cms": "Angular IO (AngularJS)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1255347784"] + }, { + "cms": "XAMPP", + "method": "faviconhash", + "location": "body", + "keyword": ["-1275226814"] + }, { + "cms": "React", + "method": "faviconhash", + "location": "body", + "keyword": ["-2009722838"] + }, { + "cms": "Atlassian – JIRA", + "method": "faviconhash", + "location": "body", + "keyword": ["981867722"] + }, { + "cms": "OpenStack", + "method": "faviconhash", + "location": "body", + "keyword": ["-923088984"] + }, { + "cms": "Aplikasi", + "method": "faviconhash", + "location": "body", + "keyword": ["494866796"] + }, { + "cms": "Ubiquiti Aircube", + "method": "faviconhash", + "location": "body", + "keyword": ["1249285083"] + }, { + "cms": "Atlassian – Bamboo", + "method": "faviconhash", + "location": "body", + "keyword": ["-1379982221"] + }, { + "cms": "Exostar – Managed Access Gateway", + "method": "faviconhash", + "location": "body", + "keyword": ["420473080"] + }, { + "cms": "Atlassian – Confluence", + "method": "faviconhash", + "location": "body", + "keyword": ["-1642532491"] + }, { + "cms": "Cisco Meraki", + "method": "faviconhash", + "location": "body", + "keyword": ["163842882"] + }, { + "cms": "Archivematica", + "method": "faviconhash", + "location": "body", + "keyword": ["-1378182799"] + }, { + "cms": "TCN", + "method": "faviconhash", + "location": "body", + "keyword": ["-702384832"] + }, { + "cms": "CX", + "method": "faviconhash", + "location": "body", + "keyword": ["-532394952"] + }, { + "cms": "Ace", + "method": "faviconhash", + "location": "body", + "keyword": ["-183163807"] + }, { + "cms": "Atlassian – JIRA", + "method": "faviconhash", + "location": "body", + "keyword": ["552727997"] + }, { + "cms": "NetData", + "method": "faviconhash", + "location": "body", + "keyword": ["1302486561"] + }, { + "cms": "OpenGeo Suite", + "method": "faviconhash", + "location": "body", + "keyword": ["-609520537"] + }, { + "cms": "Dgraph Ratel", + "method": "faviconhash", + "location": "body", + "keyword": ["-1961046099"] + }, { + "cms": "Atlassian – JIRA", + "method": "faviconhash", + "location": "body", + "keyword": ["-1581907337"] + }, { + "cms": "Material Dashboard", + "method": "faviconhash", + "location": "body", + "keyword": ["1913538826"] + }, { + "cms": "Form.io", + "method": "faviconhash", + "location": "body", + "keyword": ["1319699698"] + }, { + "cms": "Kubeflow", + "method": "faviconhash", + "location": "body", + "keyword": ["-1203021870"] + }, { + "cms": "netdata dashboard", + "method": "faviconhash", + "location": "body", + "keyword": ["-182423204"] + }, { + "cms": "CapRover", + "method": "faviconhash", + "location": "body", + "keyword": ["988422585"] + }, { + "cms": "WiJungle", + "method": "faviconhash", + "location": "body", + "keyword": ["2113497004"] + }, { + "cms": "Onera", + "method": "faviconhash", + "location": "body", + "keyword": ["1234311970"] + }, { + "cms": "SmartPing", + "method": "faviconhash", + "location": "body", + "keyword": ["430582574"] + }, { + "cms": "OpenStack", + "method": "faviconhash", + "location": "body", + "keyword": ["1232596212"] + }, { + "cms": "netdata dashboard", + "method": "faviconhash", + "location": "body", + "keyword": ["1585145626"] + }, { + "cms": "FRITZ!Box", + "method": "faviconhash", + "location": "body", + "keyword": ["-219752612"] + }, { + "cms": "fortinet-forticlient", + "method": "faviconhash", + "location": "body", + "keyword": ["945408572"] + }, { + "cms": "Ubiquiti – AirOS", + "method": "faviconhash", + "location": "body", + "keyword": ["-697231354"] + }, { + "cms": "Fortinet – Forticlient", + "method": "faviconhash", + "location": "body", + "keyword": ["945408572"] + }, { + "cms": "Outlook Web Application", + "method": "faviconhash", + "location": "body", + "keyword": ["1768726119"] + }, { + "cms": "Huawei – Claro", + "method": "faviconhash", + "location": "body", + "keyword": ["2109473187"] + }, { + "cms": "ASUS AiCloud", + "method": "faviconhash", + "location": "body", + "keyword": ["552592949"] + }, { + "cms": "SonicWALL", + "method": "faviconhash", + "location": "body", + "keyword": ["631108382"] + }, { + "cms": "Google", + "method": "faviconhash", + "location": "body", + "keyword": ["708578229"] + }, { + "cms": "Plesk", + "method": "faviconhash", + "location": "body", + "keyword": ["-134375033"] + }, { + "cms": "Dahua Storm (IP Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["2019488876"] + }, { + "cms": "Huawei – ADSL/Router", + "method": "faviconhash", + "location": "body", + "keyword": ["-1395400951"] + }, { + "cms": "Sophos Cyberoam (appliance)", + "method": "faviconhash", + "location": "body", + "keyword": ["1601194732"] + }, { + "cms": "LANCOM Systems", + "method": "faviconhash", + "location": "body", + "keyword": ["-325082670"] + }, { + "cms": "Plesk", + "method": "faviconhash", + "location": "body", + "keyword": ["-1050786453"] + }, { + "cms": "TilginAB (HomeGateway)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1346447358"] + }, { + "cms": "Supermicro Intelligent Management (IPMI)", + "method": "faviconhash", + "location": "body", + "keyword": ["1410610129"] + }, { + "cms": "Zyxel ZyWALL", + "method": "faviconhash", + "location": "body", + "keyword": ["-440644339"] + }, { + "cms": "Dell SonicWALL", + "method": "faviconhash", + "location": "body", + "keyword": ["363324987"] + }, { + "cms": "Ubiquiti Login Portals", + "method": "faviconhash", + "location": "body", + "keyword": ["-1446794564"] + }, { + "cms": "Sophos User Portal/VPN Portal", + "method": "faviconhash", + "location": "body", + "keyword": ["1045696447"] + }, { + "cms": "Apache Tomcat", + "method": "faviconhash", + "location": "body", + "keyword": ["-297069493"] + }, { + "cms": "OpenVPN", + "method": "faviconhash", + "location": "body", + "keyword": ["396533629"] + }, { + "cms": "Cyberoam", + "method": "faviconhash", + "location": "body", + "keyword": ["1462981117"] + }, { + "cms": "Technicolor", + "method": "faviconhash", + "location": "body", + "keyword": ["1594377337"] + }, { + "cms": "Vodafone (Technicolor)", + "method": "faviconhash", + "location": "body", + "keyword": ["165976831"] + }, { + "cms": "UBNT Router UI", + "method": "faviconhash", + "location": "body", + "keyword": ["-1677255344"] + }, { + "cms": "Intelbras Wireless", + "method": "faviconhash", + "location": "body", + "keyword": ["-359621743"] + }, { + "cms": "Kerio Connect (Webmail)", + "method": "faviconhash", + "location": "body", + "keyword": ["-677167908"] + }, { + "cms": "BIG-IP", + "method": "faviconhash", + "location": "body", + "keyword": ["878647854"] + }, { + "cms": "Microsoft OWA", + "method": "faviconhash", + "location": "body", + "keyword": ["442749392"] + }, { + "cms": "pfSense", + "method": "faviconhash", + "location": "body", + "keyword": ["1405460984"] + }, { + "cms": "iKuai Networks", + "method": "faviconhash", + "location": "body", + "keyword": ["-271448102"] + }, { + "cms": "Dlink Webcam", + "method": "faviconhash", + "location": "body", + "keyword": ["31972968"] + }, { + "cms": "3CX Phone System", + "method": "faviconhash", + "location": "body", + "keyword": ["970132176"] + }, { + "cms": "Bluehost", + "method": "faviconhash", + "location": "body", + "keyword": ["-1119613926"] + }, { + "cms": "Sangfor", + "method": "faviconhash", + "location": "body", + "keyword": ["123821839"] + }, { + "cms": "ZTE Corporation (Gateway/Appliance)", + "method": "faviconhash", + "location": "body", + "keyword": ["459900502"] + }, { + "cms": "Ruckus Wireless", + "method": "faviconhash", + "location": "body", + "keyword": ["-2069844696"] + }, { + "cms": "Bitnami", + "method": "faviconhash", + "location": "body", + "keyword": ["-1607644090"] + }, { + "cms": "Juniper Device Manager", + "method": "faviconhash", + "location": "body", + "keyword": ["2141724739"] + }, { + "cms": "Technicolor Gateway", + "method": "faviconhash", + "location": "body", + "keyword": ["1835479497"] + }, { + "cms": "Gitlab", + "method": "faviconhash", + "location": "body", + "keyword": ["1278323681"] + }, { + "cms": "NETASQ - Secure / Stormshield", + "method": "faviconhash", + "location": "body", + "keyword": ["-1929912510"] + }, { + "cms": "VMware Horizon", + "method": "faviconhash", + "location": "body", + "keyword": ["-1255992602"] + }, { + "cms": "VMware Horizon", + "method": "faviconhash", + "location": "body", + "keyword": ["1895360511"] + }, { + "cms": "VMware Horizon", + "method": "faviconhash", + "location": "body", + "keyword": ["-991123252"] + }, { + "cms": "Vmware Secure File Transfer", + "method": "faviconhash", + "location": "body", + "keyword": ["1642701741"] + }, { + "cms": "SAP Netweaver", + "method": "faviconhash", + "location": "body", + "keyword": ["-266008933"] + }, { + "cms": "SAP ID Service: Log On", + "method": "faviconhash", + "location": "body", + "keyword": ["-1967743928"] + }, { + "cms": "SAP Conversational AI", + "method": "faviconhash", + "location": "body", + "keyword": ["1347937389"] + }, { + "cms": "Palo Alto Login Portal", + "method": "faviconhash", + "location": "body", + "keyword": ["602431586"] + }, { + "cms": "Palo Alto Networks", + "method": "faviconhash", + "location": "body", + "keyword": ["-318947884"] + }, { + "cms": "Outlook Web Application", + "method": "faviconhash", + "location": "body", + "keyword": ["1356662359"] + }, { + "cms": "Webmin", + "method": "faviconhash", + "location": "body", + "keyword": ["1453890729"] + }, { + "cms": "Docker", + "method": "faviconhash", + "location": "body", + "keyword": ["-1814887000"] + }, { + "cms": "Docker", + "method": "faviconhash", + "location": "body", + "keyword": ["1937209448"] + }, { + "cms": "Amazon", + "method": "faviconhash", + "location": "body", + "keyword": ["-1544605732"] + }, { + "cms": "Amazon", + "method": "faviconhash", + "location": "body", + "keyword": ["716989053"] + }, { + "cms": "phpMyAdmin", + "method": "faviconhash", + "location": "body", + "keyword": ["-1010568750"] + }, { + "cms": "Zhejiang Uniview Technologies Co.", + "method": "faviconhash", + "location": "body", + "keyword": ["-1240222446"] + }, { + "cms": "ISP Manager", + "method": "faviconhash", + "location": "body", + "keyword": ["-986678507"] + }, { + "cms": "AXIS (network cameras)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1616143106"] + }, { + "cms": "Roundcube Webmail", + "method": "faviconhash", + "location": "body", + "keyword": ["-976235259"] + }, { + "cms": "UniFi Video Controller (airVision)", + "method": "faviconhash", + "location": "body", + "keyword": ["768816037"] + }, { + "cms": "pfSense", + "method": "faviconhash", + "location": "body", + "keyword": ["1015545776"] + }, { + "cms": "Freebox OS", + "method": "faviconhash", + "location": "body", + "keyword": ["1838417872"] + }, { + "cms": "Keenetic", + "method": "faviconhash", + "location": "body", + "keyword": ["547282364"] + }, { + "cms": "Sierra Wireless Ace Manager (Airlink)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1571472432"] + }, { + "cms": "Synology DiskStation", + "method": "faviconhash", + "location": "body", + "keyword": ["149371702"] + }, { + "cms": "INSTAR IP Cameras", + "method": "faviconhash", + "location": "body", + "keyword": ["-1169314298"] + }, { + "cms": "Webmin", + "method": "faviconhash", + "location": "body", + "keyword": ["-1038557304"] + }, { + "cms": "Octoprint (3D printer)", + "method": "faviconhash", + "location": "body", + "keyword": ["1307375944"] + }, { + "cms": "Webmin", + "method": "faviconhash", + "location": "body", + "keyword": ["1280907310"] + }, { + "cms": "Vesta Hosting Control Panel", + "method": "faviconhash", + "location": "body", + "keyword": ["1954835352"] + }, { + "cms": "Farming Simulator Dedicated Server", + "method": "faviconhash", + "location": "body", + "keyword": ["509789953"] + }, { + "cms": "Residential Gateway", + "method": "faviconhash", + "location": "body", + "keyword": ["-1933493443"] + }, { + "cms": "cPanel Login", + "method": "faviconhash", + "location": "body", + "keyword": ["1993518473"] + }, { + "cms": "Arris", + "method": "faviconhash", + "location": "body", + "keyword": ["-1477563858"] + }, { + "cms": "PLEX Server", + "method": "faviconhash", + "location": "body", + "keyword": ["-895890586"] + }, { + "cms": "Dlink Webcam", + "method": "faviconhash", + "location": "body", + "keyword": ["-1354933624"] + }, { + "cms": "Deluge", + "method": "faviconhash", + "location": "body", + "keyword": ["944969688"] + }, { + "cms": "Webmin", + "method": "faviconhash", + "location": "body", + "keyword": ["479413330"] + }, { + "cms": "Cambium Networks", + "method": "faviconhash", + "location": "body", + "keyword": ["-435817905"] + }, { + "cms": "Plesk", + "method": "faviconhash", + "location": "body", + "keyword": ["-981606721"] + }, { + "cms": "Dahua Storm (IP Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["833190513"] + }, { + "cms": "Parallels Plesk Panel", + "method": "faviconhash", + "location": "body", + "keyword": ["-652508439"] + }, { + "cms": "Fireware Watchguard", + "method": "faviconhash", + "location": "body", + "keyword": ["-569941107"] + }, { + "cms": "Shock&Innovation!! netis setup", + "method": "faviconhash", + "location": "body", + "keyword": ["1326164945"] + }, { + "cms": "cacaoweb", + "method": "faviconhash", + "location": "body", + "keyword": ["-1738184811"] + }, { + "cms": "Loxone (Automation)", + "method": "faviconhash", + "location": "body", + "keyword": ["904434662"] + }, { + "cms": "HP Printer / Server", + "method": "faviconhash", + "location": "body", + "keyword": ["905744673"] + }, { + "cms": "Netflix", + "method": "faviconhash", + "location": "body", + "keyword": ["902521196"] + }, { + "cms": "Linksys Smart Wi-Fi", + "method": "faviconhash", + "location": "body", + "keyword": ["-2063036701"] + }, { + "cms": "lwIP (A Lightweight TCP/IP stack)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1205024243"] + }, { + "cms": "Hitron Technologies", + "method": "faviconhash", + "location": "body", + "keyword": ["607846949"] + }, { + "cms": "Dahua Storm (DVR)", + "method": "faviconhash", + "location": "body", + "keyword": ["1281253102"] + }, { + "cms": "MOBOTIX Camera", + "method": "faviconhash", + "location": "body", + "keyword": ["661332347"] + }, { + "cms": "Blue Iris (Webcam)", + "method": "faviconhash", + "location": "body", + "keyword": ["-520888198"] + }, { + "cms": "Vigor Router", + "method": "faviconhash", + "location": "body", + "keyword": ["104189364"] + }, { + "cms": "Alibaba Cloud (Block Page)", + "method": "faviconhash", + "location": "body", + "keyword": ["1227052603"] + }, { + "cms": "DD WRT (DD-WRT milli_httpd)", + "method": "faviconhash", + "location": "body", + "keyword": ["252728887"] + }, { + "cms": "Mitel Networks (MiCollab End User Portal)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1922044295"] + }, { + "cms": "Dlink Webcam", + "method": "faviconhash", + "location": "body", + "keyword": ["1221759509"] + }, { + "cms": "Dlink Router", + "method": "faviconhash", + "location": "body", + "keyword": ["1037387972"] + }, { + "cms": "PRTG Network Monitor", + "method": "faviconhash", + "location": "body", + "keyword": ["-655683626"] + }, { + "cms": "Elastic (Database)", + "method": "faviconhash", + "location": "body", + "keyword": ["1611729805"] + }, { + "cms": "Dlink Webcam", + "method": "faviconhash", + "location": "body", + "keyword": ["1144925962"] + }, { + "cms": "Wildfly", + "method": "faviconhash", + "location": "body", + "keyword": ["-1666561833"] + }, { + "cms": "Cisco Meraki Dashboard", + "method": "faviconhash", + "location": "body", + "keyword": ["804949239"] + }, { + "cms": "Workday", + "method": "faviconhash", + "location": "body", + "keyword": ["-459291760"] + }, { + "cms": "JustHost", + "method": "faviconhash", + "location": "body", + "keyword": ["1734609466"] + }, { + "cms": "Baidu (IP error page)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1507567067"] + }, { + "cms": "Intelbras SA", + "method": "faviconhash", + "location": "body", + "keyword": ["2006716043"] + }, { + "cms": "Yii PHP Framework (Default Favicon)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1298108480"] + }, { + "cms": "truVision NVR (interlogix)", + "method": "faviconhash", + "location": "body", + "keyword": ["1782271534"] + }, { + "cms": "SOYAL Serial Device Server", + "method": "faviconhash", + "location": "body", + "keyword": ["1777351344"] + }, { + "cms": "Redmine", + "method": "faviconhash", + "location": "body", + "keyword": ["603314"] + }, { + "cms": "phpMyAdmin", + "method": "faviconhash", + "location": "body", + "keyword": ["-476231906"] + }, { + "cms": "Cisco (eg:Conference Room Login Page)", + "method": "faviconhash", + "location": "body", + "keyword": ["-646322113"] + }, { + "cms": "Jetty 404", + "method": "faviconhash", + "location": "body", + "keyword": ["-629047854"] + }, { + "cms": "Luma Surveillance", + "method": "faviconhash", + "location": "body", + "keyword": ["-1351901211"] + }, { + "cms": "Parallels Plesk Panel", + "method": "faviconhash", + "location": "body", + "keyword": ["-519765377"] + }, { + "cms": "HP Printer / Server", + "method": "faviconhash", + "location": "body", + "keyword": ["-2144363468"] + }, { + "cms": "Metasploit", + "method": "faviconhash", + "location": "body", + "keyword": ["-127886975"] + }, { + "cms": "Metasploit", + "method": "faviconhash", + "location": "body", + "keyword": ["1139788073"] + }, { + "cms": "Metasploit", + "method": "faviconhash", + "location": "body", + "keyword": ["-1235192469"] + }, { + "cms": "ALIBI NVR", + "method": "faviconhash", + "location": "body", + "keyword": ["1876585825"] + }, { + "cms": "Sangfor 应用交付报表系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-1810847295"] + }, { + "cms": "Websockets test page (eg: port 5900)", + "method": "faviconhash", + "location": "body", + "keyword": ["-291579889"] + }, { + "cms": "macOS Server (Apple)", + "method": "faviconhash", + "location": "body", + "keyword": ["1629518721"] + }, { + "cms": "OpenRG", + "method": "faviconhash", + "location": "body", + "keyword": ["-986816620"] + }, { + "cms": "Cisco Router", + "method": "faviconhash", + "location": "body", + "keyword": ["-299287097"] + }, { + "cms": "Sangfor", + "method": "faviconhash", + "location": "body", + "keyword": ["-1926484046"] + }, { + "cms": "HeroSpeed Digital Technology Co. (NVR/IPC/XVR)", + "method": "faviconhash", + "location": "body", + "keyword": ["-873627015"] + }, { + "cms": "Nomadix Access Gateway", + "method": "faviconhash", + "location": "body", + "keyword": ["2071993228"] + }, { + "cms": "Gitlab", + "method": "faviconhash", + "location": "body", + "keyword": ["516963061"] + }, { + "cms": "Magento", + "method": "faviconhash", + "location": "body", + "keyword": ["-38580010"] + }, { + "cms": "MK-AUTH", + "method": "faviconhash", + "location": "body", + "keyword": ["1490343308"] + }, { + "cms": "Shoutcast Server", + "method": "faviconhash", + "location": "body", + "keyword": ["-632583950"] + }, { + "cms": "FireEye", + "method": "faviconhash", + "location": "body", + "keyword": ["95271369"] + }, { + "cms": "FireEye", + "method": "faviconhash", + "location": "body", + "keyword": ["1476335317"] + }, { + "cms": "FireEye", + "method": "faviconhash", + "location": "body", + "keyword": ["-842192932"] + }, { + "cms": "FireEye", + "method": "faviconhash", + "location": "body", + "keyword": ["105083909"] + }, { + "cms": "FireEye", + "method": "faviconhash", + "location": "body", + "keyword": ["240606739"] + }, { + "cms": "FireEye", + "method": "faviconhash", + "location": "body", + "keyword": ["2121539357"] + }, { + "cms": "Adobe Campaign Classic", + "method": "faviconhash", + "location": "body", + "keyword": ["-333791179"] + }, { + "cms": "XAMPP", + "method": "faviconhash", + "location": "body", + "keyword": ["-1437701105"] + }, { + "cms": "Niagara Web Server", + "method": "faviconhash", + "location": "body", + "keyword": ["-676077969"] + }, { + "cms": "Technicolor", + "method": "faviconhash", + "location": "body", + "keyword": ["-2138771289"] + }, { + "cms": "Hitron Technologies Inc.", + "method": "faviconhash", + "location": "body", + "keyword": ["711742418"] + }, { + "cms": "IBM Notes", + "method": "faviconhash", + "location": "body", + "keyword": ["728788645"] + }, { + "cms": "Barracuda", + "method": "faviconhash", + "location": "body", + "keyword": ["1436966696"] + }, { + "cms": "ServiceNow", + "method": "faviconhash", + "location": "body", + "keyword": ["86919334"] + }, { + "cms": "Openfire Admin Console", + "method": "faviconhash", + "location": "body", + "keyword": ["1211608009"] + }, { + "cms": "HP iLO", + "method": "faviconhash", + "location": "body", + "keyword": ["2059618623"] + }, { + "cms": "Sunny WebBox", + "method": "faviconhash", + "location": "body", + "keyword": ["1975413433"] + }, { + "cms": "ZyXEL", + "method": "faviconhash", + "location": "body", + "keyword": ["943925975"] + }, { + "cms": "Huawei", + "method": "faviconhash", + "location": "body", + "keyword": ["281559989"] + }, { + "cms": "Tenda Web Master", + "method": "faviconhash", + "location": "body", + "keyword": ["-2145085239"] + }, { + "cms": "Prometheus Time Series Collection and Processing Server", + "method": "faviconhash", + "location": "body", + "keyword": ["-1399433489"] + }, { + "cms": "wdCP 云主机面板", + "method": "faviconhash", + "location": "body", + "keyword": ["1786752597"] + }, { + "cms": "Domoticz (Home Automation)", + "method": "faviconhash", + "location": "body", + "keyword": ["90680708"] + }, { + "cms": "Tableau", + "method": "faviconhash", + "location": "body", + "keyword": ["-1441956789"] + }, { + "cms": "openWRT Luci", + "method": "faviconhash", + "location": "body", + "keyword": ["-675839242"] + }, { + "cms": "Ubiquiti – AirOS", + "method": "faviconhash", + "location": "body", + "keyword": ["1020814938"] + }, { + "cms": "MDaemon Webmail", + "method": "faviconhash", + "location": "body", + "keyword": ["-766957661"] + }, { + "cms": "Teltonika", + "method": "faviconhash", + "location": "body", + "keyword": ["119741608"] + }, { + "cms": "Entrolink", + "method": "faviconhash", + "location": "body", + "keyword": ["1973665246"] + }, { + "cms": "WindRiver-WebServer", + "method": "faviconhash", + "location": "body", + "keyword": ["74935566"] + }, { + "cms": "Microhard Systems", + "method": "faviconhash", + "location": "body", + "keyword": ["-1723752240"] + }, { + "cms": "Skype", + "method": "faviconhash", + "location": "body", + "keyword": ["-1807411396"] + }, { + "cms": "Teltonika", + "method": "faviconhash", + "location": "body", + "keyword": ["-1612496354"] + }, { + "cms": "Eltex (Router)", + "method": "faviconhash", + "location": "body", + "keyword": ["1877797890"] + }, { + "cms": "bintec elmeg", + "method": "faviconhash", + "location": "body", + "keyword": ["-375623619"] + }, { + "cms": "SyncThru Web Service (Printers)", + "method": "faviconhash", + "location": "body", + "keyword": ["1483097076"] + }, { + "cms": "BoaServer", + "method": "faviconhash", + "location": "body", + "keyword": ["1169183049"] + }, { + "cms": "Securepoint", + "method": "faviconhash", + "location": "body", + "keyword": ["1051648103"] + }, { + "cms": "Moodle", + "method": "faviconhash", + "location": "body", + "keyword": ["-438482901"] + }, { + "cms": "RADIX", + "method": "faviconhash", + "location": "body", + "keyword": ["-1492966240"] + }, { + "cms": "CradlePoint Technology (Router)", + "method": "faviconhash", + "location": "body", + "keyword": ["1466912879"] + }, { + "cms": "Drupal", + "method": "faviconhash", + "location": "body", + "keyword": ["-167656799"] + }, { + "cms": "Blackboard", + "method": "faviconhash", + "location": "body", + "keyword": ["-1593651747"] + }, { + "cms": "Jupyter Notebook", + "method": "faviconhash", + "location": "body", + "keyword": ["-895963602"] + }, { + "cms": "HostMonster - Web hosting", + "method": "faviconhash", + "location": "body", + "keyword": ["-972810761"] + }, { + "cms": "D-Link (router/network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1703788174"] + }, { + "cms": "Rocket Chat", + "method": "faviconhash", + "location": "body", + "keyword": ["225632504"] + }, { + "cms": "mofinetwork", + "method": "faviconhash", + "location": "body", + "keyword": ["-1702393021"] + }, { + "cms": "Zabbix", + "method": "faviconhash", + "location": "body", + "keyword": ["892542951"] + }, { + "cms": "TOTOLINK (network)", + "method": "faviconhash", + "location": "body", + "keyword": ["547474373"] + }, { + "cms": "Ossia (Provision SR) | Webcam/IP Camera", + "method": "faviconhash", + "location": "body", + "keyword": ["-374235895"] + }, { + "cms": "cPanel Login", + "method": "faviconhash", + "location": "body", + "keyword": ["1544230796"] + }, { + "cms": "D-Link (router/network)", + "method": "faviconhash", + "location": "body", + "keyword": ["517158172"] + }, { + "cms": "Jeedom (home automation)", + "method": "faviconhash", + "location": "body", + "keyword": ["462223993"] + }, { + "cms": "JBoss Application Server 7", + "method": "faviconhash", + "location": "body", + "keyword": ["937999361"] + }, { + "cms": "Niagara Web Server / Tridium", + "method": "faviconhash", + "location": "body", + "keyword": ["1991562061"] + }, { + "cms": "Solarwinds Serv-U FTP Server", + "method": "faviconhash", + "location": "body", + "keyword": ["812385209"] + }, { + "cms": "Aruba (Virtual Controller)", + "method": "faviconhash", + "location": "body", + "keyword": ["1142227528"] + }, { + "cms": "Dell", + "method": "faviconhash", + "location": "body", + "keyword": ["-1153950306"] + }, { + "cms": "RemObjects SDK / Remoting SDK for .NET HTTP Server Microsoft", + "method": "faviconhash", + "location": "body", + "keyword": ["72005642"] + }, { + "cms": "Zyxel ZyWALL", + "method": "faviconhash", + "location": "body", + "keyword": ["-484708885"] + }, { + "cms": "VisualSVN Server", + "method": "faviconhash", + "location": "body", + "keyword": ["706602230"] + }, { + "cms": "Jboss", + "method": "faviconhash", + "location": "body", + "keyword": ["-656811182"] + }, { + "cms": "STARFACE VoIP Software", + "method": "faviconhash", + "location": "body", + "keyword": ["-332324409"] + }, { + "cms": "Netis (network devices)", + "method": "faviconhash", + "location": "body", + "keyword": ["-594256627"] + }, { + "cms": "WHM", + "method": "faviconhash", + "location": "body", + "keyword": ["-649378830"] + }, { + "cms": "Tandberg", + "method": "faviconhash", + "location": "body", + "keyword": ["97604680"] + }, { + "cms": "Ghost (CMS)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1015932800"] + }, { + "cms": "Avtech IP Surveillance (Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["-194439630"] + }, { + "cms": "Liferay Portal", + "method": "faviconhash", + "location": "body", + "keyword": ["129457226"] + }, { + "cms": "Parallels Plesk Panel", + "method": "faviconhash", + "location": "body", + "keyword": ["-771764544"] + }, { + "cms": "Odoo", + "method": "faviconhash", + "location": "body", + "keyword": ["-617743584"] + }, { + "cms": "Polycom", + "method": "faviconhash", + "location": "body", + "keyword": ["77044418"] + }, { + "cms": "Cake PHP", + "method": "faviconhash", + "location": "body", + "keyword": ["980692677"] + }, { + "cms": "Exacq", + "method": "faviconhash", + "location": "body", + "keyword": ["476213314"] + }, { + "cms": "CheckPoint", + "method": "faviconhash", + "location": "body", + "keyword": ["794809961"] + }, { + "cms": "Ubiquiti UNMS", + "method": "faviconhash", + "location": "body", + "keyword": ["1157789622"] + }, { + "cms": "cPanel Login", + "method": "faviconhash", + "location": "body", + "keyword": ["1244636413"] + }, { + "cms": "WorldClient for Mdaemon", + "method": "faviconhash", + "location": "body", + "keyword": ["1985721423"] + }, { + "cms": "Netport Software (DSL)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1124868062"] + }, { + "cms": "f5 Big IP", + "method": "faviconhash", + "location": "body", + "keyword": ["-335242539"] + }, { + "cms": "Mailcow", + "method": "faviconhash", + "location": "body", + "keyword": ["2146763496"] + }, { + "cms": "QNAP NAS Virtualization Station", + "method": "faviconhash", + "location": "body", + "keyword": ["-1041180225"] + }, { + "cms": "Netgear", + "method": "faviconhash", + "location": "body", + "keyword": ["-1319025408"] + }, { + "cms": "Gogs", + "method": "faviconhash", + "location": "body", + "keyword": ["917966895"] + }, { + "cms": "Trendnet IP camera", + "method": "faviconhash", + "location": "body", + "keyword": ["512590457"] + }, { + "cms": "Asustor", + "method": "faviconhash", + "location": "body", + "keyword": ["1678170702"] + }, { + "cms": "Dahua", + "method": "faviconhash", + "location": "body", + "keyword": ["-1466785234"] + }, { + "cms": "Discuz!", + "method": "faviconhash", + "location": "body", + "keyword": ["-505448917"] + },{ + "cms": "Discuz!", + "method": "keyword", + "location": "body", + "keyword": ["Discuz!","Comsenz","cache/"] + }, { + "cms": "wdCP cloud host management system", + "method": "faviconhash", + "location": "body", + "keyword": ["255892555"] + }, { + "cms": "Joomla", + "method": "faviconhash", + "location": "body", + "keyword": ["1627330242"] + }, { + "cms": "SmarterMail", + "method": "faviconhash", + "location": "body", + "keyword": ["-1935525788"] + }, { + "cms": "Seafile", + "method": "faviconhash", + "location": "body", + "keyword": ["-12700016"] + }, { + "cms": "bintec elmeg", + "method": "faviconhash", + "location": "body", + "keyword": ["1770799630"] + }, { + "cms": "NETGEAR ReadyNAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-137295400"] + }, { + "cms": "iPECS", + "method": "faviconhash", + "location": "body", + "keyword": ["-195508437"] + }, { + "cms": "bet365", + "method": "faviconhash", + "location": "body", + "keyword": ["-2116540786"] + }, { + "cms": "Reolink", + "method": "faviconhash", + "location": "body", + "keyword": ["-38705358"] + }, { + "cms": "idera", + "method": "faviconhash", + "location": "body", + "keyword": ["-450254253"] + }, { + "cms": "Proofpoint", + "method": "faviconhash", + "location": "body", + "keyword": ["-1630354993"] + }, { + "cms": "Kerio Connect WebMail", + "method": "faviconhash", + "location": "body", + "keyword": ["-1678298769"] + }, { + "cms": "WorldClient for Mdaemon", + "method": "faviconhash", + "location": "body", + "keyword": ["-35107086"] + }, { + "cms": "Realtek", + "method": "faviconhash", + "location": "body", + "keyword": ["2055322029"] + }, { + "cms": "锐捷 Ruijie Networks", + "method": "faviconhash", + "location": "body", + "keyword": ["-692947551"] + }, { + "cms": "Askey Cable Modem", + "method": "faviconhash", + "location": "body", + "keyword": ["-1710631084"] + }, { + "cms": "Askey Cable Modem", + "method": "faviconhash", + "location": "body", + "keyword": ["89321398"] + }, { + "cms": "JAWS Web Server (IP Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["90066852"] + }, { + "cms": "JAWS Web Server (IP Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["768231242"] + }, { + "cms": "Homegrown Website Hosting", + "method": "faviconhash", + "location": "body", + "keyword": ["-421986013"] + }, { + "cms": "Technicolor / Thomson Speedtouch (Network / ADSL)", + "method": "faviconhash", + "location": "body", + "keyword": ["156312019"] + }, { + "cms": "DVR (Korean)", + "method": "faviconhash", + "location": "body", + "keyword": ["-560297467"] + }, { + "cms": "Joomla", + "method": "faviconhash", + "location": "body", + "keyword": ["-1950415971"] + }, { + "cms": "TP-LINK (Network Device)", + "method": "faviconhash", + "location": "body", + "keyword": ["1842351293"] + }, { + "cms": "Salesforce", + "method": "faviconhash", + "location": "body", + "keyword": ["1433417005"] + }, { + "cms": "Apache Haus", + "method": "faviconhash", + "location": "body", + "keyword": ["-632070065"] + }, { + "cms": "Untangle", + "method": "faviconhash", + "location": "body", + "keyword": ["1103599349"] + }, { + "cms": "Shenzhen coship electronics co.", + "method": "faviconhash", + "location": "body", + "keyword": ["224536051"] + }, { + "cms": "D-Link (router/network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1038500535"] + }, { + "cms": "D-Link (camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["-355305208"] + }, { + "cms": "Kibana", + "method": "faviconhash", + "location": "body", + "keyword": ["-267431135"] + }, { + "cms": "Kibana", + "method": "faviconhash", + "location": "body", + "keyword": ["-759754862"] + }, { + "cms": "Kibana", + "method": "faviconhash", + "location": "body", + "keyword": ["-1200737715"] + }, { + "cms": "Kibana", + "method": "faviconhash", + "location": "body", + "keyword": ["75230260"] + }, { + "cms": "Kibana", + "method": "faviconhash", + "location": "body", + "keyword": ["1668183286"] + }, { + "cms": "Intelbras SA", + "method": "faviconhash", + "location": "body", + "keyword": ["283740897"] + }, { + "cms": "Icecast Streaming Media Server", + "method": "faviconhash", + "location": "body", + "keyword": ["1424295654"] + }, { + "cms": "NEC WebPro", + "method": "faviconhash", + "location": "body", + "keyword": ["1922032523"] + }, { + "cms": "Vivotek (Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1654229048"] + }, { + "cms": "Microsoft IIS", + "method": "faviconhash", + "location": "body", + "keyword": ["-1414475558"] + }, { + "cms": "Univention Portal", + "method": "faviconhash", + "location": "body", + "keyword": ["-1697334194"] + }, { + "cms": "Portainer (Docker Management)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1424036600"] + }, { + "cms": "NOS Router", + "method": "faviconhash", + "location": "body", + "keyword": ["-831826827"] + }, { + "cms": "Tongda", + "method": "faviconhash", + "location": "body", + "keyword": ["-759108386"] + }, { + "cms": "CrushFTP", + "method": "faviconhash", + "location": "body", + "keyword": ["-1022206565"] + }, { + "cms": "Endian Firewall", + "method": "faviconhash", + "location": "body", + "keyword": ["-1225484776"] + }, { + "cms": "Kerio Control Firewall", + "method": "faviconhash", + "location": "body", + "keyword": ["-631002664"] + }, { + "cms": "Ferozo Panel", + "method": "faviconhash", + "location": "body", + "keyword": ["2072198544"] + }, { + "cms": "Kerio Control Firewall", + "method": "faviconhash", + "location": "body", + "keyword": ["-466504476"] + }, { + "cms": "Cafe24 (Korea)", + "method": "faviconhash", + "location": "body", + "keyword": ["1251810433"] + }, { + "cms": "Mautic (Open Source Marketing Automation)", + "method": "faviconhash", + "location": "body", + "keyword": ["1273982002"] + }, { + "cms": "NETIASPOT (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["-978656757"] + }, { + "cms": "Multilaser", + "method": "faviconhash", + "location": "body", + "keyword": ["916642917"] + }, { + "cms": "Canvas LMS (Learning Management)", + "method": "faviconhash", + "location": "body", + "keyword": ["575613323"] + }, { + "cms": "IBM Server", + "method": "faviconhash", + "location": "body", + "keyword": ["1726027799"] + }, { + "cms": "ADB Broadband S.p.A. (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["-587741716"] + }, { + "cms": "ARRIS (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["-360566773"] + }, { + "cms": "Huawei (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["-884776764"] + }, { + "cms": "WAMPSERVER", + "method": "faviconhash", + "location": "body", + "keyword": ["929825723"] + }, { + "cms": "Seagate Technology (NAS)", + "method": "faviconhash", + "location": "body", + "keyword": ["240136437"] + }, { + "cms": "UPC Ceska Republica (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1911253822"] + }, { + "cms": "Flussonic (Video Streaming)", + "method": "faviconhash", + "location": "body", + "keyword": ["-393788031"] + }, { + "cms": "Joomla", + "method": "faviconhash", + "location": "body", + "keyword": ["366524387"] + }, { + "cms": "WAMPSERVER", + "method": "faviconhash", + "location": "body", + "keyword": ["443944613"] + }, { + "cms": "Metabase", + "method": "faviconhash", + "location": "body", + "keyword": ["1953726032"] + }, { + "cms": "D-Link (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["-2031183903"] + }, { + "cms": "MobileIron", + "method": "faviconhash", + "location": "body", + "keyword": ["545827989"] + }, { + "cms": "MobileIron", + "method": "faviconhash", + "location": "body", + "keyword": ["967636089"] + }, { + "cms": "MobileIron", + "method": "faviconhash", + "location": "body", + "keyword": ["362091310"] + }, { + "cms": "MobileIron", + "method": "faviconhash", + "location": "body", + "keyword": ["2086228042"] + }, { + "cms": "CommuniGate", + "method": "faviconhash", + "location": "body", + "keyword": ["-1588746893"] + }, { + "cms": "ZTE (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1427976651"] + }, { + "cms": "InfiNet Wireless | WANFleX (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1648531157"] + }, { + "cms": "Mersive Solstice", + "method": "faviconhash", + "location": "body", + "keyword": ["938616453"] + }, { + "cms": "Université Toulouse 1 Capitole", + "method": "faviconhash", + "location": "body", + "keyword": ["1632780968"] + }, { + "cms": "Digium (Switchvox)", + "method": "faviconhash", + "location": "body", + "keyword": ["2068154487"] + }, { + "cms": "PowerMTA monitoring", + "method": "faviconhash", + "location": "body", + "keyword": ["-1788112745"] + }, { + "cms": "SmartLAN/G", + "method": "faviconhash", + "location": "body", + "keyword": ["-644617577"] + }, { + "cms": "Checkpoint (Gaia)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1822098181"] + }, { + "cms": "УТМ (Federal Service for Alcohol Market Regulation | Russia)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1131689409"] + }, { + "cms": "MailWizz", + "method": "faviconhash", + "location": "body", + "keyword": ["2127152956"] + }, { + "cms": "RabbitMQ", + "method": "faviconhash", + "location": "body", + "keyword": ["1064742722"] + }, { + "cms": "openmediavault (NAS)", + "method": "faviconhash", + "location": "body", + "keyword": ["-693082538"] + }, { + "cms": "openWRT Luci", + "method": "faviconhash", + "location": "body", + "keyword": ["1941381095"] + }, { + "cms": "Honeywell", + "method": "faviconhash", + "location": "body", + "keyword": ["903086190"] + }, { + "cms": "BOMGAR Support Portal", + "method": "faviconhash", + "location": "body", + "keyword": ["829321644"] + }, { + "cms": "Nuxt JS", + "method": "faviconhash", + "location": "body", + "keyword": ["-1442789563"] + }, { + "cms": "RoundCube Webmail", + "method": "faviconhash", + "location": "body", + "keyword": ["-2140379067"] + }, { + "cms": "D-Link (camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1897829998"] + }, { + "cms": "Netgear (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1047213685"] + }, { + "cms": "SonarQube", + "method": "faviconhash", + "location": "body", + "keyword": ["1485257654"] + }, { + "cms": "Lupus Electronics XT", + "method": "faviconhash", + "location": "body", + "keyword": ["-299324825"] + }, { + "cms": "Vanderbilt SPC", + "method": "faviconhash", + "location": "body", + "keyword": ["-1162730477"] + }, { + "cms": "VZPP Plesk", + "method": "faviconhash", + "location": "body", + "keyword": ["-1268095485"] + }, { + "cms": "Baidu", + "method": "faviconhash", + "location": "body", + "keyword": ["1118684072"] + }, { + "cms": "ownCloud", + "method": "faviconhash", + "location": "body", + "keyword": ["-1616115760"] + }, { + "cms": "Sentora", + "method": "faviconhash", + "location": "body", + "keyword": ["-2054889066"] + }, { + "cms": "Alfresco", + "method": "faviconhash", + "location": "body", + "keyword": ["1333537166"] + }, { + "cms": "Digital Keystone (DK)", + "method": "faviconhash", + "location": "body", + "keyword": ["-373674173"] + }, { + "cms": "WISPR (Airlan)", + "method": "faviconhash", + "location": "body", + "keyword": ["-106646451"] + }, { + "cms": "Synology VPN Plus", + "method": "faviconhash", + "location": "body", + "keyword": ["1235070469"] + }, { + "cms": "Sentry", + "method": "faviconhash", + "location": "body", + "keyword": ["2063428236"] + }, { + "cms": "WatchGuard", + "method": "faviconhash", + "location": "body", + "keyword": ["15831193"] + }, { + "cms": "Web Client Pro", + "method": "faviconhash", + "location": "body", + "keyword": ["-956471263"] + }, { + "cms": "Tecvoz", + "method": "faviconhash", + "location": "body", + "keyword": ["-1452159623"] + }, { + "cms": "MDaemon Remote Administration", + "method": "faviconhash", + "location": "body", + "keyword": ["99432374"] + }, { + "cms": "Paradox IP Module", + "method": "faviconhash", + "location": "body", + "keyword": ["727253975"] + }, { + "cms": "DokuWiki", + "method": "faviconhash", + "location": "body", + "keyword": ["-630493013"] + }, { + "cms": "Sails", + "method": "faviconhash", + "location": "body", + "keyword": ["552597979"] + }, { + "cms": "FastPanel Hosting", + "method": "faviconhash", + "location": "body", + "keyword": ["774252049"] + }, { + "cms": "C-Lodop", + "method": "faviconhash", + "location": "body", + "keyword": ["-329747115"] + }, { + "cms": "Jamf Pro Login", + "method": "faviconhash", + "location": "body", + "keyword": ["1262005940"] + }, { + "cms": "StruxureWare (Schneider Electric)", + "method": "faviconhash", + "location": "body", + "keyword": ["979634648"] + }, { + "cms": "Axcient Replibit Management Server", + "method": "faviconhash", + "location": "body", + "keyword": ["475379699"] + }, { + "cms": "Twonky Server (Media Streaming)", + "method": "faviconhash", + "location": "body", + "keyword": ["-878891718"] + }, { + "cms": "Windows Azure", + "method": "faviconhash", + "location": "body", + "keyword": ["-2125083197"] + }, { + "cms": "ISP Manager (Web Hosting Panel)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1151675028"] + }, { + "cms": "JupyterHub", + "method": "faviconhash", + "location": "body", + "keyword": ["1248917303"] + }, { + "cms": "CenturyLink Modem GUI Login (eg: Technicolor)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1908556829"] + }, { + "cms": "Tecvoz", + "method": "faviconhash", + "location": "body", + "keyword": ["1059329877"] + }, { + "cms": "OPNsense", + "method": "faviconhash", + "location": "body", + "keyword": ["-1148190371"] + }, { + "cms": "Ligowave (network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1467395679"] + }, { + "cms": "Rumpus", + "method": "faviconhash", + "location": "body", + "keyword": ["-1528414776"] + }, { + "cms": "Spiceworks (panel)", + "method": "faviconhash", + "location": "body", + "keyword": ["-2117390767"] + }, { + "cms": "TeamCity", + "method": "faviconhash", + "location": "body", + "keyword": ["-1944119648"] + }, { + "cms": "INSTAR Full-HD IP-Camera", + "method": "faviconhash", + "location": "body", + "keyword": ["-1748763891"] + }, { + "cms": "GPON Home Gateway", + "method": "faviconhash", + "location": "body", + "keyword": ["251106693"] + }, { + "cms": "Alienvault", + "method": "faviconhash", + "location": "body", + "keyword": ["-1779611449"] + }, { + "cms": "Arbor Networks", + "method": "faviconhash", + "location": "body", + "keyword": ["-1745552996"] + }, { + "cms": "Accrisoft", + "method": "faviconhash", + "location": "body", + "keyword": ["-1275148624"] + }, { + "cms": "Yasni", + "method": "faviconhash", + "location": "body", + "keyword": ["-178685903"] + }, { + "cms": "Slack", + "method": "faviconhash", + "location": "body", + "keyword": ["-43161126"] + }, { + "cms": "innovaphone", + "method": "faviconhash", + "location": "body", + "keyword": ["671221099"] + }, { + "cms": "Shinobi (CCTV)", + "method": "faviconhash", + "location": "body", + "keyword": ["-10974981"] + }, { + "cms": "TP-LINK (Network Device)", + "method": "faviconhash", + "location": "body", + "keyword": ["1274078387"] + }, { + "cms": "Siemens OZW772", + "method": "faviconhash", + "location": "body", + "keyword": ["-336242473"] + }, { + "cms": "Lantronix (Spider)", + "method": "faviconhash", + "location": "body", + "keyword": ["882208493"] + }, { + "cms": "ClaimTime (Ramsell Public Health & Safety)", + "method": "faviconhash", + "location": "body", + "keyword": ["-687783882"] + }, { + "cms": "Surfilter SSL VPN Portal", + "method": "faviconhash", + "location": "body", + "keyword": ["-590892202"] + }, { + "cms": "Kyocera (Printer)", + "method": "faviconhash", + "location": "body", + "keyword": ["-50306417"] + }, { + "cms": "Lucee!", + "method": "faviconhash", + "location": "body", + "keyword": ["784872924"] + }, { + "cms": "Ricoh", + "method": "faviconhash", + "location": "body", + "keyword": ["1135165421"] + }, { + "cms": "Handle Proxy", + "method": "faviconhash", + "location": "body", + "keyword": ["926501571"] + }, { + "cms": "Metasploit", + "method": "faviconhash", + "location": "body", + "keyword": ["579239725"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-689902428"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-600508822"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["656868270"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-2056503929"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-1656695885"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["331870709"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["1241049726"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["998138196"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["322531336"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-401934945"] + }, { + "cms": "iomega NAS", + "method": "faviconhash", + "location": "body", + "keyword": ["-613216179"] + }, { + "cms": "Chef Automate", + "method": "faviconhash", + "location": "body", + "keyword": ["-276759139"] + }, { + "cms": "Gargoyle Router Management Utility", + "method": "faviconhash", + "location": "body", + "keyword": ["1862132268"] + }, { + "cms": "KeepItSafe Management Console", + "method": "faviconhash", + "location": "body", + "keyword": ["-1738727418"] + }, { + "cms": "Entronix Energy Management Platform", + "method": "faviconhash", + "location": "body", + "keyword": ["-368490461"] + }, { + "cms": "OpenProject", + "method": "faviconhash", + "location": "body", + "keyword": ["1836828108"] + }, { + "cms": "Unified Management Console (Polycom)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1775553655"] + }, { + "cms": "Moxapass ioLogik Remote Ethernet I/O Server ", + "method": "faviconhash", + "location": "body", + "keyword": ["381100274"] + }, { + "cms": "HFS (HTTP File Server)", + "method": "faviconhash", + "location": "body", + "keyword": ["2124459909"] + }, { + "cms": "HFS (HTTP File Server)", + "method": "faviconhash", + "location": "body", + "keyword": ["731374291"] + }, { + "cms": "Traccar GPS tracking", + "method": "faviconhash", + "location": "body", + "keyword": ["-335153896"] + }, { + "cms": "IW", + "method": "faviconhash", + "location": "body", + "keyword": ["896412703"] + }, { + "cms": "Wordpress Under Construction Icon", + "method": "faviconhash", + "location": "body", + "keyword": ["191654058"] + }, { + "cms": "Combivox", + "method": "faviconhash", + "location": "body", + "keyword": ["-342262483"] + }, { + "cms": "NetComWireless (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["5542029"] + }, { + "cms": "Elastic (Database)", + "method": "faviconhash", + "location": "body", + "keyword": ["1552860581"] + }, { + "cms": "Drupal", + "method": "faviconhash", + "location": "body", + "keyword": ["1174841451"] + }, { + "cms": "truVision (NVR)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1093172228"] + }, { + "cms": "SpamExperts", + "method": "faviconhash", + "location": "body", + "keyword": ["-1688698891"] + }, { + "cms": "Sonatype Nexus Repository Manager", + "method": "faviconhash", + "location": "body", + "keyword": ["-1546574541"] + }, { + "cms": "iDirect Canada (Network Management)", + "method": "faviconhash", + "location": "body", + "keyword": ["-256828986"] + }, { + "cms": "OpenERP (now known as Odoo)", + "method": "faviconhash", + "location": "body", + "keyword": ["1966198264"] + }, { + "cms": "PKP (OpenJournalSystems) Public Knowledge Project", + "method": "faviconhash", + "location": "body", + "keyword": ["2099342476"] + }, { + "cms": "LiquidFiles", + "method": "faviconhash", + "location": "body", + "keyword": ["541087742"] + }, { + "cms": "ZyXEL (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["-882760066"] + }, { + "cms": "Universal Devices (UD)", + "method": "faviconhash", + "location": "body", + "keyword": ["16202868"] + }, { + "cms": "Huawei (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["987967490"] + },{ + "cms": "Gitea", + "method": "faviconhash", + "location": "body", + "keyword": ["1969970750"] + }, { + "cms": "TC-Group", + "method": "faviconhash", + "location": "body", + "keyword": ["-1734573358"] + }, { + "cms": "Deluge Web UI", + "method": "faviconhash", + "location": "body", + "keyword": ["-1589842876"] + }, { + "cms": "AMH 云主机面板", + "method": "faviconhash", + "location": "body", + "keyword": ["1822002133"] + }, { + "cms": "OTRS (Open Ticket Request System)", + "method": "faviconhash", + "location": "body", + "keyword": ["-2006308185"] + }, { + "cms": "Bosch Security Systems (Camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1702769256"] + }, { + "cms": "Node-RED", + "method": "faviconhash", + "location": "body", + "keyword": ["321591353"] + }, { + "cms": "motionEye (camera)", + "method": "faviconhash", + "location": "body", + "keyword": ["-923693877"] + }, { + "cms": "Saia Burgess Controls – PCD", + "method": "faviconhash", + "location": "body", + "keyword": ["-1547576879"] + }, { + "cms": "Arcadyan o2 box (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1479202414"] + }, { + "cms": "D-Link (Network)", + "method": "faviconhash", + "location": "body", + "keyword": ["1081719753"] + }, { + "cms": "Abilis (Network/Automation)", + "method": "faviconhash", + "location": "body", + "keyword": ["-166151761"] + }, { + "cms": "Ghost (CMS)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1231681737"] + }, { + "cms": "Airwatch", + "method": "faviconhash", + "location": "body", + "keyword": ["321909464"] + }, { + "cms": "Airwatch", + "method": "faviconhash", + "location": "body", + "keyword": ["-1153873472"] + }, { + "cms": "Airwatch", + "method": "faviconhash", + "location": "body", + "keyword": ["1095915848"] + }, { + "cms": "Airwatch", + "method": "faviconhash", + "location": "body", + "keyword": ["788771792"] + }, { + "cms": "Airwatch", + "method": "faviconhash", + "location": "body", + "keyword": ["-1863663974"] + }, { + "cms": "KeyHelp (Keyweb AG)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1267819858"] + }, { + "cms": "KeyHelp (Keyweb AG)", + "method": "faviconhash", + "location": "body", + "keyword": ["726817668"] + }, { + "cms": "GLPI", + "method": "faviconhash", + "location": "body", + "keyword": ["-1474875778"] + }, { + "cms": "Netcom Technology", + "method": "faviconhash", + "location": "body", + "keyword": ["5471989"] + }, { + "cms": "CradlePoint", + "method": "faviconhash", + "location": "body", + "keyword": ["-1457536113"] + }, { + "cms": "MyASP", + "method": "faviconhash", + "location": "body", + "keyword": ["-736276076"] + }, { + "cms": "Intelbras SA", + "method": "faviconhash", + "location": "body", + "keyword": ["-1343070146"] + }, { + "cms": "Lenel", + "method": "faviconhash", + "location": "body", + "keyword": ["538585915"] + }, { + "cms": "OkoFEN Pellematic", + "method": "faviconhash", + "location": "body", + "keyword": ["-625364318"] + }, { + "cms": "SimpleHelp (Remote Support)", + "method": "faviconhash", + "location": "body", + "keyword": ["1117165781"] + }, { + "cms": "GraphQL", + "method": "faviconhash", + "location": "body", + "keyword": ["-1067420240"] + }, { + "cms": "DNN (CMS)", + "method": "faviconhash", + "location": "body", + "keyword": ["-1465479343"] + }, { + "cms": "Apple", + "method": "faviconhash", + "location": "body", + "keyword": ["1232159009"] + }, { + "cms": "Apple", + "method": "faviconhash", + "location": "body", + "keyword": ["1382324298"] + }, { + "cms": "Apple", + "method": "faviconhash", + "location": "body", + "keyword": ["-1498185948"] + }, { + "cms": "ISPConfig", + "method": "faviconhash", + "location": "body", + "keyword": ["483383992"] + }, { + "cms": "Microsoft Outlook", + "method": "faviconhash", + "location": "body", + "keyword": ["-1249852061"] + }, { + "cms": "Hikvision IP Camera", + "method": "faviconhash", + "location": "body", + "keyword": ["999357577"] + }, { + "cms": "IP Camera", + "method": "faviconhash", + "location": "body", + "keyword": ["492290497"] + }, { + "cms": "AfterLogicWebMail系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-194791768"] + }, { + "cms": "B2Bbuilder", + "method": "faviconhash", + "location": "body", + "keyword": ["492941040"] + }, { + "cms": "深信服下一代防火墙管理系统", + "method": "faviconhash", + "location": "body", + "keyword": ["123821839"] + }, { + "cms": "深信服WEB防篡改管理系统", + "method": "keyword", + "location": "body", + "keyword": ["WEB防篡改","cgi-bin/tamper_admin.cgi"] + }, { + "cms": "YApi 可视化接口管理平台", + "method": "keyword", + "location": "body", + "keyword": ["YApi","id=\"yapi\"","prd","可视化接口管理平台"] + }, { + "cms": "JumpServer 堡垒机", + "method": "faviconhash", + "location": "body", + "keyword": ["-1162630024"] + }, { + "cms": "WeiPHP", + "method": "keyword", + "location": "body", + "keyword": ["weiphp.css","weiphp","Public/static"] + }, { + "cms": "Nagios XI", + "method": "keyword", + "location": "body", + "keyword": ["Nagios XI","nagiosxi","Nagios"] + }, { + "cms": "ShowDoc", + "method": "faviconhash", + "location": "body", + "keyword": ["1969934080"] + }, { + "cms": "群晖 NAS", + "method": "keyword", + "location": "body", + "keyword": ["DiskStation","webman/modules","NAS"] + }, { + "cms": "协达OA", + "method": "faviconhash", + "location": "body", + "keyword": ["-1850889691"] + }, { + "cms": "山石网科 防火墙", + "method": "keyword", + "location": "body", + "keyword": ["Hillstone","licenseAggrement","GLOBAL_CONFIG.js"] + }, { + "cms": "360天堤新一代智慧防火墙", + "method": "keyword", + "location": "body", + "keyword": ["360天堤","360","360防火墙"] + }, { + "cms": "360网神防火墙系统", + "method": "keyword", + "location": "body", + "keyword": ["resources/image/logo_header.png","360","网神防火墙系统"] + }, { + "cms": "网神SecGate 3600防火墙", + "method": "keyword", + "location": "body", + "keyword": ["网神SecGate","3600防火墙","css/lsec/login.css"] + }, { + "cms": "蓝盾防火墙", + "method": "keyword", + "location": "body", + "keyword": ["蓝盾","Bluedon","default/js/act/login.js"] + }, { + "cms": "LanProxy", + "method": "keyword", + "location": "body", + "keyword": ["LanProxy","password","lanproxy-config"] + }, { + "cms": "ManageEngine ADManager Plus", + "method": "keyword", + "location": "body", + "keyword": ["ADManager","Hashtable.js","ManageEngine"] + }, { + "cms": "phpshe 商城系统", + "method": "keyword", + "location": "body", + "keyword": ["Powered by phpshe","include/js/global.js"] + }, { + "cms": "骑士 74CMS", + "method": "keyword", + "location": "body", + "keyword": ["74cms","qscms.root","index.php"] + }, { + "cms": "Apache2 Debian 默认页", + "method": "keyword", + "location": "body", + "keyword": ["Apache2 Debian Default","It works!","Debian Logo"] + }, { + "cms": "Grafana", + "method": "keyword", + "location": "body", + "keyword": ["Grafana","login","grafana-app"] + }, { + "cms": "Canal Admin", + "method": "keyword", + "location": "body", + "keyword": ["Canal Admin","js/app"] + }, { + "cms": "IBOS酷办公OA系统", + "method": "keyword", + "location": "body", + "keyword": ["IBOS","login-panel","loginsubmit"] + }, { + "cms": "若依(RuoYi)-管理系统", + "method": "keyword", + "location": "body", + "keyword": ["ry-ui","username","rememberme"] + }, { + "cms": "中新金盾信息安全管理系统", + "method": "keyword", + "location": "body", + "keyword": ["中新金盾信息安全管理系统","login","useusbkey"] + }, { + "cms": "中成科信 综合管理平台", + "method": "faviconhash", + "location": "body", + "keyword": ["1632964065"] + }, { + "cms": "VMware vCenter", + "method": "keyword", + "location": "body", + "keyword": ["VMware","ID_VISDK","download"] + }, { + "cms": "AWS S3 Bucket", + "method": "keyword", + "location": "body", + "keyword": ["InvalidBucketName","aliyuncs"] + }, { + "cms": "网心云设备", + "method": "keyword", + "location": "body", + "keyword": ["网心云设备","favicon.png"] + }, { + "cms": "深信服 NGAF", + "method": "keyword", + "location": "body", + "keyword": ["SANGFOR","NGAF","login"] + }, { + "cms": "IBM HTTP Server", + "method": "keyword", + "location": "body", + "keyword": ["IBM HTTP Server","Support"] + }, { + "cms": "nps", + "method": "keyword", + "location": "body", + "keyword": ["nps","ehang","login"] + }, { + "cms": "Webmin", + "method": "keyword", + "location": "body", + "keyword": ["Webmin","session_login"] + }, { + "cms": "群晖 DiskStation", + "method": "keyword", + "location": "body", + "keyword": ["DiskStation","文件服务器","modules"] + }, { + "cms": "锐捷 SSLVPN", + "method": "keyword", + "location": "body", + "keyword": ["SSLVPN","rjweb","login"] + }, { + "cms": "蜂网企业流控云路由器", + "method": "keyword", + "location": "body", + "keyword": ["ifw8","企业级流控云路由器","login"] + }, { + "cms": "网御 安全网关", + "method": "keyword", + "location": "body", + "keyword": ["安全系统","网御星云","login"] + }, { + "cms": "Citrix Access Gateway", + "method": "keyword", + "location": "body", + "keyword": ["Citrix Access Gateway","login"] + }, { + "cms": "深信服安全感知平台", + "method": "keyword", + "location": "body", + "keyword": ["安全感知平台","login.js","apps"] + }, { + "cms": "Apache2 Ubuntu 默认页", + "method": "keyword", + "location": "body", + "keyword": ["Apache2 Ubuntu Default Page","ubuntu-logo.png"] + }, { + "cms": "帆软报表-FineReport", + "method": "keyword", + "location": "body", + "keyword": ["ReportServer","=fs"] + }, { + "cms": "CAS 单点登录", + "method": "keyword", + "location": "body", + "keyword": ["Central Authentication Service","cas/login"] + }, { + "cms": "海康威视 流媒体管理服务器", + "method": "keyword", + "location": "body", + "keyword": ["流媒体管理服务器","MSHTML","login"] + }, { + "cms": "noVNC 远程访问", + "method": "keyword", + "location": "body", + "keyword": ["noVNC","no","host"] + }, { + "cms": "MessageSolution Enterprise Email Archiving (EEA)", + "method": "keyword", + "location": "body", + "keyword": ["MessageSolution","index.jsp"] + }, { + "cms": "阿里巴巴otter manager", + "method": "keyword", + "location": "body", + "keyword": ["Otter Manager","channelList"] + }, { + "cms": "VMware vRealize Operations Manager", + "method": "keyword", + "location": "body", + "keyword": ["vRealize","VMware","Identity Manager"] + }, { + "cms": "H3C-ER3200 路由器", + "method": "keyword", + "location": "body", + "keyword": ["ER3200","home.asp","h3c.com"] + }, { + "cms": "安恒云堡垒机", + "method": "keyword", + "location": "body", + "keyword": ["DBAPPSecurity","安恒云堡垒机"] + }, { + "cms": "安恒明御安全网关", + "method": "keyword", + "location": "title", + "keyword": ["明御安全网关"] + }, { + "cms": "Citrix 虚拟桌面", + "method": "faviconhash", + "location": "body", + "keyword": ["-1272756243"] + }, { + "cms": "SeaweedFS", + "method": "faviconhash", + "location": "body", + "keyword": ["1210969935"] + }, { + "cms": "FreeRDP 远程RDP工具", + "method": "faviconhash", + "location": "body", + "keyword": ["-2052468252"] + }, { + "cms": "Apache ActiveMQ", + "method": "faviconhash", + "location": "body", + "keyword": ["1766699363"] + }, { + "cms": "Apache-Skywalking", + "method": "faviconhash", + "location": "body", + "keyword": ["1929532064"] + }, { + "cms": "Parallels Default page", + "method": "faviconhash", + "location": "body", + "keyword": ["-1050786453"] + }, { + "cms": "Plesk 面板", + "method": "faviconhash", + "location": "body", + "keyword": ["-134375033"] + }, { + "cms": "DzzOffice 开源办公系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-1961736892"] + }, { + "cms": "网康科技网关/防火墙", + "method": "faviconhash", + "location": "body", + "keyword": ["5471989"] + }, { + "cms": "ThinkPHP", + "method": "keyword", + "location": "header", + "keyword": ["ThinkPHP"] + }, { + "cms": "SuperMap iServer Web Manager", + "method": "faviconhash", + "location": "body", + "keyword": ["1740191553"] + }, { + "cms": "协众OA", + "method": "faviconhash", + "location": "body", + "keyword": ["-1466673461"] + }, { + "cms": "Jellyfin", + "method": "faviconhash", + "location": "body", + "keyword": ["-2069226242"] + }, { + "cms": "孚盟云 CRM", + "method": "faviconhash", + "location": "body", + "keyword": ["1533124028"] + }, { + "cms": "协众OA", + "method": "keyword", + "location": "body", + "keyword": ["scripts/cnoa.extra.js"] + }, { + "cms": "FastAdmin 框架", + "method": "keyword", + "location": "body", + "keyword": ["assets/img/favicon.ico","bootstrap.min.css","navbar-toggle"] + }, { + "cms": "FastAdmin 框架", + "method": "keyword", + "location": "body", + "keyword": ["ajax\\/upload","assets/img/favicon.ico","fastadmin"] + }, { + "cms": "imo云办公室", + "method": "keyword", + "location": "body", + "keyword": ["永中文档在线预览DCS","www.yozodcs.com"] + }, { + "cms": "JeecgBoot", + "method": "keyword", + "location": "body", + "keyword": ["JeecgBoot","polyfill_"] + }, { + "cms": "帆软数据决策系统", + "method": "keyword", + "location": "body", + "keyword": [">数据决策系统","ReportServer?op"] + }, { + "cms": "金山TimeOn云杀毒", + "method": "keyword", + "location": "body", + "keyword": ["TimeOn","iepngfix/iepngfix_tilebg.js"] + }, { + "cms": "金山终端安全", + "method": "keyword", + "location": "body", + "keyword": ["终端安全系统","setup/kanclient.exe","iepngfix/iepngfix_tilebg.js"] + }, { + "cms": "YzmCMS", + "method": "keyword", + "location": "body", + "keyword": ["YzmCMS","yzm-common.css"] + }, { + "cms": "微擎 - 公众平台自助引擎", + "method": "keyword", + "location": "body", + "keyword": ["微擎 - 公众平台自助引擎","www.w7.cc","login"] + }, { + "cms": "Jspxcms", + "method": "keyword", + "location": "body", + "keyword": ["- Powered by Jspxcms","template/"] + }, { + "cms": "WordPress", + "method": "keyword", + "location": "body", + "keyword": ["wp-admin","wp-content/"] + }, { + "cms": "WordPress", + "method": "keyword", + "location": "body", + "keyword": ["wp-","wp-content/themes/"] + }, { + "cms": "金合OA", + "method": "keyword", + "location": "body", + "keyword": ["Jhsoft.Web.login","PassWord.aspx"] + }, { + "cms": "好视通视频会议系统", + "method": "keyword", + "location": "body", + "keyword": ["用户登录","resources/commonImage/favicon.ico","login/createQRCode.do"] + }, { + "cms": "LANMP 默认页面", + "method": "keyword", + "location": "body", + "keyword": ["<title>LANMP","<strong>恭喜","wdlinux.cn","本页可删除"] + }, { + "cms": "CentOS 默认页面", + "method": "keyword", + "location": "body", + "keyword": ["<title>Welcome to CentOS","img/centos-logo.png","centos.org"] + }, { + "cms": "百度 ueditor编辑器", + "method": "keyword", + "location": "body", + "keyword": ["ueditor.all.js","UE.getEditor"] + }, { + "cms": "蓝凌EIS智慧协同平台", + "method": "keyword", + "location": "body", + "keyword": ["/scripts/jquery.landray.common.js","蓝凌软件"] + }, { + "cms": "phpinfo", + "method": "keyword", + "location": "body", + "keyword": ["phpinfo","Virtual Directory Support"] + }, { + "cms": "Kyan 监控设备", + "method": "keyword", + "location": "body", + "keyword": ["login_files","platform","欢迎登陆系统"] + }, { + "cms": "Hue 大数据框架", + "method": "keyword", + "location": "body", + "keyword": ["Welcome to Hue","Query. Explore.","login"] + }, { + "cms": "亿邮邮件系统", + "method": "keyword", + "location": "body", + "keyword": ["eYou","q=login","tpl/user"] + }, { + "cms": "亿邮邮件系统", + "method": "keyword", + "location": "body", + "keyword": ["eYou","q=help","tpl/user"] + }, { + "cms": "XAMPP 默认页面", + "method": "keyword", + "location": "title", + "keyword": ["Welcome to XAMPP"] + }, { + "cms": "网神下一代极速防火墙", + "method": "keyword", + "location": "body", + "keyword": ["网神信息技术","login","防火墙"] + }, { + "cms": "中腾OA", + "method": "keyword", + "location": "body", + "keyword": ["systemAction","zt_webframe","login"] + }, { + "cms": "新软科技-极通EWEBS", + "method": "keyword", + "location": "body", + "keyword": ["N-soft","ClientDownload.xgi"] + }, { + "cms": "Igenus邮件系统", + "method": "keyword", + "location": "body", + "keyword": ["iGENUS","login.php","language"] + }, { + "cms": "图创图书馆集群管理系统", + "method": "keyword", + "location": "body", + "keyword": ["interlib/common/","self.location.href"] + }, { + "cms": "华天动力OA", + "method": "keyword", + "location": "body", + "keyword": ["OAapp/WebObjects/OAapp.woa","window.location"] + }, { + "cms": "JEECMS", + "method": "keyword", + "location": "body", + "keyword": ["/r/cms/www","shortcut icon"] + }, { + "cms": "Apache Hadoop", + "method": "keyword", + "location": "body", + "keyword": ["static/hadoop-st.png","Cluster"] + }, { + "cms": "TamronOS IPTV系统", + "method": "keyword", + "location": "body", + "keyword": ["TamronOS","loginbox","tamronos.com"] + }, { + "cms": "锐捷 RG-EW1200G", + "method": "keyword", + "location": "body", + "keyword": ["锐捷","/static/img/title.ico","/js/app"] + }, { + "cms": "H3C Web网管", + "method": "keyword", + "location": "body", + "keyword": ["webui","Web网管用户登录","china_logo.jpg"] + }, { + "cms": "H3C ER6300G2", + "method": "keyword", + "location": "body", + "keyword": ["ER6300G2","h3c.com","login"] + }, { + "cms": "H3C ER3100", + "method": "keyword", + "location": "body", + "keyword": ["ER3100","h3c.com","login"] + }, { + "cms": "SDCMS神盾内容管理系统", + "method": "keyword", + "location": "body", + "keyword": ["sdcms","login"] + }, { + "cms": "锐捷 SSLVPN", + "method": "keyword", + "location": "body", + "keyword": ["SSLVPN","rjsslvpn_encookie","login"] + }, { + "cms": "天迈科技网络视频监控系统", + "method": "keyword", + "location": "body", + "keyword": ["jsessionid","天迈科技","网络视频监控系统"] + }, { + "cms": "WIFISKY-7层流控路由器", + "method": "keyword", + "location": "body", + "keyword": ["WIFISKY","adminusr","深圳市领空技术"] + }, { + "cms": "后台", + "method": "keyword", + "location": "title", + "keyword": ["后台"] + }, { + "cms": "MinIO", + "method": "keyword", + "location": "title", + "keyword": ["MinIO Browser"] + }, { + "cms": "Consul by HashiCorp", + "method": "keyword", + "location": "title", + "keyword": ["Consul"] + }, { + "cms": "TVT 公司产品", + "method": "faviconhash", + "location": "body", + "keyword": ["492290497"] + }, { + "cms": "资产灯塔系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1708240621"] + }, { + "cms": "锐捷 NBR 路由器", + "method": "faviconhash", + "location": "body", + "keyword": ["738520282"] + }, { + "cms": "二级域名分发系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-2055778861"] + }, { + "cms": "致远 Analytics Cloud 分析云", + "method": "faviconhash", + "location": "body", + "keyword": ["410106848"] + }, { + "cms": "景云网络防病毒系统", + "method": "keyword", + "location": "body", + "keyword": ["styles/images/logo.png","login_form","防病毒"] + }, { + "cms": "VA 虚拟应用管理平台", + "method": "keyword", + "location": "body", + "keyword": ["Res/Images/logo_va.png","panel_login"] + }, { + "cms": "用友 NC Cloud", + "method": "keyword", + "location": "body", + "keyword": ["platform/pub/welcome.do"] + }, { + "cms": "GitBook", + "method": "keyword", + "location": "body", + "keyword": ["content=\"GitBook","gitbook"] + }, { + "cms": "Outlook", + "method": "keyword", + "location": "body", + "keyword": ["owa/auth","Outlook","logonDiv"] + }, { + "cms": "万户网络ezEIP", + "method": "keyword", + "location": "body", + "keyword": ["Powered By wanhu - www.wanhu.com.cn","ezEip"] + }, { + "cms": "海康威视联网网关", + "method": "keyword", + "location": "body", + "keyword": ["独立运行(无平台)","login_form"] + }, { + "cms": "阿姆瑞特智能DNS", + "method": "keyword", + "location": "body", + "keyword": ["DNS","main.php?mod=member","DNS_"] + }, { + "cms": "PHPOA 协同办公软件", + "method": "keyword", + "location": "body", + "keyword": ["login.php","提示信息","showMsg"] + }, { + "cms": "明致 OA", + "method": "faviconhash", + "location": "body", + "keyword": ["1591287747"] + }, { + "cms": "JBoss EAP", + "method": "keyword", + "location": "body", + "keyword": ["title>EAP","eap.css","JBoss"] + }, { + "cms": "若依", + "method": "keyword", + "location": "body", + "keyword": ["ruoyi","若依","login"] + }, { + "cms": "万户 OA", + "method": "keyword", + "location": "body", + "keyword": ["defaultroot","Logon!logon.action","domainAccount"] + }, { + "cms": "全息AI弱电网络综合运维平台", + "method": "keyword", + "location": "body", + "keyword": ["全息AI","g_is_hk","login"] + }, { + "cms": "天融信产品", + "method": "keyword", + "location": "body", + "keyword": ["<TITLE>Web User Login","loginCheck"] + }, { + "cms": "天融信VPN", + "method": "keyword", + "location": "header", + "keyword": ["topsecsvportalstyle"] + }, { + "cms": "天融信WEB应用安全防护系统", + "method": "keyword", + "location": "body", + "keyword": ["module=login","topsec","login"] + }, { + "cms": "天融信 Reporter", + "method": "keyword", + "location": "body", + "keyword": ["Login @ Reporter","topsec","login"] + }, { + "cms": "易瑞授权访问系统", + "method": "keyword", + "location": "title", + "keyword": ["易瑞授权访问系统"] + }, { + "cms": "E-Tiller", + "method": "keyword", + "location": "body", + "keyword": ["北京勤云","reader/view_abstract.aspx"] + }, { + "cms": "FangMail", + "method": "keyword", + "location": "body", + "keyword": ["fangmail/default/css/em_css.css","fangmail/cgi/index.cgi"] + }, { + "cms": "Tencent-Exmail", + "method": "keyword", + "location": "header", + "keyword": ["ssl_edition=mail.qq.com"] + }, { + "cms": "Tencent-Exmail", + "method": "keyword", + "location": "body", + "keyword": ["cgi-bin/getinvestigate?flowid=","cgi-bin/bizmail_portal"] + }, { + "cms": "Jira", + "method": "keyword", + "location": "body", + "keyword": ["jira.webresources","com.atlassian.plugins"] + }, { + "cms": "FishEye", + "method": "keyword", + "location": "header", + "keyword": ["FESESSIONID="] + }, { + "cms": "天玥网络安全审计系统", + "method": "keyword", + "location": "body", + "keyword": ["天玥","venustech","func_login"] + }, { + "cms": "金航网上阅卷系统", + "method": "keyword", + "location": "body", + "keyword": ["金航","jsyj","衡水金航"] + }, { + "cms": "科脉·蛙笑在线商业管理软件", + "method": "keyword", + "location": "body", + "keyword": ["Kemai","Login.aspx","科脉"] + }, { + "cms": "朗拓健康医院管理系统", + "method": "keyword", + "location": "body", + "keyword": ["static/mq/yaoxun_pbm_im.js","js/app."] + }, { + "cms": "品德科技医学在线考试系统", + "method": "keyword", + "location": "body", + "keyword": ["考试系统","品德","login.aspx"] + }, { + "cms": "SPON IP网络对讲广播系统", + "method": "keyword", + "location": "body", + "keyword": ["spon_base64.js","login"] + }, { + "cms": "NVS3000综合视频监控平台", + "method": "keyword", + "location": "body", + "keyword": ["视频监控","NVS3000综合","login"] + }, { + "cms": "银达汇智 智慧综合管理平台", + "method": "keyword", + "location": "body", + "keyword": ["miniui","Help ?","main.aspx"] + }, { + "cms": "云信通短信运营管理平台", + "method": "keyword", + "location": "body", + "keyword": ["短信","Simpla","chklogin.aspx"] + }, { + "cms": "AceNet 驰崴防火墙", + "method": "keyword", + "location": "body", + "keyword": ["Technology","login_commit.php"] + }, { + "cms": "Teleport 堡垒机", + "method": "keyword", + "location": "body", + "keyword": ["TELEPORT","teleport.js","login-account"] + }, { + "cms": "天融信-上网行为管理系统", + "method": "keyword", + "location": "body", + "keyword": ["images/logo3.gif","dkey_activex_download.php","login_commit.php"] + }, { + "cms": "Yii框架", + "method": "keyword", + "location": "body", + "keyword": ["yii.js","yii."] + }, { + "cms": "PHP", + "method": "keyword", + "location": "header", + "keyword": ["PHP/"] + }, { + "cms": "WPS 部署可视化平台", + "method": "keyword", + "location": "title", + "keyword": ["WPS 部署可视化平台"] + }, { + "cms": "phpstydy Windows", + "method": "keyword", + "location": "title", + "keyword": ["phpstudy for windows"] + }, { + "cms": "有WAF", + "method": "keyword", + "location": "header", + "keyword": ["WAF/"] + }, { + "cms": "移动云 WAF", + "method": "keyword", + "location": "header", + "keyword": ["CloudWAF"] + }, { + "cms": "epoint政务服务系统", + "method": "keyword", + "location": "body", + "keyword": ["epoint-web-zwdt"] + }, { + "cms": "奥联通讯管理平台", + "method": "faviconhash", + "location": "body", + "keyword": ["-1356973161"] + }, { + "cms": "百傲瑞达", + "method": "faviconhash", + "location": "body", + "keyword": ["-1169502834"] + }, { + "cms": "明源云ERP", + "method": "faviconhash", + "location": "body", + "keyword": ["-626335361"] + }, { + "cms": "天智智慧医院综合质量监管平台", + "method": "faviconhash", + "location": "body", + "keyword": ["1986460035"] + }, { + "cms": "明源云ERP", + "method": "keyword", + "location": "title", + "keyword": ["明源云ERP"] + }, { + "cms": "Minio Browser", + "method": "keyword", + "location": "title", + "keyword": ["Minio Browser"] + }, { + "cms": "管理后台登录", + "method": "keyword", + "location": "title", + "keyword": ["管理员","登录"] + }, { + "cms": "360天擎", + "method": "keyword", + "location": "title", + "keyword": ["360天擎"] + }, { + "cms": "博华网龙信息安全一体机", + "method": "keyword", + "location": "title", + "keyword": ["博华网龙信息安全一体机"] + }, { + "cms": "LNMP一键安装包默认页面", + "method": "keyword", + "location": "title", + "keyword": ["LNMP一键安装包"] + }, { + "cms": "HDWiki", + "method": "keyword", + "location": "header", + "keyword": ["hd_sid="] + }, { + "cms": "深圳锐明行驶记录仪", + "method": "keyword", + "location": "title", + "keyword": ["登录您的MDVR"] + }, { + "cms": "Drupal", + "method": "keyword", + "location": "header", + "keyword": ["drupal"] + }, { + "cms": "Huawei user-login", + "method": "keyword", + "location": "header", + "keyword": ["Huawei Auth-Http"] + }, { + "cms": "Prometheus Server", + "method": "keyword", + "location": "title", + "keyword": ["Prometheus Time Series Collection and Processing Server"] + }, { + "cms": "Kubernetes", + "method": "keyword", + "location": "title", + "keyword": ["Kubernetes Dashboard"] + }, { + "cms": "easypanel", + "method": "keyword", + "location": "body", + "keyword": ["easypanel","vhost","login"] + }, { + "cms": "VMware Horizon", + "method": "keyword", + "location": "body", + "keyword": ["VMware","ui-page","portal/favicon"] + }, { + "cms": "明源云 ERP", + "method": "keyword", + "location": "body", + "keyword": ["PubPlatform","明源云","LoginHandler"] + }, { + "cms": "VMware Horizon", + "method": "keyword", + "location": "title", + "keyword": ["VMware Horizon"] + }, { + "cms": "迪普VPN", + "method": "keyword", + "location": "body", + "keyword": ["dptech_ssl","sslvpn","loginAPI.js"] + }, { + "cms": "OpenShift Web Console", + "method": "keyword", + "location": "title", + "keyword": ["OpenShift Web Console"] + }, { + "cms": "好视通", + "method": "keyword", + "location": "body", + "keyword": ["fsmeeting","loginCheck.do","app.result"] + }, { + "cms": "碧海云盒", + "method": "keyword", + "location": "body", + "keyword": ["碧海云盒","mt_login","login.php"] + }, { + "cms": "PhpWind", + "method": "keyword", + "location": "body", + "keyword": ["content=\"phpwind"] + }, { + "cms": "CmsEasy", + "method": "keyword", + "location": "body", + "keyword": ["content=\"CmsEasy"] + }, { + "cms": "EmpireCMS", + "method": "keyword", + "location": "title", + "keyword": ["Powered by EmpireCMS"] + }, { + "cms": "Emlog", + "method": "keyword", + "location": "body", + "keyword": ["content=\"emlog\""] + }, { + "cms": "ECShop", + "method": "keyword", + "location": "body", + "keyword": ["content=\"ECSHOP"] + }, { + "cms": "大汉版通-Hanweb-system", + "method": "keyword", + "location": "body", + "keyword": ["大汉版通","大汉网络","hanweb.com' style='display:none'"] + }, { + "cms": "ESPCMS", + "method": "keyword", + "location": "title", + "keyword": ["powered by espcms"] + }, { + "cms": "KesionCMS", + "method": "keyword", + "location": "body", + "keyword": ["ks_inc/common.js","KesionCMS"] + }, { + "cms": "东营金石软件", + "method": "keyword", + "location": "body", + "keyword": ["aspNetHidden","loginselect","txtLoginName"] + }, { + "cms": "皓峰防火墙", + "method": "keyword", + "location": "title", + "keyword": ["皓峰防火墙系统登录"] + }, { + "cms": "CMSTop", + "method": "keyword", + "location": "body", + "keyword": ["css/cmstop-common.css","js/cmstop-common.js"] + }, { + "cms": "华域Reporter", + "method": "keyword", + "location": "body", + "keyword": ["reporter","login","action.php"] + }, { + "cms": "智邦国际-企业管理软件", + "method": "keyword", + "location": "body", + "keyword": ["index2.asp","update/exec.asp","images/full.gif"] + }, { + "cms": "电信网关配置管理系统", + "method": "keyword", + "location": "body", + "keyword": ["<TITLE>系统登录","login.php","img/login_bg3.png","360.cn"] + }, { + "cms": "方配在线考试系统(FPExam)", + "method": "keyword", + "location": "body", + "keyword": ["exam/logo/favicon.ico","fangpage"] + }, { + "cms": "Spring Eureka", + "method": "keyword", + "location": "body", + "keyword": ["<title>Eureka","eureka"] + }, { + "cms": "迪普 SSLVPN", + "method": "keyword", + "location": "body", + "keyword": ["DPSSLVPN","SSL VPN Service","login"] + }, { + "cms": "Grafana", + "method": "keyword", + "location": "body", + "keyword": ["Grafana"] + }, { + "cms": "百卓byzoro-安全网关", + "method": "keyword", + "location": "body", + "keyword": ["北京百卓","PatrolFlow","login.php"] + }, { + "cms": "ENESYS", + "method": "keyword", + "location": "body", + "keyword": ["dwr/interface/WebContextUtil.js"] + }, { + "cms": "KVM_创梦云计算管理系统", + "method": "keyword", + "location": "body", + "keyword": ["KVM_创梦云计算管理系统"] + }, { + "cms": "任我行-管家婆分销ERP", + "method": "keyword", + "location": "body", + "keyword": ["分销ERP","txt_DbName","DownloadDriver.asp"] + }, { + "cms": "小黄豆CRM", + "method": "keyword", + "location": "body", + "keyword": ["xhdcrm","JS/XHD.js","login.check.xhd"] + }, { + "cms": "Nnetgear 路由器", + "method": "keyword", + "location": "header", + "keyword": ["NETGEAR"] + }, { + "cms": "Metabase", + "method": "keyword", + "location": "title", + "keyword": ["Metabase"] + }, { + "cms": "4images", + "method": "keyword", + "location": "body", + "keyword": ["Powered by 4images","4homepages"] + }, { + "cms": "Finecms", + "method": "keyword", + "location": "body", + "keyword": ["content=\"FineCMS"] + }, { + "cms": "NUUO 摄像头", + "method": "keyword", + "location": "title", + "keyword": ["Network Video Recorder Login"] + }, { + "cms": "Apache ShenYu", + "method": "keyword", + "location": "body", + "keyword": ["id=\"httpPath","th:text=\"${domain}"] + }, { + "cms": "Solar 网络管理系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-1871496583"] + }, { + "cms": "畅捷CRM", + "method": "faviconhash", + "location": "body", + "keyword": ["-1068428644"] + }, { + "cms": "悟空CRM", + "method": "faviconhash", + "location": "body", + "keyword": ["872805507"] + }, { + "cms": "用友GRP-U8 新政府会计制度专版", + "method": "faviconhash", + "location": "body", + "keyword": ["-299520369"] + }, { + "cms": "e-cology 运维管理平台", + "method": "faviconhash", + "location": "body", + "keyword": ["-384583337"] + }, { + "cms": "瑞友天翼-应用虚拟化系统", + "method": "keyword", + "location": "body", + "keyword": ["DownLoad.XGI","realor.cn","dvLogin"] + }, { + "cms": "H3C SecPath 运维审计系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1776863739"] + }, { + "cms": "信呼 OA", + "method": "faviconhash", + "location": "body", + "keyword": ["1652488516"] + }, { + "cms": "MeterSphere", + "method": "faviconhash", + "location": "body", + "keyword": ["1023469568"] + }, { + "cms": "H2 Database Console", + "method": "faviconhash", + "location": "body", + "keyword": ["-525659379"] + }, { + "cms": "天融信设备", + "method": "faviconhash", + "location": "body", + "keyword": ["-2019013898"] + }, { + "cms": "慧林ICP/iP备案系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-556918553"] + }, { + "cms": "飞鱼星路由器/行为管理", + "method": "keyword", + "location": "body", + "keyword": ["content=\"0.2;","/home/login.html"] + }, { + "cms": "化视私云CDN直播加速服务器", + "method": "keyword", + "location": "body", + "keyword": ["img/dl.gif","华视美达","login.php"] + }, { + "cms": "冰峰网络 iceflow", + "method": "keyword", + "location": "body", + "keyword": ["Web 配置中心","/images/splash.jpg"] + }, { + "cms": "华夏 ERP", + "method": "keyword", + "location": "body", + "keyword": ["jshERP-boot","platformConfig"] + }, { + "cms": "78 OA", + "method": "keyword", + "location": "body", + "keyword": ["/resource/javascript/system/runtime.min.js","password"] + }, { + "cms": "EnterCRM", + "method": "keyword", + "location": "body", + "keyword": ["杭州恩软","Ent.base.js"] + }, { + "cms": "ITC-CMS", + "method": "keyword", + "location": "body", + "keyword": ["/mt_res_v3/js/common/common.js","CMS"] + }, { + "cms": "Panabit-Panalog", + "method": "keyword", + "location": "body", + "keyword": ["img/logo.gif","Maintain","unamexx","img/12.png"] + }, { + "cms": "用友-畅捷通OEM", + "method": "keyword", + "location": "body", + "keyword": ["GNRemote.dll","Web_sc/login.gn"] + }, { + "cms": "华为AR Web管理平台", + "method": "keyword", + "location": "body", + "keyword": ["Huawei","simple/style/default/image/login.png","simple/view/ossn.html"] + }, { + "cms": "铭飞 MCMS", + "method": "keyword", + "location": "body", + "keyword": ["ms.js","ms.http.js","plugins"] + }, { + "cms": "向日葵-SunLogin", + "method": "keyword", + "location": "body", + "keyword": ["{\"success\":false,\"msg\":\"Verification failure\"}"] + }, { + "cms": "GROWATT 系统", + "method": "keyword", + "location": "body", + "keyword": ["login","v3/js/odm/odm.js"] + }, { + "cms": "锐捷防火墙", + "method": "keyword", + "location": "body", + "keyword": ["下一代防火墙","锐捷网络"] + }, { + "cms": "天融信应用交付系统", + "method": "keyword", + "location": "body", + "keyword": ["TopApp-AD"] + }, { + "cms": "慧林信息安全管理系统", + "method": "keyword", + "location": "body", + "keyword": ["用户管理登录","login","images/zh-CN/login_03.gif"] + }, { + "cms": "华为云桌面", + "method": "keyword", + "location": "body", + "keyword": ["Desktop@FusionAccess","/webui/"] + }, { + "cms": "齐治堡垒机", + "method": "keyword", + "location": "body", + "keyword": ["fp_download","login.php","logo-icon-ico72.png"] + }, { + "cms": "TurboMail 邮件系统", + "method": "keyword", + "location": "body", + "keyword": ["TurboMail","mailmain?type=login"] + }, { + "cms": "安恒数据大脑API网关", + "method": "keyword", + "location": "body", + "keyword": ["mssp-fe","/static/imgs/logo.png"] + }, { + "cms": "山石网科云数据库审计与防护系统", + "method": "keyword", + "location": "body", + "keyword": ["#!/dbSummary","/lib/colResizable/"] + }, { + "cms": "青年软件OA", + "method": "keyword", + "location": "body", + "keyword": ["/Content/qrlib/ligerUI/skins/"] + }, { + "cms": "金山终端安全管理系统", + "method": "keyword", + "location": "body", + "keyword": ["iepngfix/iepngfix_tilebg.js","mysqlStat"] + }, { + "cms": "多媒体信息发布系统", + "method": "keyword", + "location": "header", + "keyword": ["HowFor Web"] + }, { + "cms": "亿赛通(DLP)", + "method": "keyword", + "location": "body", + "keyword": ["CDGServer3","welcomebg.jpg"] + }, { + "cms": "百卓 Smart 多业务安全网关", + "method": "keyword", + "location": "body", + "keyword": ["writeCustomBgImg.jsp","baseajax","LoginLogo"] + }, { + "cms": "中远麒麟堡垒机", + "method": "keyword", + "location": "body", + "keyword": ["admin.php","controller=admin_index&action=login"] + }, { + "cms": "移动云&绿盟日志审计系统-log4j", + "method": "keyword", + "location": "body", + "keyword": ["/pisces/login/"] + }, { + "cms": "Apache APISIX", + "method": "keyword", + "location": "body", + "keyword": ["{\"error_msg\":\"404 Route Not Found\"}"] + }, { + "cms": "网康科技·互联网控制网关", + "method": "keyword", + "location": "title", + "keyword": ["网康科技·互联网控制网关"] + }, { + "cms": "飞思网巡 IT运维系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1622043013"] + }, { + "cms": "Richmail 邮件系统", + "method": "keyword", + "location": "title", + "keyword": ["RichMail"] + }, { + "cms": "Richmail 邮件系统", + "method": "keyword", + "location": "body", + "keyword": ["0;url=/webmail/"] + }, { + "cms": "Richmail 邮件系统", + "method": "keyword", + "location": "body", + "keyword": ["richmail.config.js","login"] + }, { + "cms": "字节数联云桌面系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-1142582922"] + }, { + "cms": "智跃HR人力资源管理系统", + "method": "keyword", + "location": "body", + "keyword": ["images/ZY.LOGO.64.png"] + }, { + "cms": "启迪国信 UEM管理平台", + "method": "keyword", + "location": "body", + "keyword": ["#commonTip","css/icomoon","login","wwLogin"] + }, { + "cms": "金万维异速联", + "method": "keyword", + "location": "body", + "keyword": ["GNRemote.dll?GNFunction="] + }, { + "cms": "JieLink+智能终端操作平台", + "method": "keyword", + "location": "body", + "keyword": ["JieLink<sup>+</sup>"] + }, { + "cms": "宏景eHR人力资源信息管理系统", + "method": "keyword", + "location": "body", + "keyword": ["人力资源信息管理系统","hrlogon"] + }, { + "cms": "禾匠点企来客服系统", + "method": "keyword", + "location": "body", + "keyword": ["const _scriptUrl","login_logo"] + }, { + "cms": "iXCache", + "method": "keyword", + "location": "body", + "keyword": ["iXCache","/login/userverify.cgi"] + }, { + "cms": "爱信诺开票服务器", + "method": "keyword", + "location": "body", + "keyword": ["aisino.kps.console"] + }, { + "cms": "税控服务器管理系统", + "method": "keyword", + "location": "body", + "keyword": ["sys/login.do","resources/css/login_yzm.css"] + }, { + "cms": "天擎", + "method": "keyword", + "location": "body", + "keyword": ["index/logo","天擎"] + }, { + "cms": "小鱼易连云视讯管理平台", + "method": "keyword", + "location": "body", + "keyword": ["font_1957344_lqkodjqdbl.css"] + }, { + "cms": "小鱼易连云视讯管理平台", + "method": "keyword", + "location": "body", + "keyword": ["static_source/localcdn/webrtc/web/favicon.ico"] + }, { + "cms": "厦门快普", + "method": "keyword", + "location": "body", + "keyword": ["jKPM6","WebResource.axd"] + }, { + "cms": "iDste融合系统支撑平台", + "method": "keyword", + "location": "title", + "keyword": ["iDste融合系统支撑平台"] + }, { + "cms": "大华安防 DSS", + "method": "keyword", + "location": "body", + "keyword": ["User",""] + }, { + "cms": "NSFOCUS 绿盟安全设备", + "method": "keyword", + "location": "header", + "keyword": ["NSFOCUS"] + }, { + "cms": "迪浪云OA", + "method": "faviconhash", + "location": "body", + "keyword": ["-179985729"] + }, { + "cms": "Nexus Repository Manager", + "method": "faviconhash", + "location": "body", + "keyword": ["1323738809"] + }, { + "cms": "金睛云华高级威胁检测系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1747722638"] + }, { + "cms": "VMware Workspace ONE Access", + "method": "faviconhash", + "location": "body", + "keyword": ["-1250474341"] + }, { + "cms": "网防G01", + "method": "faviconhash", + "location": "body", + "keyword": ["-968234332"] + }, { + "cms": "Gitblit", + "method": "keyword", + "location": "body", + "keyword": ["gitblt-favicon.png","gitblit"] + }, { + "cms": "H3C ER8300G2-X", + "method": "keyword", + "location": "body", + "keyword": ["H3C","vld.bmp","dis_login","ER8300G2"] + }, { + "cms": "锐捷交换机-睿易", + "method": "keyword", + "location": "body", + "keyword": ["cgi-bin/luci","#f47f3e"] + }, { + "cms": "H3C/安博通/任子行/OEM系列安全产品", + "method": "keyword", + "location": "body", + "keyword": ["webui/js/jquerylib/jquery-1.7.2.min.js"] + }, { + "cms": "明源云 ERP", + "method": "keyword", + "location": "body", + "keyword": ["#153290","明源软件"] + }, { + "cms": "IP-guard", + "method": "keyword", + "location": "body", + "keyword": ["IP-guard","sign/login"] + }, { + "cms": "宁盾一体化安全认证平台", + "method": "keyword", + "location": "body", + "keyword": ["am/ndkey.ico","zhLanguagePng"] + }, { + "cms": "东华医疗协同办公系统", + "method": "keyword", + "location": "body", + "keyword": ["extcomponent/security/login.jsp","login_dhc"] + }, { + "cms": "安宁电子邮件系统 AnyMacro Mail", + "method": "keyword", + "location": "body", + "keyword": ["anymacro","passre.php"] + }, { + "cms": "海康威视综合安防平台", + "method": "keyword", + "location": "body", + "keyword": ["dist/jquery.js","home/locationIndex.action"] + }, { + "cms": "海纳CMS-HituxCMS", + "method": "keyword", + "location": "body", + "keyword": ["Powered By HituxCMS","ServiceCenter.js"] + }, { + "cms": "酒店智慧营销IPTV系统", + "method": "keyword", + "location": "body", + "keyword": ["xsiptvp","IPTV"] + }, { + "cms": "朗驰欣创-视频监控", + "method": "keyword", + "location": "body", + "keyword": ["Installplug.exe","NVSID"] + }, { + "cms": "大华-智能物联综合管理平台", + "method": "keyword", + "location": "body", + "keyword": ["static/qwebchannel.js","moment"] + }, { + "cms": "方正翔宇", + "method": "keyword", + "location": "body", + "keyword": ["e5style/login1.css","e5workspace/security/captcha.do"] + }, { + "cms": "金蝶 EAS", + "method": "keyword", + "location": "body", + "keyword": ["eassso","portalClientHelper.jsp"] + }, { + "cms": "极通 EWEBS 应用虚拟化", + "method": "keyword", + "location": "body", + "keyword": ["NewSoft","xajax05/xajax_js/xajax_core.js"] + }, { + "cms": "时空智友", + "method": "keyword", + "location": "body", + "keyword": ["login.jsp?login","登录"] + }, { + "cms": "康通电子云广播系统", + "method": "keyword", + "location": "body", + "keyword": ["static/download/JSET99Setup.exe"] + }, { + "cms": "xxl-job", + "method": "keyword", + "location": "body", + "keyword": ["/static/adminlte/dist/css/AdminLTE.min.css","bower_components/PACE/pace.min.js"] + }, { + "cms": "海康综合安防管理平台", + "method": "keyword", + "location": "title", + "keyword": ["综合安防管理平台"] + }, { + "cms": "53BK数字报刊系统", + "method": "keyword", + "location": "body", + "keyword": ["/Comja/"] + }, { + "cms": "慧点科技 OA 协同办公系统", + "method": "keyword", + "location": "body", + "keyword": ["/dojo/smartdot/css/dojo_smartdot.css"] + }, { + "cms": "Teleport 堡垒机", + "method": "keyword", + "location": "body", + "keyword": ["teleport.js","login-type-oath","bind-oath"] + }, { + "cms": "V2 Conference 视频会议系统", + "method": "keyword", + "location": "body", + "keyword": ["window.location.href=\"/Conf/index.jsp\""] + }, { + "cms": "和欣控制(Hysine) Webtalk 系统", + "method": "keyword", + "location": "body", + "keyword": ["_webtalk/_cur/loginA.php","WEBTALK"] + }, { + "cms": "Analytics Cloud 分析云", + "method": "faviconhash", + "location": "body", + "keyword": ["410106848"] + }, { + "cms": "明源云MIP集成平台", + "method": "faviconhash", + "location": "body", + "keyword": ["-834208471"] + }, { + "cms": "MapGIS Server Manager", + "method": "faviconhash", + "location": "body", + "keyword": ["-252149748"] + }, { + "cms": "金钟集团智能物流管理系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-364449966"] + }, { + "cms": "海康威视综合安防管理平台", + "method": "faviconhash", + "location": "body", + "keyword": ["-808437027"] + }, { + "cms": "即会通企业版(LiveUC)|视频会议", + "method": "faviconhash", + "location": "body", + "keyword": ["-637931821"] + }, { + "cms": "泛微emp-移动管理平台", + "method": "faviconhash", + "location": "body", + "keyword": ["2062026853"] + }, { + "cms": "锐捷 SSL VPN", + "method": "faviconhash", + "location": "body", + "keyword": ["-1525950034"] + }, { + "cms": "华测监测预警系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-628229493"] + }, { + "cms": "35企业邮箱系统", + "method": "faviconhash", + "location": "body", + "keyword": ["1676919780"] + }, { + "cms": "指挥调度平台", + "method": "faviconhash", + "location": "body", + "keyword": ["-1971504131"] + }, { + "cms": "FE业务协作平台", + "method": "faviconhash", + "location": "body", + "keyword": ["-391577146"] + }, { + "cms": "Elib 图书馆集群管理系统", + "method": "faviconhash", + "location": "body", + "keyword": ["478149598"] + }, { + "cms": "VMware Horizon", + "method": "faviconhash", + "location": "body", + "keyword": ["1182206475"] + }, { + "cms": "银达汇智智慧综合管理平台", + "method": "faviconhash", + "location": "body", + "keyword": ["1170487960"] + }, { + "cms": "迈普多业务融合网关", + "method": "faviconhash", + "location": "body", + "keyword": ["-1234665500"] + }, { + "cms": "奇安信自动化渗透测试系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-747580443"] + }, { + "cms": "红海eHR人力资源管理系统", + "method": "faviconhash", + "location": "body", + "keyword": ["-1015496453"] + }, { + "cms": "MobileIron --Log4j", + "method": "keyword", + "location": "title", + "keyword": ["MobileIron User Portal: Sign In"] + }] +} \ No newline at end of file diff --git a/docker/scripts/init-data.sh b/docker/scripts/init-data.sh index 2e712a4b..e0b03d1f 100755 --- a/docker/scripts/init-data.sh +++ b/docker/scripts/init-data.sh @@ -111,6 +111,13 @@ init_wordlists() { log_info "字典初始化完成" } +# 初始化指纹库 +init_fingerprints() { + log_step "初始化指纹库..." + docker compose exec -T server python backend/manage.py init_fingerprints + log_info "指纹库初始化完成" +} + # 初始化 Nuclei 模板仓库 init_nuclei_templates() { log_step "初始化 Nuclei 模板仓库..." @@ -157,6 +164,7 @@ main() { init_engine_config init_wordlists + init_fingerprints init_nuclei_templates init_admin_user diff --git a/docker/server/start.sh b/docker/server/start.sh index acefd681..90f25350 100644 --- a/docker/server/start.sh +++ b/docker/server/start.sh @@ -21,6 +21,10 @@ echo " [1.3/3] 初始化默认目录字典..." python manage.py init_wordlists echo " ✓ 默认目录字典已就绪" +echo " [1.4/3] 初始化默认指纹库..." +python manage.py init_fingerprints +echo " ✓ 默认指纹库已就绪" + # 2. 启动 Django uvicorn 服务 (ASGI) # 定时任务由内置 APScheduler 处理,在 Django 启动时自动启动 echo " [2/3] 启动 Django uvicorn (ASGI)..." diff --git a/frontend/app/tools/fingerprints/ehole/page.tsx b/frontend/app/tools/fingerprints/ehole/page.tsx new file mode 100644 index 00000000..57de45ff --- /dev/null +++ b/frontend/app/tools/fingerprints/ehole/page.tsx @@ -0,0 +1,12 @@ +"use client" + +import React from "react" +import { EholeFingerprintView } from "@/components/fingerprints" + +export default function EholeFingerprintPage() { + return ( +
+ +
+ ) +} diff --git a/frontend/app/tools/fingerprints/layout.tsx b/frontend/app/tools/fingerprints/layout.tsx new file mode 100644 index 00000000..29c12fa4 --- /dev/null +++ b/frontend/app/tools/fingerprints/layout.tsx @@ -0,0 +1,118 @@ +"use client" + +import React from "react" +import { usePathname } from "next/navigation" +import Link from "next/link" +import { Fingerprint } from "lucide-react" +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" +import { Badge } from "@/components/ui/badge" +import { Skeleton } from "@/components/ui/skeleton" +import { useFingerprintStats } from "@/hooks/use-fingerprints" + +/** + * 指纹管理布局 + * 提供 Tab 导航切换不同指纹库 + */ +export default function FingerprintsLayout({ + children, +}: { + children: React.ReactNode +}) { + const pathname = usePathname() + const { data: stats, isLoading } = useFingerprintStats() + + // 获取当前激活的 Tab + const getActiveTab = () => { + if (pathname.includes("/ehole")) return "ehole" + if (pathname.includes("/goby")) return "goby" + if (pathname.includes("/wappalyzer")) return "wappalyzer" + return "ehole" + } + + // Tab 路径映射 + const basePath = "/tools/fingerprints" + const tabPaths = { + ehole: `${basePath}/ehole/`, + goby: `${basePath}/goby/`, + wappalyzer: `${basePath}/wappalyzer/`, + } + + // 各指纹库数量 + const counts = { + ehole: stats?.ehole || 0, + goby: stats?.goby || 0, + wappalyzer: stats?.wappalyzer || 0, + } + + if (isLoading) { + return ( +
+
+
+ + +
+
+
+ +
+
+ ) + } + + return ( +
+ {/* 页面头部 */} +
+
+

+ + 指纹管理 +

+

Web 指纹识别规则管理

+
+
+ + {/* Tabs 导航 */} +
+ + + + + EHole + {counts.ehole > 0 && ( + + {counts.ehole} + + )} + + + + + Goby + {counts.goby > 0 && ( + + {counts.goby} + + )} + + + + + Wappalyzer + {counts.wappalyzer > 0 && ( + + {counts.wappalyzer} + + )} + + + + +
+ + {/* 子页面内容 */} + {children} +
+ ) +} diff --git a/frontend/app/tools/fingerprints/page.tsx b/frontend/app/tools/fingerprints/page.tsx new file mode 100644 index 00000000..ad20cd11 --- /dev/null +++ b/frontend/app/tools/fingerprints/page.tsx @@ -0,0 +1,10 @@ +"use client" + +import { redirect } from "next/navigation" + +/** + * 指纹管理首页 - 重定向到 EHole + */ +export default function FingerprintsPage() { + redirect("/tools/fingerprints/ehole/") +} diff --git a/frontend/components/app-sidebar.tsx b/frontend/components/app-sidebar.tsx index ad266f51..e0030e31 100644 --- a/frontend/components/app-sidebar.tsx +++ b/frontend/components/app-sidebar.tsx @@ -108,10 +108,15 @@ const data = { title: "字典管理", // 字典管理 url: "/tools/wordlists/", }, + { + title: "指纹管理", // 指纹管理 + url: "/tools/fingerprints/", + }, { title: "Nuclei 模板", // Nuclei 模板 url: "/tools/nuclei/", }, + ], }, // 测试中心相关菜单已移除 diff --git a/frontend/components/fingerprints/ehole-fingerprint-columns.tsx b/frontend/components/fingerprints/ehole-fingerprint-columns.tsx new file mode 100644 index 00000000..8e8a0cdb --- /dev/null +++ b/frontend/components/fingerprints/ehole-fingerprint-columns.tsx @@ -0,0 +1,135 @@ +"use client" + +import { ColumnDef } from "@tanstack/react-table" +import { Checkbox } from "@/components/ui/checkbox" +import { Badge } from "@/components/ui/badge" +import type { EholeFingerprint } from "@/types/fingerprint.types" + +interface ColumnOptions { + formatDate: (date: string) => string +} + +/** + * 创建 EHole 指纹表格列定义 + */ +export function createEholeFingerprintColumns({ + formatDate, +}: ColumnOptions): ColumnDef[] { + return [ + // 选择列 + { + id: "select", + header: ({ table }) => ( + table.toggleAllPageRowsSelected(!!value)} + aria-label="Select all" + /> + ), + cell: ({ row }) => ( + row.toggleSelected(!!value)} + aria-label="Select row" + /> + ), + enableSorting: false, + enableHiding: false, + size: 40, + }, + // CMS 名称 + { + accessorKey: "cms", + header: "CMS", + cell: ({ row }) => ( +
{row.getValue("cms")}
+ ), + size: 200, + }, + // 匹配方式 + { + accessorKey: "method", + header: "Method", + cell: ({ row }) => { + const method = row.getValue("method") as string + return ( + + {method} + + ) + }, + size: 100, + }, + // 匹配位置 + { + accessorKey: "location", + header: "Location", + cell: ({ row }) => { + const location = row.getValue("location") as string + return ( + + {location} + + ) + }, + size: 100, + }, + // 关键词 + { + accessorKey: "keyword", + header: "Keyword", + cell: ({ row }) => { + const keywords = row.getValue("keyword") as string[] + if (!keywords || keywords.length === 0) return "-" + return ( +
+ {keywords.map((kw, idx) => ( +
{kw}
+ ))} +
+ ) + }, + size: 300, + }, + // 类型 + { + accessorKey: "type", + header: "Type", + cell: ({ row }) => { + const type = row.getValue("type") as string + if (!type || type === "-") return "-" + return {type} + }, + size: 100, + }, + // 重点资产 + { + accessorKey: "isImportant", + header: "Important", + cell: ({ row }) => { + const isImportant = row.getValue("isImportant") as boolean + return isImportant ? ( + 重点 + ) : null + }, + size: 80, + }, + // 创建时间 + { + accessorKey: "createdAt", + header: "Created", + cell: ({ row }) => { + const date = row.getValue("createdAt") as string + return ( +
+ {formatDate(date)} +
+ ) + }, + size: 160, + }, + ] +} diff --git a/frontend/components/fingerprints/ehole-fingerprint-data-table.tsx b/frontend/components/fingerprints/ehole-fingerprint-data-table.tsx new file mode 100644 index 00000000..f356f82c --- /dev/null +++ b/frontend/components/fingerprints/ehole-fingerprint-data-table.tsx @@ -0,0 +1,490 @@ +"use client" + +import * as React from "react" +import { + ColumnDef, + ColumnFiltersState, + ColumnSizingState, + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + SortingState, + useReactTable, + VisibilityState, +} from "@tanstack/react-table" +import { + IconChevronDown, + IconChevronLeft, + IconChevronRight, + IconChevronsLeft, + IconChevronsRight, + IconLayoutColumns, + IconTrash, + IconDownload, + IconUpload, + IconPlus, + IconSettings, +} from "@tabler/icons-react" + +import { Button } from "@/components/ui/button" +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" +import { Label } from "@/components/ui/label" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/components/ui/alert-dialog" +import { SmartFilterInput, type FilterField } from "@/components/common/smart-filter-input" + +import type { EholeFingerprint } from "@/types/fingerprint.types" +import type { PaginationInfo } from "@/types/common.types" + +// EHole 过滤字段配置 +const EHOLE_FILTER_FIELDS: FilterField[] = [ + { key: "cms", label: "CMS", description: "产品/CMS名称" }, + { key: "method", label: "Method", description: "匹配方式 (keyword, faviconhash...)" }, + { key: "location", label: "Location", description: "匹配位置 (body, header, title)" }, + { key: "type", label: "Type", description: "分类" }, +] + +const EHOLE_FILTER_EXAMPLES = [ + 'cms="WordPress"', + 'type=="CMS"', + 'method="keyword" location="body"', + 'type="Server" || type="CMS"', +] + +interface EholeFingerprintDataTableProps { + data: EholeFingerprint[] + columns: ColumnDef[] + onSelectionChange?: (selectedRows: EholeFingerprint[]) => void + filterValue?: string + onFilterChange?: (value: string) => void + isSearching?: boolean + onAddSingle?: () => void + onAddImport?: () => void + onExport?: () => void + onBulkDelete?: () => void + onDeleteAll?: () => void + totalCount?: number // 用于显示总数 + pagination?: { pageIndex: number; pageSize: number } + setPagination?: React.Dispatch> + paginationInfo?: PaginationInfo + onPaginationChange?: (pagination: { pageIndex: number; pageSize: number }) => void +} + +export function EholeFingerprintDataTable({ + data = [], + columns, + onSelectionChange, + filterValue, + onFilterChange, + isSearching = false, + onAddSingle, + onAddImport, + onExport, + onBulkDelete, + onDeleteAll, + totalCount = 0, + pagination: externalPagination, + setPagination: setExternalPagination, + paginationInfo, + onPaginationChange, +}: EholeFingerprintDataTableProps) { + const [rowSelection, setRowSelection] = React.useState>({}) + const [columnVisibility, setColumnVisibility] = React.useState({}) + const [columnFilters, setColumnFilters] = React.useState([]) + const [sorting, setSorting] = React.useState([]) + const [columnSizing, setColumnSizing] = React.useState({}) + + // 确认对话框状态 + const [exportDialogOpen, setExportDialogOpen] = React.useState(false) + const [bulkDeleteDialogOpen, setBulkDeleteDialogOpen] = React.useState(false) + const [deleteAllDialogOpen, setDeleteAllDialogOpen] = React.useState(false) + + const [internalPagination, setInternalPagination] = React.useState({ + pageIndex: 0, + pageSize: 10, + }) + + const pagination = externalPagination || internalPagination + const setPagination = setExternalPagination || setInternalPagination + + const handleSmartSearch = (_filters: any[], rawQuery: string) => { + if (onFilterChange) { + onFilterChange(rawQuery) + } + } + + const validData = React.useMemo(() => { + return (data || []).filter(item => item && typeof item.id !== 'undefined') + }, [data]) + + const table = useReactTable({ + data: validData, + columns, + state: { + sorting, + columnVisibility, + rowSelection, + columnFilters, + pagination, + columnSizing, + }, + enableColumnResizing: true, + columnResizeMode: 'onChange', + onColumnSizingChange: setColumnSizing, + pageCount: paginationInfo?.totalPages ?? -1, + manualPagination: !!paginationInfo, + getRowId: (row) => row.id.toString(), + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onColumnVisibilityChange: setColumnVisibility, + onPaginationChange: (updater) => { + const newPagination = typeof updater === 'function' ? updater(pagination) : updater + setPagination(newPagination) + if (onPaginationChange) { + onPaginationChange(newPagination) + } + }, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + }) + + React.useEffect(() => { + if (onSelectionChange) { + const selectedRows = table.getFilteredSelectedRowModel().rows.map(row => row.original) + onSelectionChange(selectedRows) + } + }, [rowSelection, onSelectionChange, table]) + + return ( +
+ {/* 工具栏 */} +
+ + +
+ {/* 列显示控制 */} + + + + + + {table + .getAllColumns() + .filter((column) => typeof column.accessorFn !== "undefined" && column.getCanHide()) + .map((column) => ( + column.toggleVisibility(!!value)} + > + {column.id} + + ))} + + + + {/* 操作菜单 */} + + + + + + {onExport && ( + setExportDialogOpen(true)}> + + 导出所有指纹 + + )} + + {onBulkDelete && ( + setBulkDeleteDialogOpen(true)} + disabled={table.getFilteredSelectedRowModel().rows.length === 0} + className="text-destructive focus:text-destructive" + > + + 删除选中 ({table.getFilteredSelectedRowModel().rows.length}) + + )} + {onDeleteAll && ( + setDeleteAllDialogOpen(true)} + className="text-destructive focus:text-destructive" + > + + 删除所有 + + )} + + + + {/* 添加指纹 */} + {(onAddSingle || onAddImport) && ( + + + + + + {onAddSingle && ( + + + 单条添加 + + )} + {onAddImport && ( + + + 文件导入 + + )} + + + )} +
+
+ + {/* 表格 */} +
+ + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {header.isPlaceholder + ? null + : flexRender(header.column.columnDef.header, header.getContext())} + {header.column.getCanResize() && ( +
header.column.resetSize()} + className="absolute -right-2.5 top-0 h-full w-8 cursor-col-resize select-none touch-none bg-transparent flex justify-center" + > +
+
+ )} + + ))} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + )) + ) : ( + + + No results + + + )} + +
+
+ + {/* 分页 */} +
+
+ {table.getFilteredSelectedRowModel().rows.length} of{" "} + {paginationInfo ? paginationInfo.total : table.getFilteredRowModel().rows.length} row(s) selected +
+ +
+
+ + +
+ +
+ Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()} +
+ +
+ + + + +
+
+
+ + {/* 导出确认对话框 */} + + + + 导出所有指纹 + + 将导出所有 {totalCount} 条 EHole 指纹数据为 JSON 文件。 + + + + 取消 + { onExport?.(); setExportDialogOpen(false); }}> + 确认导出 + + + + + + {/* 删除选中确认对话框 */} + + + + 删除选中指纹 + + 确定要删除选中的 {table.getFilteredSelectedRowModel().rows.length} 条指纹吗?此操作不可撤销。 + + + + 取消 + { onBulkDelete?.(); setBulkDeleteDialogOpen(false); }} + className="bg-destructive text-destructive-foreground hover:bg-destructive/90" + > + 确认删除 + + + + + + {/* 删除所有确认对话框 */} + + + + 删除所有指纹 + + 确定要删除所有 {totalCount} 条 EHole 指纹吗?此操作不可撤销。 + + + + 取消 + { onDeleteAll?.(); setDeleteAllDialogOpen(false); }} + className="bg-destructive text-destructive-foreground hover:bg-destructive/90" + > + 确认删除 + + + + +
+ ) +} diff --git a/frontend/components/fingerprints/ehole-fingerprint-dialog.tsx b/frontend/components/fingerprints/ehole-fingerprint-dialog.tsx new file mode 100644 index 00000000..4506827f --- /dev/null +++ b/frontend/components/fingerprints/ehole-fingerprint-dialog.tsx @@ -0,0 +1,261 @@ +"use client" + +import React, { useEffect } from "react" +import { useForm } from "react-hook-form" +import { toast } from "sonner" +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Checkbox } from "@/components/ui/checkbox" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { + useCreateEholeFingerprint, + useUpdateEholeFingerprint, +} from "@/hooks/use-fingerprints" +import type { EholeFingerprint } from "@/types/fingerprint.types" + +interface EholeFingerprintDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + fingerprint?: EholeFingerprint | null // 编辑时传入 + onSuccess?: () => void +} + +interface FormData { + cms: string + method: string + location: string + keyword: string // 逗号分隔的字符串 + type: string + isImportant: boolean +} + +const METHOD_OPTIONS = [ + { value: "keyword", label: "keyword" }, + { value: "faviconhash", label: "faviconhash" }, + { value: "icon_hash", label: "icon_hash" }, + { value: "header", label: "header" }, +] + +const LOCATION_OPTIONS = [ + { value: "body", label: "body" }, + { value: "header", label: "header" }, + { value: "title", label: "title" }, +] + +export function EholeFingerprintDialog({ + open, + onOpenChange, + fingerprint, + onSuccess, +}: EholeFingerprintDialogProps) { + const isEdit = !!fingerprint + + const createMutation = useCreateEholeFingerprint() + const updateMutation = useUpdateEholeFingerprint() + + const { + register, + handleSubmit, + reset, + setValue, + watch, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues: { + cms: "", + method: "keyword", + location: "body", + keyword: "", + type: "-", + isImportant: false, + }, + }) + + // 编辑时填充表单 + useEffect(() => { + if (fingerprint) { + reset({ + cms: fingerprint.cms, + method: fingerprint.method, + location: fingerprint.location, + keyword: fingerprint.keyword.join(", "), + type: fingerprint.type || "-", + isImportant: fingerprint.isImportant, + }) + } else { + reset({ + cms: "", + method: "keyword", + location: "body", + keyword: "", + type: "-", + isImportant: false, + }) + } + }, [fingerprint, reset]) + + const onSubmit = async (data: FormData) => { + // 解析 keyword 字符串为数组 + const keywordArray = data.keyword + .split(",") + .map((k) => k.trim()) + .filter((k) => k.length > 0) + + if (keywordArray.length === 0) { + toast.error("关键词不能为空") + return + } + + const payload = { + cms: data.cms.trim(), + method: data.method, + location: data.location, + keyword: keywordArray, + type: data.type || "-", + isImportant: data.isImportant, + } + + try { + if (isEdit && fingerprint) { + await updateMutation.mutateAsync({ id: fingerprint.id, data: payload }) + toast.success("更新成功") + } else { + await createMutation.mutateAsync(payload) + toast.success("创建成功") + } + onOpenChange(false) + onSuccess?.() + } catch (error: any) { + toast.error(error.message || (isEdit ? "更新失败" : "创建失败")) + } + } + + const method = watch("method") + const location = watch("location") + const isImportant = watch("isImportant") + + return ( + + + + {isEdit ? "编辑指纹" : "添加指纹"} + + {isEdit ? "修改 EHole 指纹规则" : "添加新的 EHole 指纹规则"} + + + +
+ {/* CMS 名称 */} +
+ + + {errors.cms && ( +

{errors.cms.message}

+ )} +
+ + {/* 匹配方式 & 匹配位置 */} +
+
+ + +
+ +
+ + +
+
+ + {/* 关键词 */} +
+ + + {errors.keyword && ( +

{errors.keyword.message}

+ )} +

+ 多个关键词用逗号分隔,匹配时为 AND 关系 +

+
+ + {/* 类型 */} +
+ + +
+ + {/* 重点资产 */} +
+ setValue("isImportant", !!checked)} + /> + +
+ + + + + +
+
+
+ ) +} diff --git a/frontend/components/fingerprints/ehole-fingerprint-view.tsx b/frontend/components/fingerprints/ehole-fingerprint-view.tsx new file mode 100644 index 00000000..98c539e0 --- /dev/null +++ b/frontend/components/fingerprints/ehole-fingerprint-view.tsx @@ -0,0 +1,184 @@ +"use client" + +import React, { useState, useMemo } from "react" +import { AlertTriangle } from "lucide-react" +import { toast } from "sonner" +import { + useEholeFingerprints, + useBulkDeleteEholeFingerprints, + useDeleteAllEholeFingerprints, +} from "@/hooks/use-fingerprints" +import { FingerprintService } from "@/services/fingerprint.service" +import { EholeFingerprintDataTable } from "./ehole-fingerprint-data-table" +import { createEholeFingerprintColumns } from "./ehole-fingerprint-columns" +import { EholeFingerprintDialog } from "./ehole-fingerprint-dialog" +import { ImportFingerprintDialog } from "./import-fingerprint-dialog" +import { DataTableSkeleton } from "@/components/ui/data-table-skeleton" +import type { EholeFingerprint } from "@/types/fingerprint.types" + +export function EholeFingerprintView() { + const [selectedFingerprints, setSelectedFingerprints] = useState([]) + const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 }) + const [filterQuery, setFilterQuery] = useState("") + const [isSearching, setIsSearching] = useState(false) + const [addDialogOpen, setAddDialogOpen] = useState(false) + const [importDialogOpen, setImportDialogOpen] = useState(false) + + // 查询数据 + const { data, isLoading, isFetching, error, refetch } = useEholeFingerprints({ + page: pagination.pageIndex + 1, + pageSize: pagination.pageSize, + filter: filterQuery || undefined, + }) + + // Mutations + const bulkDeleteMutation = useBulkDeleteEholeFingerprints() + const deleteAllMutation = useDeleteAllEholeFingerprints() + + // 搜索状态 + React.useEffect(() => { + if (!isFetching && isSearching) { + setIsSearching(false) + } + }, [isFetching, isSearching]) + + const handleFilterChange = (value: string) => { + setIsSearching(true) + setFilterQuery(value) + setPagination((prev) => ({ ...prev, pageIndex: 0 })) + } + + // 格式化日期 + const formatDate = (dateString: string): string => { + return new Date(dateString).toLocaleString("zh-CN", { + year: "numeric", + month: "numeric", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + hour12: false, + }) + } + + // 导出 + const handleExport = async () => { + try { + const blob = await FingerprintService.exportEholeFingerprints() + const url = URL.createObjectURL(blob) + const a = document.createElement("a") + a.href = url + a.download = `ehole-fingerprints-${Date.now()}.json` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + toast.success("导出成功") + } catch (error: any) { + toast.error(error.message || "导出失败") + } + } + + // 批量删除 + const handleBulkDelete = async () => { + if (selectedFingerprints.length === 0) return + + try { + const ids = selectedFingerprints.map((f) => f.id) + const result = await bulkDeleteMutation.mutateAsync(ids) + toast.success(`删除成功:${result.deleted} 条`) + setSelectedFingerprints([]) + } catch (error: any) { + toast.error(error.message || "删除失败") + } + } + + // 删除所有 + const handleDeleteAll = async () => { + try { + const result = await deleteAllMutation.mutateAsync() + toast.success(`删除成功:${result.deleted} 条`) + } catch (error: any) { + toast.error(error.message || "删除失败") + } + } + + // 列定义 + const columns = useMemo( + () => createEholeFingerprintColumns({ formatDate }), + [] + ) + + // 转换数据 + const fingerprints: EholeFingerprint[] = useMemo(() => { + if (!data?.results) return [] + return data.results + }, [data]) + + // 错误状态 + if (error) { + return ( +
+
+ +
+

加载失败

+

+ {error.message || "加载指纹数据时出现错误"} +

+ +
+ ) + } + + // 加载状态 + if (isLoading && !data) { + return + } + + return ( + <> + setAddDialogOpen(true)} + onAddImport={() => setImportDialogOpen(true)} + onExport={handleExport} + onBulkDelete={handleBulkDelete} + onDeleteAll={handleDeleteAll} + totalCount={data?.total || 0} + pagination={pagination} + setPagination={setPagination} + paginationInfo={{ + total: data?.total || 0, + page: data?.page || 1, + pageSize: data?.pageSize || 10, + totalPages: data?.totalPages || 1, + }} + onPaginationChange={setPagination} + /> + + {/* 添加指纹对话框 */} + refetch()} + /> + + {/* 导入指纹对话框 */} + refetch()} + /> + + ) +} diff --git a/frontend/components/fingerprints/import-fingerprint-dialog.tsx b/frontend/components/fingerprints/import-fingerprint-dialog.tsx new file mode 100644 index 00000000..f0c2565e --- /dev/null +++ b/frontend/components/fingerprints/import-fingerprint-dialog.tsx @@ -0,0 +1,142 @@ +"use client" + +import React, { useState } from "react" +import { toast } from "sonner" +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" +import { Button } from "@/components/ui/button" +import { + Dropzone, + DropzoneContent, + DropzoneEmptyState, +} from "@/components/ui/dropzone" +import { useImportEholeFingerprints } from "@/hooks/use-fingerprints" + +interface ImportFingerprintDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + onSuccess?: () => void +} + +export function ImportFingerprintDialog({ + open, + onOpenChange, + onSuccess, +}: ImportFingerprintDialogProps) { + const [files, setFiles] = useState([]) + const importMutation = useImportEholeFingerprints() + + const handleDrop = (acceptedFiles: File[]) => { + setFiles(acceptedFiles) + } + + const handleImport = async () => { + if (files.length === 0) { + toast.error("请先选择文件") + return + } + + const file = files[0] + + // 前端基础校验 + try { + const text = await file.text() + const json = JSON.parse(text) + + if (!json.fingerprint) { + toast.error("无效的 EHole 格式:缺少 fingerprint 字段") + return + } + + if (!Array.isArray(json.fingerprint)) { + toast.error("无效的 EHole 格式:fingerprint 必须是数组") + return + } + + if (json.fingerprint.length === 0) { + toast.error("指纹数据为空") + return + } + + // 检查第一条数据的基本字段 + const first = json.fingerprint[0] + if (!first.cms || !first.keyword) { + toast.error("无效的 EHole 格式:指纹缺少必要字段 (cms, keyword)") + return + } + } catch (e) { + toast.error("无效的 JSON 文件") + return + } + + // 校验通过,提交到后端 + try { + const result = await importMutation.mutateAsync(file) + toast.success(`导入成功:创建 ${result.created} 条,失败 ${result.failed} 条`) + setFiles([]) + onOpenChange(false) + onSuccess?.() + } catch (error: any) { + toast.error(error.message || "导入失败") + } + } + + const handleClose = (open: boolean) => { + if (!open) { + setFiles([]) + } + onOpenChange(open) + } + + return ( + + + + 导入指纹 + + 上传 EHole 格式的 JSON 指纹文件 + + + +
+ toast.error(error.message)} + > + + + + +

+ 支持 EHole 格式的 JSON 文件,格式如:{" "} + + {`{"fingerprint": [...]}`} + +

+
+ + + + + +
+
+ ) +} diff --git a/frontend/components/fingerprints/index.ts b/frontend/components/fingerprints/index.ts new file mode 100644 index 00000000..14984a99 --- /dev/null +++ b/frontend/components/fingerprints/index.ts @@ -0,0 +1,5 @@ +export { EholeFingerprintView } from "./ehole-fingerprint-view" +export { EholeFingerprintDataTable } from "./ehole-fingerprint-data-table" +export { createEholeFingerprintColumns } from "./ehole-fingerprint-columns" +export { EholeFingerprintDialog } from "./ehole-fingerprint-dialog" +export { ImportFingerprintDialog } from "./import-fingerprint-dialog" diff --git a/frontend/hooks/use-fingerprints.ts b/frontend/hooks/use-fingerprints.ts new file mode 100644 index 00000000..5c5d078f --- /dev/null +++ b/frontend/hooks/use-fingerprints.ts @@ -0,0 +1,158 @@ +/** + * 指纹管理 React Query Hooks + */ + +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" +import { FingerprintService } from "@/services/fingerprint.service" +import type { EholeFingerprint, FingerprintStats } from "@/types/fingerprint.types" + +// Query Keys +export const fingerprintKeys = { + all: ["fingerprints"] as const, + stats: () => [...fingerprintKeys.all, "stats"] as const, + ehole: { + all: () => [...fingerprintKeys.all, "ehole"] as const, + list: (params: any) => [...fingerprintKeys.ehole.all(), "list", params] as const, + detail: (id: number) => [...fingerprintKeys.ehole.all(), "detail", id] as const, + }, +} + +// ==================== EHole Hooks ==================== + +/** + * 获取 EHole 指纹列表 + */ +export function useEholeFingerprints( + params: { page?: number; pageSize?: number; filter?: string } = {}, + options?: { enabled?: boolean } +) { + return useQuery({ + queryKey: fingerprintKeys.ehole.list(params), + queryFn: () => FingerprintService.getEholeFingerprints(params), + ...options, + }) +} + +/** + * 获取 EHole 指纹详情 + */ +export function useEholeFingerprint(id: number, options?: { enabled?: boolean }) { + return useQuery({ + queryKey: fingerprintKeys.ehole.detail(id), + queryFn: () => FingerprintService.getEholeFingerprint(id), + enabled: id > 0 && options?.enabled !== false, + }) +} + +/** + * 创建 EHole 指纹 + */ +export function useCreateEholeFingerprint() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (data: Omit) => + FingerprintService.createEholeFingerprint(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.stats() }) + }, + }) +} + +/** + * 更新 EHole 指纹 + */ +export function useUpdateEholeFingerprint() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: ({ id, data }: { id: number; data: Partial }) => + FingerprintService.updateEholeFingerprint(id, data), + onSuccess: (_, { id }) => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.detail(id) }) + }, + }) +} + +/** + * 删除 EHole 指纹 + */ +export function useDeleteEholeFingerprint() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (id: number) => FingerprintService.deleteEholeFingerprint(id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.stats() }) + }, + }) +} + +/** + * 批量创建 EHole 指纹 + */ +export function useBatchCreateEholeFingerprints() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (fingerprints: Omit[]) => + FingerprintService.batchCreateEholeFingerprints(fingerprints), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.stats() }) + }, + }) +} + +/** + * 文件导入 EHole 指纹 + */ +export function useImportEholeFingerprints() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (file: File) => FingerprintService.importEholeFingerprints(file), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.stats() }) + }, + }) +} + +/** + * 批量删除 EHole 指纹 + */ +export function useBulkDeleteEholeFingerprints() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (ids: number[]) => FingerprintService.bulkDeleteEholeFingerprints(ids), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.stats() }) + }, + }) +} + +/** + * 删除所有 EHole 指纹 + */ +export function useDeleteAllEholeFingerprints() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: () => FingerprintService.deleteAllEholeFingerprints(), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: fingerprintKeys.ehole.all() }) + queryClient.invalidateQueries({ queryKey: fingerprintKeys.stats() }) + }, + }) +} + +// ==================== 统计 Hooks ==================== + +/** + * 获取指纹库统计 + */ +export function useFingerprintStats() { + return useQuery({ + queryKey: fingerprintKeys.stats(), + queryFn: () => FingerprintService.getStats(), + }) +} diff --git a/frontend/services/fingerprint.service.ts b/frontend/services/fingerprint.service.ts new file mode 100644 index 00000000..4eea8138 --- /dev/null +++ b/frontend/services/fingerprint.service.ts @@ -0,0 +1,134 @@ +/** + * 指纹管理 API 服务 + */ + +import apiClient from "@/lib/api-client" +import type { PaginatedResponse } from "@/types/api-response.types" +import type { + EholeFingerprint, + BatchCreateResponse, + BulkDeleteResponse, + FingerprintStats +} from "@/types/fingerprint.types" + +// 分页查询参数 +interface QueryParams { + page?: number + pageSize?: number + filter?: string +} + +export const FingerprintService = { + // ==================== EHole ==================== + + /** + * 获取 EHole 指纹列表 + */ + async getEholeFingerprints(params: QueryParams = {}): Promise> { + const response = await apiClient.get("/fingerprints/ehole/", { params }) + return response.data + }, + + /** + * 获取 EHole 指纹详情 + */ + async getEholeFingerprint(id: number): Promise { + const response = await apiClient.get(`/fingerprints/ehole/${id}/`) + return response.data + }, + + /** + * 创建单条 EHole 指纹 + */ + async createEholeFingerprint(data: Omit): Promise { + const response = await apiClient.post("/fingerprints/ehole/", data) + return response.data + }, + + /** + * 更新 EHole 指纹 + */ + async updateEholeFingerprint(id: number, data: Partial): Promise { + const response = await apiClient.put(`/fingerprints/ehole/${id}/`, data) + return response.data + }, + + /** + * 删除单条 EHole 指纹 + */ + async deleteEholeFingerprint(id: number): Promise { + await apiClient.delete(`/fingerprints/ehole/${id}/`) + }, + + /** + * 批量创建 EHole 指纹 + */ + async batchCreateEholeFingerprints(fingerprints: Omit[]): Promise { + const response = await apiClient.post("/fingerprints/ehole/batch_create/", { fingerprints }) + return response.data + }, + + /** + * 文件导入 EHole 指纹 + */ + async importEholeFingerprints(file: File): Promise { + const formData = new FormData() + formData.append("file", file) + const response = await apiClient.post("/fingerprints/ehole/import_file/", formData, { + headers: { "Content-Type": "multipart/form-data" } + }) + return response.data + }, + + /** + * 批量删除 EHole 指纹 + */ + async bulkDeleteEholeFingerprints(ids: number[]): Promise { + const response = await apiClient.post("/fingerprints/ehole/bulk-delete/", { ids }) + return response.data + }, + + /** + * 删除所有 EHole 指纹 + */ + async deleteAllEholeFingerprints(): Promise { + const response = await apiClient.post("/fingerprints/ehole/delete-all/") + return response.data + }, + + /** + * 导出 EHole 指纹 + */ + async exportEholeFingerprints(): Promise { + const response = await apiClient.get("/fingerprints/ehole/export/", { + responseType: "blob" + }) + return response.data + }, + + /** + * 获取 EHole 指纹数量 + */ + async getEholeCount(): Promise { + const response = await apiClient.get("/fingerprints/ehole/", { params: { pageSize: 1 } }) + return response.data.total || 0 + }, + + // ==================== 统计 ==================== + + /** + * 获取所有指纹库统计 + */ + async getStats(): Promise { + // 并行获取各指纹库数量 + const [eholeCount] = await Promise.all([ + this.getEholeCount(), + // TODO: 后续添加 Goby, Wappalyzer + ]) + return { + ehole: eholeCount, + goby: 0, + wappalyzer: 0, + } + }, +} diff --git a/frontend/types/api-response.types.ts b/frontend/types/api-response.types.ts index 052449d3..8207574a 100644 --- a/frontend/types/api-response.types.ts +++ b/frontend/types/api-response.types.ts @@ -19,3 +19,13 @@ export interface BatchCreateResponse { reason: string }> } + + +// 分页响应类型 +export interface PaginatedResponse { + results: T[] + total: number + page: number + pageSize: number + totalPages?: number +} diff --git a/frontend/types/fingerprint.types.ts b/frontend/types/fingerprint.types.ts new file mode 100644 index 00000000..a6b48255 --- /dev/null +++ b/frontend/types/fingerprint.types.ts @@ -0,0 +1,33 @@ +/** + * 指纹相关类型定义 + */ + +// EHole 指纹类型 +export interface EholeFingerprint { + id: number + cms: string + method: string + location: string + keyword: string[] + isImportant: boolean + type: string + createdAt: string +} + +// 批量创建响应 +export interface BatchCreateResponse { + created: number + failed: number +} + +// 批量删除响应 +export interface BulkDeleteResponse { + deleted: number +} + +// 指纹统计信息 +export interface FingerprintStats { + ehole: number + goby: number + wappalyzer: number +}