mirror of https://github.com/daffainfo/nuclei.git
Add additional generic url variables
parent
335b38028c
commit
da1630fc21
|
@ -51,16 +51,13 @@ func (r *requestGenerator) Make(baseURL string, dynamicValues map[string]interfa
|
|||
}
|
||||
|
||||
data, parsed = baseURLWithTemplatePrefs(data, parsed)
|
||||
values := generators.MergeMaps(dynamicValues, map[string]interface{}{
|
||||
"Hostname": parsed.Host,
|
||||
})
|
||||
|
||||
trailingSlash := false
|
||||
isRawRequest := len(r.request.Raw) > 0
|
||||
if !isRawRequest && strings.HasSuffix(parsed.Path, "/") && strings.Contains(data, "{{BaseURL}}/") {
|
||||
parsed.Path = strings.TrimSuffix(parsed.Path, "/")
|
||||
trailingSlash = true
|
||||
}
|
||||
parsedString := parsed.String()
|
||||
values["BaseURL"] = parsedString
|
||||
values := generators.MergeMaps(dynamicValues, generateVariables(parsed, trailingSlash))
|
||||
|
||||
// merge with vars
|
||||
if !r.options.Options.Vars.IsEmpty() {
|
||||
|
@ -75,7 +72,7 @@ func (r *requestGenerator) Make(baseURL string, dynamicValues map[string]interfa
|
|||
// If data contains \n it's a raw request, process it like raw. Else
|
||||
// continue with the template based request flow.
|
||||
if isRawRequest {
|
||||
return r.makeHTTPRequestFromRaw(ctx, parsedString, data, values, payloads, interactURL)
|
||||
return r.makeHTTPRequestFromRaw(ctx, parsed.String(), data, values, payloads, interactURL)
|
||||
}
|
||||
return r.makeHTTPRequestFromModel(ctx, data, values, interactURL)
|
||||
}
|
||||
|
@ -231,3 +228,32 @@ func setHeader(req *http.Request, name, value string) {
|
|||
req.Host = value
|
||||
}
|
||||
}
|
||||
|
||||
// generateVariables will create default variables after parsing a url
|
||||
func generateVariables(parsed *url.URL, trailingSlash bool) map[string]interface{} {
|
||||
domain := parsed.Host
|
||||
if strings.Contains(parsed.Host, ":") {
|
||||
domain = strings.Split(parsed.Host, ":")[0]
|
||||
}
|
||||
|
||||
port := parsed.Port()
|
||||
if port == "" {
|
||||
if parsed.Scheme == "https" {
|
||||
port = "443"
|
||||
} else if parsed.Scheme == "http" {
|
||||
port = "80"
|
||||
}
|
||||
}
|
||||
|
||||
if trailingSlash {
|
||||
parsed.Path = strings.TrimSuffix(parsed.Path, "/")
|
||||
}
|
||||
|
||||
return map[string]interface{}{
|
||||
"BaseURL": parsed.String(),
|
||||
"Domain": domain,
|
||||
"Hostname": parsed.Host,
|
||||
"Path": parsed.EscapedPath(),
|
||||
"Port": port,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,38 @@ func TestBaseURLWithTemplatePrefs(t *testing.T) {
|
|||
require.Equal(t, "{{BaseURL}}/newpath", data, "could not get correct data")
|
||||
}
|
||||
|
||||
func TestVariables(t *testing.T) {
|
||||
baseURL := "http://localhost:9001/test/123"
|
||||
parsed, _ := url.Parse(baseURL)
|
||||
values := generateVariables(parsed, true)
|
||||
|
||||
require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")
|
||||
require.Equal(t, values["Domain"], "localhost", "incorrect domain name")
|
||||
require.Equal(t, values["Path"], "/test/123", "incorrect path")
|
||||
require.Equal(t, values["Port"], "9001", "incorrect port number")
|
||||
require.Equal(t, values["Hostname"], "localhost:9001", "incorrect hostname")
|
||||
|
||||
baseURL = "https://example.com"
|
||||
parsed, _ = url.Parse(baseURL)
|
||||
values = generateVariables(parsed, false)
|
||||
|
||||
require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")
|
||||
require.Equal(t, values["Domain"], "example.com", "incorrect domain name")
|
||||
require.Equal(t, values["Path"], "", "incorrect path")
|
||||
require.Equal(t, values["Port"], "443", "incorrect port number")
|
||||
require.Equal(t, values["Hostname"], "example.com", "incorrect hostname")
|
||||
|
||||
baseURL = "ftp://foobar.com/"
|
||||
parsed, _ = url.Parse(baseURL)
|
||||
values = generateVariables(parsed, true)
|
||||
|
||||
require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")
|
||||
require.Equal(t, values["Domain"], "foobar.com", "incorrect domain name")
|
||||
require.Equal(t, values["Path"], "", "incorrect path")
|
||||
require.Equal(t, values["Port"], "", "incorrect port number") // Unsupported protocol results in a blank port
|
||||
require.Equal(t, values["Hostname"], "foobar.com", "incorrect hostname")
|
||||
}
|
||||
|
||||
func TestMakeRequestFromModal(t *testing.T) {
|
||||
options := testutils.DefaultOptions
|
||||
|
||||
|
|
Loading…
Reference in New Issue