mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-25 12:41:53 +08:00
refactor: 完成全局状态到 session 的完整迁移
将 plugins/services、plugins/local、plugins/web、webscan 层的日志输出、 漏洞结果保存和 TCP 计数器从全局 common.Log*/GetGlobalState() 迁移到 session 实例方法,确保 SDK 并发扫描时各实例完全隔离。 - 50 个文件,所有插件日志走 session.Log* - DoRequest 加入 session 参数,计数器走 session.State - POC 执行器通过 POCContext.Session 传递 - 仅保留 init() 和 CEL runtime 等无 session 场景的全局回退
This commit is contained in:
+15
-14
@@ -48,7 +48,7 @@ var (
|
||||
)
|
||||
|
||||
// WebScan 执行Web漏洞扫描
|
||||
func WebScan(ctx context.Context, info *common.HostInfo, cfg *common.Config) {
|
||||
func WebScan(ctx context.Context, info *common.HostInfo, cfg *common.Config, session *common.ScanSession) {
|
||||
// 初始化POC配置(用于CEL回调函数)
|
||||
lib.InitPOCConfig(cfg.DNSLog)
|
||||
|
||||
@@ -65,19 +65,19 @@ func WebScan(ctx context.Context, info *common.HostInfo, cfg *common.Config) {
|
||||
|
||||
// 验证输入
|
||||
if info == nil {
|
||||
common.LogError(i18n.GetText("invalid_scan_target"))
|
||||
session.LogError(i18n.GetText("invalid_scan_target"))
|
||||
return
|
||||
}
|
||||
|
||||
if len(allPocs) == 0 {
|
||||
common.LogError(i18n.GetText("poc_load_failed"))
|
||||
session.LogError(i18n.GetText("poc_load_failed"))
|
||||
return
|
||||
}
|
||||
|
||||
// 构建目标URL
|
||||
target, err := buildTargetURL(info)
|
||||
if err != nil {
|
||||
common.LogError(i18n.Tr("webscan_target_url_failed", err))
|
||||
session.LogError(i18n.Tr("webscan_target_url_failed", err))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -91,13 +91,13 @@ func WebScan(ctx context.Context, info *common.HostInfo, cfg *common.Config) {
|
||||
// 根据扫描策略执行POC
|
||||
if cfg.POC.PocName == "" && len(info.Info) == 0 {
|
||||
// 执行所有POC
|
||||
executePOCs(ctx, config.PocInfo{Target: target}, cfg)
|
||||
executePOCs(ctx, config.PocInfo{Target: target}, cfg, session)
|
||||
} else if len(info.Info) > 0 {
|
||||
// 基于指纹信息执行POC
|
||||
scanByFingerprints(ctx, target, info.Info, cfg)
|
||||
scanByFingerprints(ctx, target, info.Info, cfg, session)
|
||||
} else if cfg.POC.PocName != "" {
|
||||
// 基于指定POC名称执行
|
||||
executePOCs(ctx, config.PocInfo{Target: target, PocName: cfg.POC.PocName}, cfg)
|
||||
executePOCs(ctx, config.PocInfo{Target: target, PocName: cfg.POC.PocName}, cfg, session)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ func hasProtocolPrefix(urlStr string) bool {
|
||||
}
|
||||
|
||||
// scanByFingerprints 根据指纹执行POC
|
||||
func scanByFingerprints(ctx context.Context, target string, fingerprints []string, cfg *common.Config) {
|
||||
func scanByFingerprints(ctx context.Context, target string, fingerprints []string, cfg *common.Config, session *common.ScanSession) {
|
||||
for _, fingerprint := range fingerprints {
|
||||
if fingerprint == "" {
|
||||
continue
|
||||
@@ -137,15 +137,15 @@ func scanByFingerprints(ctx context.Context, target string, fingerprints []strin
|
||||
continue
|
||||
}
|
||||
|
||||
executePOCs(ctx, config.PocInfo{Target: target, PocName: pocName}, cfg)
|
||||
executePOCs(ctx, config.PocInfo{Target: target, PocName: pocName}, cfg, session)
|
||||
}
|
||||
}
|
||||
|
||||
// executePOCs 执行POC检测
|
||||
func executePOCs(ctx context.Context, pocInfo config.PocInfo, cfg *common.Config) {
|
||||
func executePOCs(ctx context.Context, pocInfo config.PocInfo, cfg *common.Config, session *common.ScanSession) {
|
||||
// 验证目标
|
||||
if pocInfo.Target == "" {
|
||||
common.LogError(ErrEmptyTarget.Error())
|
||||
session.LogError(ErrEmptyTarget.Error())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -157,21 +157,21 @@ func executePOCs(ctx context.Context, pocInfo config.PocInfo, cfg *common.Config
|
||||
// 验证URL
|
||||
_, err := url.Parse(pocInfo.Target)
|
||||
if err != nil {
|
||||
common.LogError(i18n.Tr("webscan_invalid_url", ErrInvalidURL, pocInfo.Target, err))
|
||||
session.LogError(i18n.Tr("webscan_invalid_url", ErrInvalidURL, pocInfo.Target, err))
|
||||
return
|
||||
}
|
||||
|
||||
// 创建基础请求
|
||||
req, err := createBaseRequest(ctx, pocInfo.Target, cfg)
|
||||
if err != nil {
|
||||
common.LogError(i18n.Tr("webscan_request_create_failed", err))
|
||||
session.LogError(i18n.Tr("webscan_request_create_failed", err))
|
||||
return
|
||||
}
|
||||
|
||||
// 筛选POC
|
||||
matchedPocs := filterPocs(pocInfo.PocName)
|
||||
if len(matchedPocs) == 0 {
|
||||
common.LogDebug(fmt.Sprintf("%v: %s", ErrPocNotFound, pocInfo.PocName))
|
||||
session.LogDebug(fmt.Sprintf("%v: %s", ErrPocNotFound, pocInfo.PocName))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -179,6 +179,7 @@ func executePOCs(ctx context.Context, pocInfo config.PocInfo, cfg *common.Config
|
||||
pocCtx := &lib.POCContext{
|
||||
DNSLog: cfg.DNSLog,
|
||||
POCFull: cfg.POC.Full,
|
||||
Session: session,
|
||||
}
|
||||
|
||||
// 执行POC检测
|
||||
|
||||
Reference in New Issue
Block a user