+
FFUF Report
+{{ .CommandLine }}
+ {{ .Time }}
+
+ | Status | +Input | +Position | +Length | +Words | +
|---|---|---|---|---|
| {{ .StatusCode }} | {{ .Input }} | {{ .Position }} | {{ .ContentLength }} | {{ .ContentWords }} |
+
diff --git a/README.md b/README.md index 04baf82..38b5f6d 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,11 @@ Heavily inspired by the great projects [gobuster](https://github.com/OJ/gobuster ## Features - - Fast! - - Allows fuzzing of HTTP header values, HTTP method, POST data, and different parts of URL, including GET parameter names and values - - Silent mode (`-s`) for clean output that's easy to use in pipes to other processes. - - Modularized architecture that allows integration with existing toolchains with reasonable effort - - Easy-to-add filters and matchers (they are interoperable) +- Fast! +- Allows fuzzing of HTTP header values, POST data, and different parts of URL, including GET parameter names and values +- Silent mode (`-s`) for clean output that's easy to use in pipes to other processes. +- Modularized architecture that allows integration with existing toolchains with reasonable effort +- Easy-to-add filters and matchers (they are interoperable) ## Example cases @@ -193,6 +193,8 @@ The only dependency of ffuf is Go 1.11. No dependencies outside of Go standard l - Changed - New CLI flag: -i, dummy flag that does nothing. for compatibility with copy as curl. - New CLI flag: -b/--cookie, cookie data for compatibility with copy as curl. + - New Output format are available: HTML and Markdown table. + - New CLI flag: -l, shows target location of redirect responses - Filtering and matching by status code, response size or word count now allow using ranges in addition to single values - The internal logging information to be discarded, and can be written to a file with the new `-debug-log` flag. diff --git a/main.go b/main.go index 9971fa4..5d4f5ae 100644 --- a/main.go +++ b/main.go @@ -85,7 +85,7 @@ func main() { flag.StringVar(&opts.proxyURL, "x", "", "HTTP Proxy URL") flag.StringVar(&conf.Method, "X", "GET", "HTTP method to use") flag.StringVar(&conf.OutputFile, "o", "", "Write output to file") - flag.StringVar(&opts.outputFormat, "of", "json", "Output file format. Available formats: json, csv, ecsv") + flag.StringVar(&opts.outputFormat, "of", "json", "Output file format. Available formats: json, html, md, csv, ecsv") flag.BoolVar(&conf.ShowRedirectLocation, "l", false, "Show target location of redirect responses") flag.BoolVar(&conf.Quiet, "s", false, "Do not print additional information (silent mode)") flag.BoolVar(&conf.StopOn403, "sf", false, "Stop when > 95% of responses return 403 Forbidden") @@ -290,7 +290,7 @@ func prepareConfig(parseOpts *cliOptions, conf *ffuf.Config) error { //Check the output file format option if conf.OutputFile != "" { //No need to check / error out if output file isn't defined - outputFormats := []string{"json", "csv", "ecsv"} + outputFormats := []string{"json", "html", "md", "csv", "ecsv"} found := false for _, f := range outputFormats { if f == parseOpts.outputFormat { diff --git a/pkg/output/file_html.go b/pkg/output/file_html.go new file mode 100644 index 0000000..9df0a5e --- /dev/null +++ b/pkg/output/file_html.go @@ -0,0 +1,161 @@ +package output + +import ( + "html/template" + "os" + "time" + + "github.com/ffuf/ffuf/pkg/ffuf" +) + +type htmlFileOutput struct { + CommandLine string + Time string + Results []Result +} + +const ( + htmlTemplate = ` + + +
+ + +{{ .CommandLine }}
+ {{ .Time }}
+
+ | Status | +Input | +Position | +Length | +Words | +
|---|---|---|---|---|
| {{ .StatusCode }} | {{ .Input }} | {{ .Position }} | {{ .ContentLength }} | {{ .ContentWords }} |