mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-26 05:01:53 +08:00
1. buildTargetURL 对 443/8443 等已知 TLS 端口默认使用 https scheme, webtitle 触发 POC 扫描前将检测到的协议写回 info.URL, 避免对 HTTPS 服务发送 HTTP 请求导致 EOF 2. GetInfo 添加 probe nil 检查,防止探针初始化失败时空指针 panic 3. 删除 test-nuclei-example.yaml 测试模板,避免 robots.txt 误报
This commit is contained in:
@@ -392,6 +392,10 @@ func (i *Info) tryProbes(response []byte, probes []*Probe) bool {
|
|||||||
|
|
||||||
// GetInfo 分析响应数据并提取服务信息
|
// GetInfo 分析响应数据并提取服务信息
|
||||||
func (i *Info) GetInfo(response []byte, probe *Probe) {
|
func (i *Info) GetInfo(response []byte, probe *Probe) {
|
||||||
|
if probe == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 响应数据有效性检查
|
// 响应数据有效性检查
|
||||||
if len(response) <= 0 {
|
if len(response) <= 0 {
|
||||||
common.LogDebug(i18n.GetText("service_probe_empty_response"))
|
common.LogDebug(i18n.GetText("service_probe_empty_response"))
|
||||||
|
|||||||
@@ -270,6 +270,7 @@ func (p *WebTitlePlugin) identifyFingerprintsMulti(ctx context.Context, info *co
|
|||||||
|
|
||||||
// 非全量模式下,基于指纹触发POC扫描
|
// 非全量模式下,基于指纹触发POC扫描
|
||||||
if !config.POC.Full && !config.POC.Disabled {
|
if !config.POC.Full && !config.POC.Disabled {
|
||||||
|
info.URL = baseURL
|
||||||
p.triggerPocScan(ctx, info, fingerprints, config, session)
|
p.triggerPocScan(ctx, info, fingerprints, config, session)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
id: test-nuclei-example
|
|
||||||
info:
|
|
||||||
name: Test Nuclei Example Template
|
|
||||||
author: fscan-dev
|
|
||||||
severity: info
|
|
||||||
description: |
|
|
||||||
This is a test template to demonstrate Nuclei format support in fscan.
|
|
||||||
It will be automatically converted to fscan format during loading.
|
|
||||||
reference:
|
|
||||||
- https://github.com/shadow1ng/fscan
|
|
||||||
|
|
||||||
http:
|
|
||||||
- method: GET
|
|
||||||
path:
|
|
||||||
- "{{BaseURL}}/robots.txt"
|
|
||||||
|
|
||||||
matchers:
|
|
||||||
- type: word
|
|
||||||
words:
|
|
||||||
- "User-agent"
|
|
||||||
- "Disallow"
|
|
||||||
condition: and
|
|
||||||
|
|
||||||
- type: status
|
|
||||||
status:
|
|
||||||
- 200
|
|
||||||
+14
-1
@@ -97,7 +97,11 @@ func WebScan(ctx context.Context, info *common.HostInfo, cfg *common.Config, ses
|
|||||||
func buildTargetURL(info *common.HostInfo) (string, error) {
|
func buildTargetURL(info *common.HostInfo) (string, error) {
|
||||||
// 自动构建URL
|
// 自动构建URL
|
||||||
if info.URL == "" {
|
if info.URL == "" {
|
||||||
info.URL = protocolHTTP + net.JoinHostPort(info.Host, fmt.Sprint(info.Port))
|
protocol := protocolHTTP
|
||||||
|
if isTLSPort(info.Port) {
|
||||||
|
protocol = protocolHTTPS
|
||||||
|
}
|
||||||
|
info.URL = protocol + net.JoinHostPort(info.Host, fmt.Sprint(info.Port))
|
||||||
} else if !hasProtocolPrefix(info.URL) {
|
} else if !hasProtocolPrefix(info.URL) {
|
||||||
info.URL = protocolHTTP + normalizeSchemelessWebTarget(info.URL)
|
info.URL = protocolHTTP + normalizeSchemelessWebTarget(info.URL)
|
||||||
}
|
}
|
||||||
@@ -132,6 +136,15 @@ func hasProtocolPrefix(urlStr string) bool {
|
|||||||
return strings.HasPrefix(urlStr, protocolHTTP) || strings.HasPrefix(urlStr, protocolHTTPS)
|
return strings.HasPrefix(urlStr, protocolHTTP) || strings.HasPrefix(urlStr, protocolHTTPS)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isTLSPort(port int) bool {
|
||||||
|
switch port {
|
||||||
|
case 443, 8443, 4443, 9443:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func normalizeSchemelessWebTarget(rawURL string) string {
|
func normalizeSchemelessWebTarget(rawURL string) string {
|
||||||
authority := rawURL
|
authority := rawURL
|
||||||
suffix := ""
|
suffix := ""
|
||||||
|
|||||||
Reference in New Issue
Block a user