Skip to content

Commit 9f4b89a

Browse files
committed
feat: misc review changes
1 parent 1d2a1dc commit 9f4b89a

File tree

14 files changed

+75
-40
lines changed

14 files changed

+75
-40
lines changed

cmd/nuclei/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ on extensive configurability, massive extensibility and ease of use.`)
368368
flagSet.BoolVar(&fuzzFlag, "fuzz", false, "enable loading fuzzing templates (Deprecated: use -dast instead)"),
369369
flagSet.BoolVar(&options.DAST, "dast", false, "enable / run dast (fuzz) nuclei templates"),
370370
flagSet.BoolVarP(&options.DASTServer, "dast-server", "dts", false, "enable dast server mode (live fuzzing)"),
371-
flagSet.BoolVarP(&options.DASTReport, "dast-report", "drg", false, "write dast scan report to file"),
371+
flagSet.BoolVarP(&options.DASTReport, "dast-report", "dtr", false, "write dast scan report to file"),
372372
flagSet.StringVarP(&options.DASTServerToken, "dast-server-token", "dtst", "", "dast server token (optional)"),
373373
flagSet.StringVarP(&options.DASTServerAddress, "dast-server-address", "dtsa", "localhost:9055", "dast server address"),
374374
flagSet.BoolVarP(&options.DisplayFuzzPoints, "display-fuzz-points", "dfp", false, "display fuzz points in the output for debugging"),

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,8 +864,6 @@ github.com/projectdiscovery/clistats v0.1.1 h1:8mwbdbwTU4aT88TJvwIzTpiNeow3XnAB7
864864
github.com/projectdiscovery/clistats v0.1.1/go.mod h1:4LtTC9Oy//RiuT1+76MfTg8Hqs7FQp1JIGBM3nHK6a0=
865865
github.com/projectdiscovery/dsl v0.3.3 h1:4Ij5S86cHlb6xFrS7+5zAiJPeBt5h970XBTHqeTkpyU=
866866
github.com/projectdiscovery/dsl v0.3.3/go.mod h1:DAjSeaogLM9f0Ves2zDc/vbJrfcv+kEmS51p0dLLaPI=
867-
github.com/projectdiscovery/fastdialer v0.2.11 h1:DTx2vJ3tytv34wDe+Oh72L7v9pZWhzNGFJgwheN0n1Q=
868-
github.com/projectdiscovery/fastdialer v0.2.11/go.mod h1:jjDMLl+hnKoSSP82eWPxn8U+KivlWqf/o3pSz4n4dik=
869867
github.com/projectdiscovery/fastdialer v0.2.13 h1:5XzSv0hwITzRAMwyoJ9GFZSTVtaI4jmwER968TbDLbI=
870868
github.com/projectdiscovery/fastdialer v0.2.13/go.mod h1:T1EaYHbWmCnVHSYz12nAjnHMNFEfGMLLw37cb0k1X3A=
871869
github.com/projectdiscovery/fasttemplate v0.0.2 h1:h2cISk5xDhlJEinlBQS6RRx0vOlOirB2y3Yu4PJzpiA=

internal/runner/options.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ func ValidateOptions(options *types.Options) error {
171171
if options.Validate {
172172
validateTemplatePaths(config.DefaultConfig.TemplatesDirectory, options.Templates, options.Workflows)
173173
}
174+
if options.DAST {
175+
if err := validateDASTOptions(options); err != nil {
176+
return err
177+
}
178+
}
174179

175180
// Verify if any of the client certificate options were set since it requires all three to work properly
176181
if options.HasClientCertificates() {
@@ -274,6 +279,14 @@ func validateMissingGitLabOptions(options *types.Options) []string {
274279
return missing
275280
}
276281

282+
func validateDASTOptions(options *types.Options) error {
283+
// Ensure the DAST server token meets minimum length requirement
284+
if len(options.DASTServerToken) > 0 && len(options.DASTServerToken) < 16 {
285+
return fmt.Errorf("DAST server token must be at least 16 characters long")
286+
}
287+
return nil
288+
}
289+
277290
func createReportingOptions(options *types.Options) (*reporting.Options, error) {
278291
var reportingOptions = &reporting.Options{}
279292
if options.ReportingConfig != "" {

internal/runner/runner.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ func New(options *types.Options) (*Runner, error) {
305305
return nil, errors.Wrap(err, "could not create output file")
306306
}
307307
if runner.fuzzStats != nil {
308-
outputWriter.RequestHook = func(request *output.JSONLogRequest) {
308+
outputWriter.JSONLogRequestHook = func(request *output.JSONLogRequest) {
309309
if request.Error == "none" || request.Error == "" {
310310
return
311311
}
@@ -687,9 +687,11 @@ func (r *Runner) RunEnumeration() error {
687687
}, "")
688688

689689
if r.dastServer != nil {
690-
if err := r.dastServer.Start(); err != nil {
691-
r.dastServer.Start()
692-
}
690+
go func() {
691+
if err := r.dastServer.Start(); err != nil {
692+
gologger.Error().Msgf("could not start dast server: %v", err)
693+
}
694+
}()
693695
}
694696

695697
enumeration := false

internal/server/nuclei_sdk.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func newNucleiExecutor(opts *NucleiExecutorOptions) (*nucleiExecutor, error) {
121121
}
122122
store, err := loader.New(loaderConfig)
123123
if err != nil {
124-
return nil, errors.Wrap(err, "Could not create loadeopts.")
124+
return nil, errors.Wrap(err, "Could not create loader options.")
125125
}
126126
store.Load()
127127

@@ -143,7 +143,7 @@ type proxifyRequest struct {
143143
} `json:"request"`
144144
}
145145

146-
func (n *nucleiExecutor) ExecuteScan(target PostReuestsHandlerRequest) error {
146+
func (n *nucleiExecutor) ExecuteScan(target PostRequestsHandlerRequest) error {
147147
finalTemplates := []*templates.Template{}
148148
finalTemplates = append(finalTemplates, n.store.Templates()...)
149149
finalTemplates = append(finalTemplates, n.store.Workflows()...)
@@ -178,6 +178,9 @@ func (n *nucleiExecutor) ExecuteScan(target PostReuestsHandlerRequest) error {
178178
if err != nil {
179179
return errors.Wrap(err, "could not create input provider")
180180
}
181+
182+
// We don't care about the result as its a boolean
183+
// stating whether we got matches or not
181184
_ = n.engine.ExecuteScanWithOpts(context.Background(), finalTemplates, inputProvider, true)
182185
return nil
183186
}

internal/server/requests_worker.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"github.com/projectdiscovery/nuclei/v3/pkg/input/types"
99
)
1010

11-
func (s *DASTServer) consumeTaskRequest(req PostReuestsHandlerRequest) {
11+
func (s *DASTServer) consumeTaskRequest(req PostRequestsHandlerRequest) {
1212
defer s.endpointsInQueue.Add(-1)
1313

1414
parsedReq, err := types.ParseRawRequestWithURL(req.RawHTTP, req.URL)
@@ -29,7 +29,7 @@ func (s *DASTServer) consumeTaskRequest(req PostReuestsHandlerRequest) {
2929
return
3030
}
3131

32-
inScope, err := s.scopeManager.Validate(parsedReq.URL.URL, "")
32+
inScope, err := s.scopeManager.Validate(parsedReq.URL.URL)
3333
if err != nil {
3434
gologger.Warning().Msgf("Could not validate scope: %s\n", err)
3535
return

internal/server/scope/scope.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func NewManager(inScope, outOfScope []string) (*Manager, error) {
3939
}
4040

4141
// Validate returns true if the URL matches scope rules
42-
func (m *Manager) Validate(URL *url.URL, rootHostname string) (bool, error) {
42+
func (m *Manager) Validate(URL *url.URL) (bool, error) {
4343
if m.noScope {
4444
return true, nil
4545
}

internal/server/scope/scope_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ func TestManagerValidate(t *testing.T) {
1313
require.NoError(t, err, "could not create scope manager")
1414

1515
parsed, _ := urlutil.Parse("https://test.com/index.php/example")
16-
validated, err := manager.Validate(parsed.URL, "test.com")
16+
validated, err := manager.Validate(parsed.URL)
1717
require.NoError(t, err, "could not validate url")
1818
require.True(t, validated, "could not get correct in-scope validation")
1919

2020
parsed, _ = urlutil.Parse("https://test.com/logout.php")
21-
validated, err = manager.Validate(parsed.URL, "another.com")
21+
validated, err = manager.Validate(parsed.URL)
2222
require.NoError(t, err, "could not validate url")
2323
require.False(t, validated, "could not get correct out-scope validation")
2424
})

internal/server/server.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"html/template"
77
"net/http"
8+
"net/url"
89
"strings"
910
"sync/atomic"
1011
"time"
@@ -103,8 +104,8 @@ func New(options *Options) (*DASTServer, error) {
103104
builder.WriteString(" (with token)")
104105
}
105106
gologger.Info().Msgf("%s", builder.String())
106-
gologger.Info().Msgf("Connection URL: %s", server.buildConnectionURL())
107-
gologger.Info().Msgf("Stats UI URL: %s", server.buildStatsURL())
107+
gologger.Info().Msgf("Connection URL: %s", server.buildURL("/requests"))
108+
gologger.Info().Msgf("Stats UI URL: %s", server.buildURL("/stats"))
108109

109110
return server, nil
110111
}
@@ -118,7 +119,7 @@ func NewStatsServer(fuzzStatsDB *stats.Tracker) (*DASTServer, error) {
118119
},
119120
}
120121
server.setupHandlers(true)
121-
gologger.Info().Msgf("Stats UI URL: %s", server.buildStatsURL())
122+
gologger.Info().Msgf("Stats UI URL: %s", server.buildURL("/stats"))
122123

123124
return server, nil
124125
}
@@ -129,20 +130,20 @@ func (s *DASTServer) Close() {
129130
s.tasksPool.StopAndWaitFor(1 * time.Minute)
130131
}
131132

132-
func (s *DASTServer) buildConnectionURL() string {
133-
url := fmt.Sprintf("http://%s/requests", s.options.Address)
133+
func (s *DASTServer) buildURL(endpoint string) string {
134+
values := make(url.Values)
134135
if s.options.Token != "" {
135-
url += "?token=" + s.options.Token
136+
values.Set("token", s.options.Token)
136137
}
137-
return url
138-
}
139138

140-
func (s *DASTServer) buildStatsURL() string {
141-
url := fmt.Sprintf("http://%s/stats", s.options.Address)
142-
if s.options.Token != "" {
143-
url += "?token=" + s.options.Token
139+
// Use url.URL struct to safely construct the URL
140+
u := &url.URL{
141+
Scheme: "http",
142+
Host: s.options.Address,
143+
Path: endpoint,
144+
RawQuery: values.Encode(),
144145
}
145-
return url
146+
return u.String()
146147
}
147148

148149
func (s *DASTServer) setupHandlers(onlyStats bool) {
@@ -186,13 +187,13 @@ func (s *DASTServer) Start() error {
186187
}
187188

188189
// PostReuestsHandlerRequest is the request body for the /requests POST handler.
189-
type PostReuestsHandlerRequest struct {
190+
type PostRequestsHandlerRequest struct {
190191
RawHTTP string `json:"raw_http"`
191192
URL string `json:"url"`
192193
}
193194

194195
func (s *DASTServer) handleRequest(c echo.Context) error {
195-
var req PostReuestsHandlerRequest
196+
var req PostRequestsHandlerRequest
196197
if err := c.Bind(&req); err != nil {
197198
fmt.Printf("Error binding request: %s\n", err)
198199
return err
@@ -246,7 +247,7 @@ func (s *DASTServer) getStats() (StatsResponse, error) {
246247
DASTServerInfo: DASTServerInfo{
247248
NucleiVersion: config.Version,
248249
NucleiTemplateVersion: cfg.TemplateVersion,
249-
NucleiDastServerAPI: s.buildConnectionURL(),
250+
NucleiDastServerAPI: s.buildURL("/requests"),
250251
ServerAuthEnabled: s.options.Token != "",
251252
},
252253
DASTScanStartTime: s.startTime,

internal/server/templates/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta charset="UTF-8">
55
<title>DAST Scan Report</title>
6-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
6+
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.11.3/font/bootstrap-icons.css" integrity="sha512-ywmPbuxGS4cJ7GxwCX+bCJweeext047ZYU2HP52WWKbpJnF4/Zzfr2Bo19J4CWPXZmleVusQ9d//RB5bq0RP7w==" crossorigin="anonymous" referrerpolicy="no-referrer" />
77
<style>
88
@import url('https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500&display=swap');
99

0 commit comments

Comments
 (0)