From 79dd0549cd2438dc75017663411108e4a60a2d27 Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Sun, 2 May 2021 20:10:49 +0200 Subject: [PATCH 1/3] Better host header handling in RFC comliant requests --- v2/pkg/protocols/http/build_request.go | 9 +++++++++ v2/pkg/protocols/http/raw/raw.go | 16 ++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/v2/pkg/protocols/http/build_request.go b/v2/pkg/protocols/http/build_request.go index c372a6fea..a91af832a 100644 --- a/v2/pkg/protocols/http/build_request.go +++ b/v2/pkg/protocols/http/build_request.go @@ -158,6 +158,9 @@ func (r *requestGenerator) handleRawWithPayloads(ctx context.Context, rawRequest continue } req.Header[key] = []string{value} + if key == "Host" { + req.Host = value + } } request, err := r.fillRequest(req, values) if err != nil { @@ -172,6 +175,9 @@ func (r *requestGenerator) fillRequest(req *http.Request, values map[string]inte // Set the header values requested for header, value := range r.request.Headers { req.Header[header] = []string{replacer.Replace(value, values)} + if header == "Host" { + req.Host = replacer.Replace(value, values) + } } // In case of multiple threads the underlying connection should remain open to allow reuse @@ -198,4 +204,7 @@ func setHeader(req *http.Request, name, value string) { if _, ok := req.Header[name]; !ok { req.Header.Set(name, value) } + if name == "Host" { + req.Host = value + } } diff --git a/v2/pkg/protocols/http/raw/raw.go b/v2/pkg/protocols/http/raw/raw.go index 79f88457a..ea23db738 100644 --- a/v2/pkg/protocols/http/raw/raw.go +++ b/v2/pkg/protocols/http/raw/raw.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "io/ioutil" - "net" "net/url" "strings" @@ -100,20 +99,11 @@ func Parse(request, baseURL string, unsafe bool) (*Request, error) { rawRequest.Path = parts[1] } - // If raw request doesn't have a Host header and/ path, - // this will be generated from the parsed baseURL parsedURL, err := url.Parse(baseURL) if err != nil { return nil, fmt.Errorf("could not parse request URL: %s", err) } - - templateHost := rawRequest.Headers["Host"] hostURL := parsedURL.Host - - if strings.Contains(templateHost, ":") { - _, templatePort, _ := net.SplitHostPort(templateHost) - hostURL = net.JoinHostPort(parsedURL.Hostname(), templatePort) - } if strings.HasSuffix(parsedURL.Path, "/") && strings.HasPrefix(rawRequest.Path, "/") { parsedURL.Path = strings.TrimSuffix(parsedURL.Path, "/") } @@ -123,6 +113,12 @@ func Parse(request, baseURL string, unsafe bool) (*Request, error) { } rawRequest.FullURL = fmt.Sprintf("%s://%s%s", parsedURL.Scheme, strings.TrimSpace(hostURL), rawRequest.Path) + // If raw request doesn't have a Host header + // this will be generated from the parsed baseURL + if rawRequest.Headers["Host"] == "" { + rawRequest.Headers["Host"] = hostURL + } + // Set the request body b, err := ioutil.ReadAll(reader) if err != nil { From f064104bdef68873d0e1204e4dadfbffe92b5a79 Mon Sep 17 00:00:00 2001 From: Ice3man543 Date: Mon, 3 May 2021 17:21:30 +0530 Subject: [PATCH 2/3] Fixed tests --- v2/pkg/protocols/http/raw/raw_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/v2/pkg/protocols/http/raw/raw_test.go b/v2/pkg/protocols/http/raw/raw_test.go index 1f3c3c2d9..540fb0178 100644 --- a/v2/pkg/protocols/http/raw/raw_test.go +++ b/v2/pkg/protocols/http/raw/raw_test.go @@ -15,7 +15,7 @@ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 ( Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Language: en-US,en;q=0.9`, "https://example.com:8080", false) require.Nil(t, err, "could not parse GET request") - require.Equal(t, "https://example.com:123/gg/phpinfo.php", request.FullURL, "Could not parse request url correctly") + require.Equal(t, "https://example.com:8080/gg/phpinfo.php", request.FullURL, "Could not parse request url correctly") require.Equal(t, "/gg/phpinfo.php", request.Path, "Could not parse request path correctly") t.Run("path-suffix", func(t *testing.T) { @@ -29,17 +29,17 @@ Host: {{Hostname}}`, "https://example.com:8080/test", false) request, err := Parse(`GET ?username=test&password=test HTTP/1.1 Host: {{Hostname}}:123`, "https://example.com:8080/test", false) require.Nil(t, err, "could not parse GET request") - require.Equal(t, "https://example.com:123/test?username=test&password=test", request.FullURL, "Could not parse request url correctly") + require.Equal(t, "https://example.com:8080/test?username=test&password=test", request.FullURL, "Could not parse request url correctly") request, err = Parse(`GET ?username=test&password=test HTTP/1.1 Host: {{Hostname}}:123`, "https://example.com:8080/test/", false) require.Nil(t, err, "could not parse GET request") - require.Equal(t, "https://example.com:123/test/?username=test&password=test", request.FullURL, "Could not parse request url correctly") + require.Equal(t, "https://example.com:8080/test/?username=test&password=test", request.FullURL, "Could not parse request url correctly") request, err = Parse(`GET /?username=test&password=test HTTP/1.1 Host: {{Hostname}}:123`, "https://example.com:8080/test/", false) require.Nil(t, err, "could not parse GET request") - require.Equal(t, "https://example.com:123/test/?username=test&password=test", request.FullURL, "Could not parse request url correctly") + require.Equal(t, "https://example.com:8080/test/?username=test&password=test", request.FullURL, "Could not parse request url correctly") }) } From 9012db5f79b67912965bcb5b4bd47f3b2a9ec455 Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Tue, 4 May 2021 14:36:04 +0200 Subject: [PATCH 3/3] Adding custom header preference over template definition --- v2/pkg/protocols/http/request.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/v2/pkg/protocols/http/request.go b/v2/pkg/protocols/http/request.go index efb772bae..97389f1d0 100644 --- a/v2/pkg/protocols/http/request.go +++ b/v2/pkg/protocols/http/request.go @@ -412,7 +412,11 @@ func (r *Request) setCustomHeaders(req *generatedRequest) { if req.rawRequest != nil { req.rawRequest.Headers[k] = v } else { - req.request.Header.Set(strings.TrimSpace(k), strings.TrimSpace(v)) + kk, vv := strings.TrimSpace(k), strings.TrimSpace(v) + req.request.Header.Set(kk, vv) + if kk == "Host" { + req.request.Host = vv + } } } }