Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/fuzz/component/path_test.go
2070 views
1
package component
2
3
import (
4
"net/http"
5
"testing"
6
7
"github.com/projectdiscovery/retryablehttp-go"
8
"github.com/stretchr/testify/require"
9
)
10
11
func TestURLComponent(t *testing.T) {
12
req, err := retryablehttp.NewRequest(http.MethodGet, "https://example.com/testpath", nil)
13
if err != nil {
14
t.Fatal(err)
15
}
16
17
urlComponent := NewPath()
18
_, err = urlComponent.Parse(req)
19
if err != nil {
20
t.Fatal(err)
21
}
22
23
var keys []string
24
var values []string
25
_ = urlComponent.Iterate(func(key string, value interface{}) error {
26
keys = append(keys, key)
27
values = append(values, value.(string))
28
return nil
29
})
30
31
require.Equal(t, []string{"1"}, keys, "unexpected keys")
32
require.Equal(t, []string{"testpath"}, values, "unexpected values")
33
34
err = urlComponent.SetValue("1", "newpath")
35
if err != nil {
36
t.Fatal(err)
37
}
38
39
rebuilt, err := urlComponent.Rebuild()
40
if err != nil {
41
t.Fatal(err)
42
}
43
require.Equal(t, "/newpath", rebuilt.Path, "unexpected URL path")
44
require.Equal(t, "https://example.com/newpath", rebuilt.String(), "unexpected full URL")
45
}
46
47
func TestURLComponent_NestedPaths(t *testing.T) {
48
path := NewPath()
49
req, err := retryablehttp.NewRequest(http.MethodGet, "https://example.com/user/753/profile", nil)
50
if err != nil {
51
t.Fatal(err)
52
}
53
found, err := path.Parse(req)
54
if err != nil {
55
t.Fatal(err)
56
}
57
if !found {
58
t.Fatal("expected path to be found")
59
}
60
61
isSet := false
62
63
_ = path.Iterate(func(key string, value interface{}) error {
64
t.Logf("Key: %s, Value: %s", key, value.(string))
65
if !isSet && value.(string) == "753" {
66
isSet = true
67
if setErr := path.SetValue(key, "753'"); setErr != nil {
68
t.Fatal(setErr)
69
}
70
}
71
return nil
72
})
73
74
newReq, err := path.Rebuild()
75
if err != nil {
76
t.Fatal(err)
77
}
78
if newReq.Path != "/user/753'/profile" {
79
t.Fatalf("expected path to be '/user/753'/profile', got '%s'", newReq.Path)
80
}
81
}
82
83
func TestPathComponent_SQLInjection(t *testing.T) {
84
path := NewPath()
85
req, err := retryablehttp.NewRequest(http.MethodGet, "https://example.com/user/55/profile", nil)
86
if err != nil {
87
t.Fatal(err)
88
}
89
found, err := path.Parse(req)
90
if err != nil {
91
t.Fatal(err)
92
}
93
if !found {
94
t.Fatal("expected path to be found")
95
}
96
97
t.Logf("Original path: %s", req.Path)
98
99
// Let's see what path segments are available for fuzzing
100
err = path.Iterate(func(key string, value interface{}) error {
101
t.Logf("Key: %s, Value: %s", key, value.(string))
102
103
// Try fuzzing the "55" segment specifically (which should be key "2")
104
if value.(string) == "55" {
105
if setErr := path.SetValue(key, "55 OR True"); setErr != nil {
106
t.Fatal(setErr)
107
}
108
}
109
return nil
110
})
111
if err != nil {
112
t.Fatal(err)
113
}
114
115
newReq, err := path.Rebuild()
116
if err != nil {
117
t.Fatal(err)
118
}
119
120
t.Logf("Modified path: %s", newReq.Path)
121
122
// Now with PathEncode, spaces are preserved correctly for SQL injection
123
if newReq.Path != "/user/55 OR True/profile" {
124
t.Fatalf("expected path to be '/user/55 OR True/profile', got '%s'", newReq.Path)
125
}
126
127
// Let's also test what the actual URL looks like
128
t.Logf("Full URL: %s", newReq.String())
129
}
130
131