Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/fuzz/stats/stats.go
2070 views
1
// Package stats implements a statistics recording module for
2
// nuclei fuzzing.
3
package stats
4
5
import (
6
"fmt"
7
"log"
8
"net/url"
9
10
"github.com/pkg/errors"
11
)
12
13
// Tracker is a stats tracker module for fuzzing server
14
type Tracker struct {
15
database *simpleStats
16
}
17
18
// NewTracker creates a new tracker instance
19
func NewTracker() (*Tracker, error) {
20
db, err := NewSimpleStats()
21
if err != nil {
22
return nil, errors.Wrap(err, "could not create new tracker")
23
}
24
25
tracker := &Tracker{
26
database: db,
27
}
28
return tracker, nil
29
}
30
31
func (t *Tracker) GetStats() SimpleStatsResponse {
32
return t.database.GetStatistics()
33
}
34
35
// Close closes the tracker
36
func (t *Tracker) Close() {
37
t.database.Close()
38
}
39
40
// FuzzingEvent is a fuzzing event
41
type FuzzingEvent struct {
42
URL string
43
ComponentType string
44
ComponentName string
45
TemplateID string
46
PayloadSent string
47
StatusCode int
48
Matched bool
49
RawRequest string
50
RawResponse string
51
Severity string
52
53
siteName string
54
}
55
56
func (t *Tracker) RecordResultEvent(event FuzzingEvent) {
57
event.siteName = getCorrectSiteName(event.URL)
58
if err := t.database.InsertMatchedRecord(event); err != nil {
59
log.Printf("could not insert matched record: %s", err)
60
}
61
}
62
63
type ComponentEvent struct {
64
URL string
65
ComponentType string
66
ComponentName string
67
68
siteName string
69
}
70
71
func (t *Tracker) RecordComponentEvent(event ComponentEvent) {
72
event.siteName = getCorrectSiteName(event.URL)
73
if err := t.database.InsertComponent(event); err != nil {
74
log.Printf("could not insert component record: %s", err)
75
}
76
}
77
78
type ErrorEvent struct {
79
TemplateID string
80
URL string
81
Error string
82
}
83
84
func (t *Tracker) RecordErrorEvent(event ErrorEvent) {
85
if err := t.database.InsertError(event); err != nil {
86
log.Printf("could not insert error record: %s", err)
87
}
88
}
89
90
func getCorrectSiteName(originalURL string) string {
91
parsed, err := url.Parse(originalURL)
92
if err != nil {
93
return ""
94
}
95
96
// Site is the host:port combo
97
siteName := parsed.Host
98
if parsed.Port() == "" {
99
switch parsed.Scheme {
100
case "https":
101
siteName = fmt.Sprintf("%s:443", siteName)
102
case "http":
103
siteName = fmt.Sprintf("%s:80", siteName)
104
}
105
}
106
return siteName
107
}
108
109