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  }