diff --git a/cli/cmd/dir.go b/cli/cmd/dir.go index df6a4e3c..4b562be3 100644 --- a/cli/cmd/dir.go +++ b/cli/cmd/dir.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "log" + "strings" "github.com/OJ/gobuster/v3/cli" "github.com/OJ/gobuster/v3/gobusterdir" @@ -77,6 +78,18 @@ func parseDirOptions() (*libgobuster.Options, *gobusterdir.OptionsDir, error) { return nil, nil, fmt.Errorf("invalid value for status-codes-blacklist: %w", err) } + plugin.QueryString, err = cmdDir.Flags().GetString("query") + if err != nil { + return nil, nil, fmt.Errorf("invalid query string") + } + if plugin.QueryString != "" { + if strings.HasSuffix(plugin.URL, "/") { + plugin.URL = plugin.URL + "?" + plugin.QueryString + } else { + plugin.URL = plugin.URL + "?" + plugin.QueryString + } + } + // blacklist will override the normal status codes if plugin.StatusCodesBlacklist != "" { ret, err := helper.ParseCommaSeparatedInt(plugin.StatusCodesBlacklist) @@ -155,7 +168,7 @@ func init() { cmdDir.Flags().Bool("wildcard", false, "Force continued operation when wildcard found") cmdDir.Flags().BoolP("discover-backup", "d", false, "Upon finding a file search for backup files") cmdDir.Flags().IntSlice("exclude-length", []int{}, "exclude the following content length (completely ignores the status). Supply multiple times to exclude multiple sizes.") - + cmdDir.Flags().StringP("query", "Q", "", "Specify a query string to be added to the end of each request") cmdDir.PersistentPreRun = func(cmd *cobra.Command, args []string) { configureGlobalOptions() } diff --git a/gobusterdir/gobusterdir.go b/gobusterdir/gobusterdir.go index 49277111..803fbebc 100644 --- a/gobusterdir/gobusterdir.go +++ b/gobusterdir/gobusterdir.go @@ -5,6 +5,7 @@ import ( "bytes" "context" "fmt" + "net/http" "strings" "text/tabwriter" @@ -108,6 +109,14 @@ func (d *GobusterDir) RequestsPerRun() int { // PreRun is the pre run implementation of gobusterdir func (d *GobusterDir) PreRun() error { // add trailing slash + if strings.Contains(d.options.URL, "?") { + resp, err := http.Get(d.options.URL) + if err != nil { + fmt.Printf(err.Error()) + } + finalURL := resp.Request.URL.String() + d.options.URL = finalURL + } if !strings.HasSuffix(d.options.URL, "/") { d.options.URL = fmt.Sprintf("%s/", d.options.URL) } diff --git a/gobusterdir/options.go b/gobusterdir/options.go index 67dd796d..372a9ec0 100644 --- a/gobusterdir/options.go +++ b/gobusterdir/options.go @@ -12,6 +12,7 @@ type OptionsDir struct { StatusCodes string StatusCodesParsed libgobuster.IntSet StatusCodesBlacklist string + QueryString string StatusCodesBlacklistParsed libgobuster.IntSet UseSlash bool WildcardForced bool