Skip to content

Commit bc37a26

Browse files
Merge pull request projectdiscovery#7043 from projectdiscovery/dwisiswant0/fix/http/isolate-project-cache-keys-by-scheme-host
fix(http): isolate project cache keys by scheme & host
2 parents 979c867 + 50996a7 commit bc37a26

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

pkg/protocols/http/request.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -691,9 +691,10 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
691691
}
692692

693693
var (
694-
resp *http.Response
695-
fromCache bool
696-
dumpedRequest []byte
694+
resp *http.Response
695+
fromCache bool
696+
dumpedRequest []byte
697+
projectCacheKey []byte
697698
)
698699

699700
// Dump request for variables checks
@@ -731,6 +732,11 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
731732
if dumpError != nil {
732733
return dumpError
733734
}
735+
if generatedRequest.request != nil && generatedRequest.request.URL != nil {
736+
projectCacheKey = getHTTPProjectCacheScope(dumpedRequest, generatedRequest.request.Scheme, generatedRequest.request.URL.Host)
737+
} else {
738+
projectCacheKey = dumpedRequest
739+
}
734740
dumpedRequestString := string(dumpedRequest)
735741

736742
if ignoreList := GetVariablesNamesSkipList(generatedRequest.original.Signature.Value); ignoreList != nil {
@@ -815,7 +821,7 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
815821
if request.options.ProjectFile != nil {
816822
// if unavailable fail silently
817823
fromCache = true
818-
resp, err = request.options.ProjectFile.Get(dumpedRequest)
824+
resp, err = request.options.ProjectFile.Get(projectCacheKey)
819825
if err != nil {
820826
fromCache = false
821827
}
@@ -965,7 +971,7 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
965971
onceFunc := sync.OnceFunc(func() {
966972
// if nuclei-project is enabled store the response if not previously done
967973
if request.options.ProjectFile != nil && !fromCache {
968-
if err := request.options.ProjectFile.Set(dumpedRequest, resp, respChain.BodyBytes()); err != nil {
974+
if err := request.options.ProjectFile.Set(projectCacheKey, resp, respChain.BodyBytes()); err != nil {
969975
errx = errors.Wrap(err, "could not store in project file")
970976
}
971977
}

pkg/protocols/http/utils.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package http
22

33
import (
4+
"bytes"
45
"io"
56
"strings"
67

@@ -26,3 +27,20 @@ func dump(req *generatedRequest, reqURL string) ([]byte, error) {
2627
}
2728
return bin, nil
2829
}
30+
31+
func getHTTPProjectCacheScope(requestDump []byte, scheme, host string) []byte {
32+
scheme = strings.ToLower(strings.TrimSpace(scheme))
33+
host = strings.ToLower(strings.TrimSpace(host))
34+
if scheme == "" || host == "" {
35+
return requestDump
36+
}
37+
38+
var scoped bytes.Buffer
39+
scoped.Grow(len(scheme) + len(host) + len(requestDump) + 4)
40+
_, _ = scoped.WriteString(scheme)
41+
_, _ = scoped.WriteString("://")
42+
_, _ = scoped.WriteString(host)
43+
_, _ = scoped.WriteString("\n")
44+
_, _ = scoped.Write(requestDump)
45+
return scoped.Bytes()
46+
}

pkg/protocols/http/utils_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package http
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestGetHTTPProjectCacheScope_SeparatesSchemeAndPort(t *testing.T) {
11+
requestDump := []byte("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
12+
13+
httpScoped := getHTTPProjectCacheScope(requestDump, "http", "example.com:80")
14+
httpsScoped := getHTTPProjectCacheScope(requestDump, "https", "example.com:443")
15+
16+
require.NotEqual(t, httpScoped, httpsScoped)
17+
require.True(t, bytes.HasSuffix(httpScoped, requestDump))
18+
require.True(t, bytes.HasSuffix(httpsScoped, requestDump))
19+
}

0 commit comments

Comments
 (0)