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