mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

主要修复: 1. 修复时间显示Bug - StartTime初始化问题 2. 修复Web智能探测错误检测预定义端口而非用户指定端口 3. 修复本地插件被错误调用到端口扫描中的问题 4. 修复host:port格式双重处理导致的多余端口扫描 5. 统一插件过滤逻辑,消除接口不一致性 6. 优化Web检测缓存机制,减少重复HTTP请求 技术改进: - 重构插件适用性检查逻辑,确保策略过滤器正确工作 - 区分Web检测的自动发现模式和用户指定端口模式 - 在解析阶段正确处理host:port格式,避免与默认端口冲突 - 完善缓存机制,提升性能 测试验证: - ./fscan -h 127.0.0.1:3306 现在只检测3306端口 - 本地插件不再参与端口扫描 - Web检测只对指定端口进行协议检测 - 时间显示正确
277 lines
11 KiB
Go
277 lines
11 KiB
Go
package parsers
|
||
|
||
import (
|
||
"regexp"
|
||
"time"
|
||
)
|
||
|
||
/*
|
||
constants.go - 解析器系统常量定义
|
||
|
||
统一管理common/parsers包中的所有常量,便于查看和编辑。
|
||
*/
|
||
|
||
// =============================================================================
|
||
// 默认解析器选项常量 (从Types.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 解析器默认配置
|
||
DefaultEnableConcurrency = true
|
||
DefaultMaxWorkers = 4
|
||
DefaultTimeout = 30 * time.Second
|
||
DefaultEnableValidation = true
|
||
DefaultEnableStatistics = true
|
||
DefaultIgnoreErrors = false
|
||
DefaultFileMaxSize = 100 * 1024 * 1024 // 100MB
|
||
DefaultMaxTargets = 10000 // 10K targets
|
||
)
|
||
|
||
// =============================================================================
|
||
// 文件读取器常量 (从FileReader.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 文件读取器默认配置
|
||
DefaultMaxCacheSize = 10
|
||
DefaultEnableCache = true
|
||
DefaultFileReaderMaxFileSize = 50 * 1024 * 1024 // 50MB
|
||
DefaultFileReaderTimeout = 30 * time.Second
|
||
DefaultFileReaderEnableValidation = true
|
||
DefaultTrimSpace = true
|
||
DefaultSkipEmpty = true
|
||
DefaultSkipComments = true
|
||
|
||
// 文件内容验证
|
||
MaxLineLength = 1000 // 单行最大字符数
|
||
MaxValidRune = 32 // 最小有效字符ASCII值
|
||
TabRune = 9 // Tab字符
|
||
NewlineRune = 10 // 换行符
|
||
CarriageReturnRune = 13 // 回车符
|
||
CommentPrefix = "#" // 注释前缀
|
||
)
|
||
|
||
// =============================================================================
|
||
// 凭据解析器常量 (从CredentialParser.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 凭据验证限制
|
||
DefaultMaxUsernameLength = 64
|
||
DefaultMaxPasswordLength = 128
|
||
DefaultAllowEmptyPasswords = true
|
||
DefaultValidateHashes = true
|
||
DefaultDeduplicateUsers = true
|
||
DefaultDeduplicatePasswords = true
|
||
DefaultCredentialsEnableStatistics = true
|
||
|
||
// 哈希验证
|
||
HashRegexPattern = `^[a-fA-F0-9]{32}$` // MD5哈希正则表达式
|
||
HashValidationLength = 32 // 有效哈希长度
|
||
InvalidUsernameChars = "\r\n\t" // 无效用户名字符
|
||
)
|
||
|
||
// =============================================================================
|
||
// 网络解析器常量 (从NetworkParser.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 网络配置默认值
|
||
DefaultValidateProxies = true
|
||
DefaultAllowInsecure = false
|
||
DefaultNetworkTimeout = 30 * time.Second
|
||
DefaultWebTimeout = 10 * time.Second
|
||
DefaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
||
|
||
// 超时限制
|
||
MaxTimeoutSeconds = 300 // 最大超时5分钟
|
||
MaxWebTimeoutSeconds = 120 // 最大Web超时2分钟
|
||
|
||
// 字符串长度限制
|
||
MaxUserAgentLength = 512 // 最大用户代理长度
|
||
MaxCookieLength = 4096 // 最大Cookie长度
|
||
|
||
// 代理快捷配置
|
||
ProxyShortcut1 = "1"
|
||
ProxyShortcut2 = "2"
|
||
ProxyShortcutHTTP = "http://127.0.0.1:8080"
|
||
ProxyShortcutSOCKS5 = "socks5://127.0.0.1:1080"
|
||
|
||
// 协议支持
|
||
ProtocolHTTP = "http"
|
||
ProtocolHTTPS = "https"
|
||
ProtocolSOCKS5 = "socks5"
|
||
ProtocolPrefix = "://"
|
||
SOCKS5Prefix = "socks5://"
|
||
HTTPPrefix = "http://"
|
||
|
||
// 端口范围
|
||
MinPort = 1
|
||
MaxPort = 65535
|
||
|
||
// 无效字符集
|
||
InvalidUserAgentChars = "\r\n\t"
|
||
)
|
||
|
||
// GetCommonBrowsers 获取常见浏览器标识列表
|
||
func GetCommonBrowsers() []string {
|
||
return []string{
|
||
"Mozilla", "Chrome", "Safari", "Firefox", "Edge", "Opera",
|
||
"AppleWebKit", "Gecko", "Trident", "Presto",
|
||
}
|
||
}
|
||
|
||
// =============================================================================
|
||
// 目标解析器常量 (从TargetParser.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 目标解析器默认配置
|
||
DefaultTargetMaxTargets = 10000
|
||
DefaultMaxPortRange = 1000
|
||
DefaultAllowPrivateIPs = true
|
||
DefaultAllowLoopback = true
|
||
DefaultValidateURLs = true
|
||
DefaultResolveDomains = false
|
||
DefaultTargetEnableStatistics = true
|
||
|
||
// 正则表达式模式
|
||
IPv4RegexPattern = `^(\d{1,3}\.){3}\d{1,3}$`
|
||
PortRangeRegexPattern = `^(\d+)(-(\d+))?$`
|
||
URLValidationRegexPattern = `^https?://[^\s]+$`
|
||
DomainRegexPattern = `^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$`
|
||
CookieRegexPattern = `^[^=;\s]+(=[^;\s]*)?(\s*;\s*[^=;\s]+(=[^;\s]*)?)*$`
|
||
|
||
// IP地址限制
|
||
MaxIPv4OctetValue = 255
|
||
IPv4OctetCount = 4
|
||
MaxDomainLength = 253
|
||
|
||
// CIDR网段简写
|
||
PrivateNetwork192 = "192"
|
||
PrivateNetwork172 = "172"
|
||
PrivateNetwork10 = "10"
|
||
PrivateNetwork192CIDR = "192.168.0.0/16"
|
||
PrivateNetwork172CIDR = "172.16.0.0/12"
|
||
PrivateNetwork10CIDR = "10.0.0.0/8"
|
||
|
||
// 私有网络范围
|
||
Private172StartSecondOctet = 16
|
||
Private172EndSecondOctet = 31
|
||
Private192SecondOctet = 168
|
||
|
||
// /8网段采样配置
|
||
Subnet8SamplingStep = 32
|
||
Subnet8ThirdOctetStep = 10
|
||
|
||
// IP地址计算位移
|
||
IPFirstOctetShift = 24
|
||
IPSecondOctetShift = 16
|
||
IPThirdOctetShift = 8
|
||
IPOctetMask = 0xFF
|
||
)
|
||
|
||
// GetCommonSecondOctets 获取常用第二段IP
|
||
func GetCommonSecondOctets() []int {
|
||
return []int{0, 1, 2, 10, 100, 200, 254}
|
||
}
|
||
|
||
// =============================================================================
|
||
// 简化解析器常量 (从Simple.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 端口和主机限制
|
||
SimpleMaxHosts = 10000
|
||
|
||
// 网段简写展开
|
||
DefaultGatewayLastOctet = 1
|
||
RouterSwitchLastOctet = 254
|
||
SamplingMinHost = 2
|
||
SamplingMaxHost = 253
|
||
)
|
||
|
||
// GetPortGroups 获取预定义端口组映射
|
||
// 注意:端口常量现在直接定义在common/constants.go中
|
||
func GetPortGroups() map[string]string {
|
||
// 这些常量值现在需要从common包导入
|
||
// 为了避免循环导入,我们直接复制值,或者重新设计导入关系
|
||
return map[string]string{
|
||
"web": "80,81,82,83,84,85,86,87,88,89,90,91,92,98,99,443,800,801,808,880,888,889,1000,1010,1080,1081,1082,1099,1118,1888,2008,2020,2100,2375,2379,3000,3008,3128,3505,5555,6080,6648,6868,7000,7001,7002,7003,7004,7005,7007,7008,7070,7071,7074,7078,7080,7088,7200,7680,7687,7688,7777,7890,8000,8001,8002,8003,8004,8005,8006,8008,8009,8010,8011,8012,8016,8018,8020,8028,8030,8038,8042,8044,8046,8048,8053,8060,8069,8070,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8108,8118,8161,8172,8180,8181,8200,8222,8244,8258,8280,8288,8300,8360,8443,8448,8484,8800,8834,8838,8848,8858,8868,8879,8880,8881,8888,8899,8983,8989,9000,9001,9002,9008,9010,9043,9060,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9200,9443,9448,9800,9981,9986,9988,9998,9999,10000,10001,10002,10004,10008,10010,10051,10250,12018,12443,14000,15672,15671,16080,18000,18001,18002,18004,18008,18080,18082,18088,18090,18098,19001,20000,20720,20880,21000,21501,21502,28018",
|
||
"main": "21,22,23,25,80,81,110,135,139,143,389,443,445,465,502,587,636,873,993,995,1433,1434,1521,1522,1525,2121,2200,2222,3000,3268,3269,3306,3389,5432,5672,5900,6379,7474,7687,8000,8080,8081,8088,8443,8888,9000,9042,9080,9092,9200,9300,11211,15672,22222,27017,61613,61614",
|
||
"db": "1433,1521,3306,5432,5672,6379,7687,9042,9093,9200,11211,27017,61616",
|
||
"service": "21,22,23,25,110,135,139,143,162,389,445,465,502,587,636,873,993,995,1433,1521,2222,3306,3389,5020,5432,5672,5671,6379,8161,8443,9000,9092,9093,9200,10051,11211,15672,15671,27017,61616,61613",
|
||
"common": "21,22,23,25,53,80,110,135,139,143,443,445,993,995,1723,3389,5060,5985,5986",
|
||
"all": "1-65535",
|
||
}
|
||
}
|
||
|
||
// GetTargetPortGroups 获取目标解析器端口组映射(向后兼容,调用统一函数)
|
||
func GetTargetPortGroups() map[string]string {
|
||
return GetPortGroups()
|
||
}
|
||
|
||
// =============================================================================
|
||
// 验证解析器常量 (从ValidationParser.go迁移)
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 验证解析器默认配置
|
||
DefaultMaxErrorCount = 100
|
||
DefaultStrictMode = false
|
||
DefaultAllowEmpty = true
|
||
DefaultCheckConflicts = true
|
||
DefaultValidateTargets = true
|
||
DefaultValidateNetwork = true
|
||
|
||
// 性能警告阈值
|
||
MaxTargetsThreshold = 100000 // 最大目标数量阈值
|
||
MinTimeoutThreshold = 1 * time.Second // 最小超时阈值
|
||
MaxTimeoutThreshold = 60 * time.Second // 最大超时阈值
|
||
)
|
||
|
||
// =============================================================================
|
||
// 错误类型常量
|
||
// =============================================================================
|
||
|
||
const (
|
||
// 解析错误类型
|
||
ErrorTypeInputError = "INPUT_ERROR"
|
||
ErrorTypeFileError = "FILE_ERROR"
|
||
ErrorTypeTimeout = "TIMEOUT"
|
||
ErrorTypeReadError = "READ_ERROR"
|
||
ErrorTypeUsernameError = "USERNAME_ERROR"
|
||
ErrorTypePasswordError = "PASSWORD_ERROR"
|
||
ErrorTypeHashError = "HASH_ERROR"
|
||
ErrorTypeProxyError = "PROXY_ERROR"
|
||
ErrorTypeUserAgentError = "USERAGENT_ERROR"
|
||
ErrorTypeCookieError = "COOKIE_ERROR"
|
||
ErrorTypeHostError = "HOST_ERROR"
|
||
ErrorTypePortError = "PORT_ERROR"
|
||
ErrorTypeExcludePortError = "EXCLUDE_PORT_ERROR"
|
||
|
||
)
|
||
|
||
// =============================================================================
|
||
// 编译时正则表达式
|
||
// =============================================================================
|
||
|
||
var (
|
||
// 预编译的正则表达式,提高性能
|
||
CompiledHashRegex *regexp.Regexp
|
||
CompiledIPv4Regex *regexp.Regexp
|
||
CompiledPortRegex *regexp.Regexp
|
||
CompiledURLRegex *regexp.Regexp
|
||
CompiledDomainRegex *regexp.Regexp
|
||
CompiledCookieRegex *regexp.Regexp
|
||
)
|
||
|
||
// 在包初始化时编译正则表达式
|
||
func init() {
|
||
CompiledHashRegex = regexp.MustCompile(HashRegexPattern)
|
||
CompiledIPv4Regex = regexp.MustCompile(IPv4RegexPattern)
|
||
CompiledPortRegex = regexp.MustCompile(PortRangeRegexPattern)
|
||
CompiledURLRegex = regexp.MustCompile(URLValidationRegexPattern)
|
||
CompiledDomainRegex = regexp.MustCompile(DomainRegexPattern)
|
||
CompiledCookieRegex = regexp.MustCompile(CookieRegexPattern)
|
||
} |