Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/protocols/utils/variables_test.go
2070 views
1
package utils
2
3
import (
4
"context"
5
"reflect"
6
"testing"
7
8
"github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/contextargs"
9
urlutil "github.com/projectdiscovery/utils/url"
10
"github.com/stretchr/testify/require"
11
)
12
13
func TestHTTPVariables(t *testing.T) {
14
baseURL := "http://localhost:9001/test/123"
15
parsed, _ := urlutil.Parse(baseURL)
16
// trailing slash is only true when both target/inputURL and payload {{BaseURL}}/xyz both have slash
17
values := GenerateVariables(parsed, false, nil)
18
19
require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")
20
require.Equal(t, values["RootURL"], "http://localhost:9001", "incorrect rootURL")
21
require.Equal(t, values["Host"], "localhost", "incorrect domain name")
22
require.Equal(t, values["Path"], "/test", "incorrect path")
23
require.Equal(t, values["File"], "123", "incorrect file")
24
require.Equal(t, values["Port"], "9001", "incorrect port number")
25
require.Equal(t, values["Scheme"], "http", "incorrect scheme")
26
require.Equal(t, values["Hostname"], "localhost:9001", "incorrect hostname")
27
28
baseURL = "https://example.com"
29
parsed, _ = urlutil.Parse(baseURL)
30
values = GenerateVariables(parsed, false, nil)
31
32
require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")
33
require.Equal(t, values["Host"], "example.com", "incorrect domain name")
34
require.Equal(t, values["RootURL"], "https://example.com", "incorrect rootURL")
35
require.Equal(t, values["Path"], "", "incorrect path")
36
require.Equal(t, values["Port"], "443", "incorrect port number")
37
require.Equal(t, values["Scheme"], "https", "incorrect scheme")
38
require.Equal(t, values["Hostname"], "example.com", "incorrect hostname")
39
40
baseURL = "ftp://foobar.com/"
41
parsed, _ = urlutil.Parse(baseURL)
42
values = GenerateVariables(parsed, false, nil)
43
44
require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")
45
require.Equal(t, values["Host"], "foobar.com", "incorrect domain name")
46
require.Equal(t, values["RootURL"], "ftp://foobar.com", "incorrect rootURL")
47
require.Equal(t, values["Path"], "/", "incorrect path")
48
require.Equal(t, values["Port"], "", "incorrect port number") // Unsupported protocol results in a blank port
49
require.Equal(t, values["Scheme"], "ftp", "incorrect scheme")
50
require.Equal(t, values["Hostname"], "foobar.com", "incorrect hostname")
51
52
baseURL = "http://scanme.sh"
53
ctxArgs := contextargs.NewWithInput(context.Background(), baseURL)
54
ctxArgs.MetaInput.CustomIP = "1.2.3.4"
55
values = GenerateVariablesWithContextArgs(ctxArgs, true)
56
57
require.Equal(t, values["BaseURL"], baseURL, "incorrect baseurl")
58
require.Equal(t, values["Host"], "scanme.sh", "incorrect domain name")
59
require.Equal(t, values["RootURL"], "http://scanme.sh", "incorrect rootURL")
60
require.Equal(t, values["Path"], "", "incorrect path")
61
require.Equal(t, values["Port"], "80", "incorrect port number")
62
require.Equal(t, values["Scheme"], "http", "incorrect scheme")
63
require.Equal(t, values["Hostname"], "scanme.sh", "incorrect hostname")
64
require.Equal(t, values["ip"], "1.2.3.4", "incorrect ip")
65
}
66
67
func TestGenerateDNSVariables(t *testing.T) {
68
vars := GenerateDNSVariables("www.projectdiscovery.io")
69
require.Equal(t, map[string]interface{}{
70
"FQDN": "www.projectdiscovery.io",
71
"RDN": "projectdiscovery.io",
72
"DN": "projectdiscovery",
73
"TLD": "io",
74
"SD": "www",
75
}, vars, "could not get dns variables")
76
}
77
78
func TestGenerateVariablesForDNS(t *testing.T) {
79
vars := GenerateVariables("www.projectdiscovery.io", false, nil)
80
expected := map[string]interface{}{
81
"FQDN": "www.projectdiscovery.io",
82
"RDN": "projectdiscovery.io",
83
"DN": "projectdiscovery",
84
"TLD": "io",
85
"SD": "www",
86
}
87
checkResults(t, vars, expected)
88
}
89
90
func TestGenerateVariablesForTCP(t *testing.T) {
91
vars := GenerateVariables("127.0.0.1:5431", false, nil)
92
expected := map[string]interface{}{
93
"Host": "127.0.0.1",
94
"Port": "5431",
95
"Hostname": "127.0.0.1:5431",
96
}
97
checkResults(t, vars, expected)
98
99
vars = GenerateVariables("127.0.0.1", false, nil)
100
expected = map[string]interface{}{
101
"Host": "127.0.0.1",
102
"Hostname": "127.0.0.1",
103
}
104
checkResults(t, vars, expected)
105
}
106
107
func TestGenerateWhoISVariables(t *testing.T) {
108
vars := GenerateVariables("https://example.com", false, nil)
109
expected := map[string]interface{}{
110
"Host": "example.com", "Hostname": "example.com", "Input": "https://example.com",
111
}
112
checkResults(t, vars, expected)
113
114
vars = GenerateVariables("https://example.com:8080", false, nil)
115
expected = map[string]interface{}{
116
"Host": "example.com", "Hostname": "example.com:8080", "Input": "https://example.com:8080",
117
}
118
checkResults(t, vars, expected)
119
}
120
121
func TestGetWebsocketVariables(t *testing.T) {
122
baseURL := "ws://127.0.0.1:40221"
123
parsed, _ := urlutil.Parse(baseURL)
124
vars := GenerateVariables(parsed, false, nil)
125
expected := map[string]interface{}{
126
"Host": "127.0.0.1",
127
"Hostname": "127.0.0.1:40221",
128
"Scheme": "ws",
129
"Path": "",
130
}
131
checkResults(t, vars, expected)
132
133
baseURL = "ws://127.0.0.1:40221/test?var=test"
134
parsed, _ = urlutil.Parse(baseURL)
135
vars = GenerateVariables(parsed, false, nil)
136
expected = map[string]interface{}{
137
"Host": "127.0.0.1",
138
"Hostname": "127.0.0.1:40221",
139
"Scheme": "ws",
140
"Path": "/test?var=test",
141
}
142
checkResults(t, vars, expected)
143
}
144
145
// checkResults returns true if mapSubset is a subset of mapSet otherwise false
146
func checkResults(t *testing.T, mapSet interface{}, mapSubset interface{}) {
147
148
got := reflect.ValueOf(mapSet)
149
expected := reflect.ValueOf(mapSubset)
150
151
require.Greater(t, len(expected.MapKeys()), 0, "failed expected value is empty")
152
require.Greater(t, len(got.MapKeys()), 0, "failed expected value is empty")
153
154
require.LessOrEqual(t, len(expected.MapKeys()), len(got.MapKeys()), "failed return value more than expected")
155
156
iterMapSubset := expected.MapRange()
157
158
for iterMapSubset.Next() {
159
k := iterMapSubset.Key()
160
v := iterMapSubset.Value()
161
162
value := got.MapIndex(k)
163
164
if !value.IsValid() || v.Interface() != value.Interface() {
165
require.Equal(t, value, v, "failed return value is not equal to expected")
166
}
167
}
168
}
169
170