Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/protocols/network/request_test.go
2070 views
1
package network
2
3
import (
4
"context"
5
"encoding/hex"
6
"fmt"
7
"net/http"
8
"net/http/httptest"
9
"net/url"
10
"testing"
11
12
"github.com/stretchr/testify/require"
13
14
"github.com/projectdiscovery/nuclei/v3/pkg/model"
15
"github.com/projectdiscovery/nuclei/v3/pkg/model/types/severity"
16
"github.com/projectdiscovery/nuclei/v3/pkg/operators"
17
"github.com/projectdiscovery/nuclei/v3/pkg/operators/extractors"
18
"github.com/projectdiscovery/nuclei/v3/pkg/operators/matchers"
19
"github.com/projectdiscovery/nuclei/v3/pkg/output"
20
"github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/contextargs"
21
"github.com/projectdiscovery/nuclei/v3/pkg/testutils"
22
)
23
24
func TestNetworkExecuteWithResults(t *testing.T) {
25
options := testutils.DefaultOptions
26
27
testutils.Init(options)
28
templateID := "testing-network"
29
request := &Request{
30
ID: templateID,
31
Address: []string{"{{Hostname}}:"},
32
ReadSize: 2048,
33
Inputs: []*Input{},
34
Operators: operators.Operators{
35
Matchers: []*matchers.Matcher{{
36
Name: "test",
37
Part: "data",
38
Type: matchers.MatcherTypeHolder{MatcherType: matchers.WordsMatcher},
39
Words: []string{"200 OK"},
40
}},
41
Extractors: []*extractors.Extractor{{
42
Part: "data",
43
Type: extractors.ExtractorTypeHolder{ExtractorType: extractors.RegexExtractor},
44
Regex: []string{"<h1>.*</h1>"},
45
}},
46
},
47
}
48
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
49
_, _ = w.Write([]byte(exampleBody))
50
}))
51
defer ts.Close()
52
53
parsed, err := url.Parse(ts.URL)
54
require.Nil(t, err, "could not parse url")
55
request.Address[0] = "{{Hostname}}"
56
57
request.Inputs = append(request.Inputs, &Input{Data: fmt.Sprintf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", parsed.Host)})
58
executerOpts := testutils.NewMockExecuterOptions(options, &testutils.TemplateInfo{
59
ID: templateID,
60
Info: model.Info{SeverityHolder: severity.Holder{Severity: severity.Low}, Name: "test"},
61
})
62
err = request.Compile(executerOpts)
63
require.Nil(t, err, "could not compile network request")
64
65
var finalEvent *output.InternalWrappedEvent
66
t.Run("domain-valid", func(t *testing.T) {
67
metadata := make(output.InternalEvent)
68
previous := make(output.InternalEvent)
69
ctxArgs := contextargs.NewWithInput(context.Background(), parsed.Host)
70
err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) {
71
finalEvent = event
72
})
73
require.Nil(t, err, "could not execute network request")
74
})
75
require.NotNil(t, finalEvent, "could not get event output from request")
76
require.Equal(t, 1, len(finalEvent.Results), "could not get correct number of results")
77
require.Equal(t, "test", finalEvent.Results[0].MatcherName, "could not get correct matcher name of results")
78
require.Equal(t, 1, len(finalEvent.Results[0].ExtractedResults), "could not get correct number of extracted results")
79
require.Equal(t, "<h1>Example Domain</h1>", finalEvent.Results[0].ExtractedResults[0], "could not get correct extracted results")
80
finalEvent = nil
81
82
t.Run("invalid-port-override", func(t *testing.T) {
83
metadata := make(output.InternalEvent)
84
previous := make(output.InternalEvent)
85
ctxArgs := contextargs.NewWithInput(context.Background(), "127.0.0.1:11211")
86
err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) {
87
finalEvent = event
88
})
89
require.NotNil(t, err, "could not execute network request")
90
})
91
require.Nil(t, finalEvent.Results, "could not get event output from request")
92
93
request.Inputs[0].Type = NetworkInputTypeHolder{NetworkInputType: hexType}
94
request.Inputs[0].Data = hex.EncodeToString([]byte(fmt.Sprintf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", parsed.Host)))
95
96
t.Run("hex-to-string", func(t *testing.T) {
97
metadata := make(output.InternalEvent)
98
previous := make(output.InternalEvent)
99
ctxArgs := contextargs.NewWithInput(context.Background(), parsed.Host)
100
err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) {
101
finalEvent = event
102
})
103
require.Nil(t, err, "could not execute network request")
104
})
105
require.NotNil(t, finalEvent, "could not get event output from request")
106
require.Equal(t, 1, len(finalEvent.Results), "could not get correct number of results")
107
require.Equal(t, "test", finalEvent.Results[0].MatcherName, "could not get correct matcher name of results")
108
require.Equal(t, 1, len(finalEvent.Results[0].ExtractedResults), "could not get correct number of extracted results")
109
require.Equal(t, "<h1>Example Domain</h1>", finalEvent.Results[0].ExtractedResults[0], "could not get correct extracted results")
110
}
111
112
var exampleBody = `<!doctype html>
113
<html>
114
<head>
115
<title>Example Domain</title>
116
117
<meta charset="utf-8" />
118
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
119
<meta name="viewport" content="width=device-width, initial-scale=1" />
120
<style type="text/css">
121
body {
122
background-color: #f0f0f2;
123
margin: 0;
124
padding: 0;
125
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
126
127
}
128
div {
129
width: 600px;
130
margin: 5em auto;
131
padding: 2em;
132
background-color: #fdfdff;
133
border-radius: 0.5em;
134
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
135
}
136
a:link, a:visited {
137
color: #38488f;
138
text-decoration: none;
139
}
140
@media (max-width: 700px) {
141
div {
142
margin: 0 auto;
143
width: auto;
144
}
145
}
146
</style>
147
</head>
148
149
<body>
150
<div>
151
<h1>Example Domain</h1>
152
<p>This domain is for use in illustrative examples in documents. You may use this
153
domain in literature without prior coordination or asking for permission.</p>
154
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
155
</div>
156
</body>
157
</html>
158
`
159
160