Fixed an issue with storing the matches for recursion jobs (#437)
This commit is contained in:
parent
8ffe1bd64e
commit
25fc4e4b49
@ -3,6 +3,7 @@
|
|||||||
- New
|
- New
|
||||||
- Added a CLI flag to disable the interactive mode
|
- Added a CLI flag to disable the interactive mode
|
||||||
- Changed
|
- Changed
|
||||||
|
- Fixed an issue with storing the matches for recursion jobs
|
||||||
- Fixed the way the "size" is calculated, it should match content-length now
|
- Fixed the way the "size" is calculated, it should match content-length now
|
||||||
- Fixed an issue with header canonicalization when a keyword was just a part of the header name
|
- Fixed an issue with header canonicalization when a keyword was just a part of the header name
|
||||||
- Fixed output writing so it doesn't silently fail if it needs to create directories recursively
|
- Fixed output writing so it doesn't silently fail if it needs to create directories recursively
|
||||||
|
|||||||
@ -263,7 +263,7 @@ available commands:
|
|||||||
queueskip - advance to the next queued recursion job
|
queueskip - advance to the next queued recursion job
|
||||||
restart - restart and resume the current ffuf job
|
restart - restart and resume the current ffuf job
|
||||||
resume - resume current ffuf job (or: ENTER)
|
resume - resume current ffuf job (or: ENTER)
|
||||||
show - show results
|
show - show results for the current job
|
||||||
savejson [filename] - save current matches to a file
|
savejson [filename] - save current matches to a file
|
||||||
help - you are looking at it
|
help - you are looking at it
|
||||||
>
|
>
|
||||||
|
|||||||
@ -46,9 +46,10 @@ type OutputProvider interface {
|
|||||||
Result(resp Response)
|
Result(resp Response)
|
||||||
PrintResult(res Result)
|
PrintResult(res Result)
|
||||||
SaveFile(filename, format string) error
|
SaveFile(filename, format string) error
|
||||||
GetResults() []Result
|
GetCurrentResults() []Result
|
||||||
SetResults(results []Result)
|
SetCurrentResults(results []Result)
|
||||||
Reset()
|
Reset()
|
||||||
|
Cycle()
|
||||||
}
|
}
|
||||||
|
|
||||||
type Result struct {
|
type Result struct {
|
||||||
|
|||||||
@ -123,7 +123,7 @@ func (j *Job) Start() {
|
|||||||
j.interruptMonitor()
|
j.interruptMonitor()
|
||||||
for j.jobsInQueue() {
|
for j.jobsInQueue() {
|
||||||
j.prepareQueueJob()
|
j.prepareQueueJob()
|
||||||
j.Reset()
|
j.Reset(true)
|
||||||
j.RunningJob = true
|
j.RunningJob = true
|
||||||
j.startExecution()
|
j.startExecution()
|
||||||
}
|
}
|
||||||
@ -135,12 +135,16 @@ func (j *Job) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reset resets the counters and wordlist position for a job
|
// Reset resets the counters and wordlist position for a job
|
||||||
func (j *Job) Reset() {
|
func (j *Job) Reset(cycle bool) {
|
||||||
j.Input.Reset()
|
j.Input.Reset()
|
||||||
j.Counter = 0
|
j.Counter = 0
|
||||||
j.skipQueue = false
|
j.skipQueue = false
|
||||||
j.startTimeJob = time.Now()
|
j.startTimeJob = time.Now()
|
||||||
|
if cycle {
|
||||||
|
j.Output.Cycle()
|
||||||
|
} else {
|
||||||
j.Output.Reset()
|
j.Output.Reset()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *Job) jobsInQueue() bool {
|
func (j *Job) jobsInQueue() bool {
|
||||||
|
|||||||
@ -53,12 +53,12 @@ func (i *interactive) handleInput(in []byte) {
|
|||||||
i.paused = false
|
i.paused = false
|
||||||
i.Job.Resume()
|
i.Job.Resume()
|
||||||
case "restart":
|
case "restart":
|
||||||
i.Job.Reset()
|
i.Job.Reset(false)
|
||||||
i.paused = false
|
i.paused = false
|
||||||
i.Job.Output.Info("Restarting the current ffuf job!")
|
i.Job.Output.Info("Restarting the current ffuf job!")
|
||||||
i.Job.Resume()
|
i.Job.Resume()
|
||||||
case "show":
|
case "show":
|
||||||
for _, r := range i.Job.Output.GetResults() {
|
for _, r := range i.Job.Output.GetCurrentResults() {
|
||||||
i.Job.Output.PrintResult(r)
|
i.Job.Output.PrintResult(r)
|
||||||
}
|
}
|
||||||
case "savejson":
|
case "savejson":
|
||||||
@ -150,7 +150,7 @@ func (i *interactive) updateFilter(name, value string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
results := make([]ffuf.Result, 0)
|
results := make([]ffuf.Result, 0)
|
||||||
for _, res := range i.Job.Output.GetResults() {
|
for _, res := range i.Job.Output.GetCurrentResults() {
|
||||||
fakeResp := &ffuf.Response{
|
fakeResp := &ffuf.Response{
|
||||||
StatusCode: res.StatusCode,
|
StatusCode: res.StatusCode,
|
||||||
ContentLines: res.ContentLength,
|
ContentLines: res.ContentLength,
|
||||||
@ -162,7 +162,7 @@ func (i *interactive) updateFilter(name, value string) {
|
|||||||
results = append(results, res)
|
results = append(results, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i.Job.Output.SetResults(results)
|
i.Job.Output.SetCurrentResults(results)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ available commands:
|
|||||||
queueskip - advance to the next queued recursion job
|
queueskip - advance to the next queued recursion job
|
||||||
restart - restart and resume the current ffuf job
|
restart - restart and resume the current ffuf job
|
||||||
resume - resume current ffuf job (or: ENTER)
|
resume - resume current ffuf job (or: ENTER)
|
||||||
show - show results
|
show - show results for the current job
|
||||||
savejson [filename] - save current matches to a file
|
savejson [filename] - save current matches to a file
|
||||||
help - you are looking at it
|
help - you are looking at it
|
||||||
`
|
`
|
||||||
|
|||||||
@ -28,12 +28,14 @@ const (
|
|||||||
type Stdoutput struct {
|
type Stdoutput struct {
|
||||||
config *ffuf.Config
|
config *ffuf.Config
|
||||||
Results []ffuf.Result
|
Results []ffuf.Result
|
||||||
|
CurrentResults []ffuf.Result
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewStdoutput(conf *ffuf.Config) *Stdoutput {
|
func NewStdoutput(conf *ffuf.Config) *Stdoutput {
|
||||||
var outp Stdoutput
|
var outp Stdoutput
|
||||||
outp.config = conf
|
outp.config = conf
|
||||||
outp.Results = []ffuf.Result{}
|
outp.Results = make([]ffuf.Result, 0)
|
||||||
|
outp.CurrentResults = make([]ffuf.Result, 0)
|
||||||
return &outp
|
return &outp
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,17 +135,23 @@ func (s *Stdoutput) Banner() {
|
|||||||
|
|
||||||
// Reset resets the result slice
|
// Reset resets the result slice
|
||||||
func (s *Stdoutput) Reset() {
|
func (s *Stdoutput) Reset() {
|
||||||
s.Results = make([]ffuf.Result, 0)
|
s.CurrentResults = make([]ffuf.Result, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cycle moves the CurrentResults to Results and resets the results slice
|
||||||
|
func (s *Stdoutput) Cycle() {
|
||||||
|
s.Results = append(s.Results, s.CurrentResults...)
|
||||||
|
s.Reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetResults returns the result slice
|
// GetResults returns the result slice
|
||||||
func (s *Stdoutput) GetResults() []ffuf.Result {
|
func (s *Stdoutput) GetCurrentResults() []ffuf.Result {
|
||||||
return s.Results
|
return s.CurrentResults
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetResults sets the result slice
|
// SetResults sets the result slice
|
||||||
func (s *Stdoutput) SetResults(results []ffuf.Result) {
|
func (s *Stdoutput) SetCurrentResults(results []ffuf.Result) {
|
||||||
s.Results = results
|
s.CurrentResults = results
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Stdoutput) Progress(status ffuf.Progress) {
|
func (s *Stdoutput) Progress(status ffuf.Progress) {
|
||||||
@ -222,37 +230,37 @@ func (s *Stdoutput) writeToAll(filename string, config *ffuf.Config, res []ffuf.
|
|||||||
}
|
}
|
||||||
|
|
||||||
s.config.OutputFile = BaseFilename + ".json"
|
s.config.OutputFile = BaseFilename + ".json"
|
||||||
err = writeJSON(filename, s.config, s.Results)
|
err = writeJSON(filename, s.config, res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.config.OutputFile = BaseFilename + ".ejson"
|
s.config.OutputFile = BaseFilename + ".ejson"
|
||||||
err = writeEJSON(filename, s.config, s.Results)
|
err = writeEJSON(filename, s.config, res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.config.OutputFile = BaseFilename + ".html"
|
s.config.OutputFile = BaseFilename + ".html"
|
||||||
err = writeHTML(filename, s.config, s.Results)
|
err = writeHTML(filename, s.config, res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.config.OutputFile = BaseFilename + ".md"
|
s.config.OutputFile = BaseFilename + ".md"
|
||||||
err = writeMarkdown(filename, s.config, s.Results)
|
err = writeMarkdown(filename, s.config, res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.config.OutputFile = BaseFilename + ".csv"
|
s.config.OutputFile = BaseFilename + ".csv"
|
||||||
err = writeCSV(filename, s.config, s.Results, false)
|
err = writeCSV(filename, s.config, res, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.config.OutputFile = BaseFilename + ".ecsv"
|
s.config.OutputFile = BaseFilename + ".ecsv"
|
||||||
err = writeCSV(filename, s.config, s.Results, true)
|
err = writeCSV(filename, s.config, res, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
@ -266,19 +274,19 @@ func (s *Stdoutput) SaveFile(filename, format string) error {
|
|||||||
var err error
|
var err error
|
||||||
switch format {
|
switch format {
|
||||||
case "all":
|
case "all":
|
||||||
err = s.writeToAll(filename, s.config, s.Results)
|
err = s.writeToAll(filename, s.config, append(s.Results, s.CurrentResults...))
|
||||||
case "json":
|
case "json":
|
||||||
err = writeJSON(filename, s.config, s.Results)
|
err = writeJSON(filename, s.config, append(s.Results, s.CurrentResults...))
|
||||||
case "ejson":
|
case "ejson":
|
||||||
err = writeEJSON(filename, s.config, s.Results)
|
err = writeEJSON(filename, s.config, append(s.Results, s.CurrentResults...))
|
||||||
case "html":
|
case "html":
|
||||||
err = writeHTML(filename, s.config, s.Results)
|
err = writeHTML(filename, s.config, append(s.Results, s.CurrentResults...))
|
||||||
case "md":
|
case "md":
|
||||||
err = writeMarkdown(filename, s.config, s.Results)
|
err = writeMarkdown(filename, s.config, append(s.Results, s.CurrentResults...))
|
||||||
case "csv":
|
case "csv":
|
||||||
err = writeCSV(filename, s.config, s.Results, false)
|
err = writeCSV(filename, s.config, append(s.Results, s.CurrentResults...), false)
|
||||||
case "ecsv":
|
case "ecsv":
|
||||||
err = writeCSV(filename, s.config, s.Results, true)
|
err = writeCSV(filename, s.config, append(s.Results, s.CurrentResults...), true)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -319,7 +327,7 @@ func (s *Stdoutput) Result(resp ffuf.Response) {
|
|||||||
ResultFile: resp.ResultFile,
|
ResultFile: resp.ResultFile,
|
||||||
Host: resp.Request.Host,
|
Host: resp.Request.Host,
|
||||||
}
|
}
|
||||||
s.Results = append(s.Results, sResult)
|
s.CurrentResults = append(s.CurrentResults, sResult)
|
||||||
// Output the result
|
// Output the result
|
||||||
s.PrintResult(sResult)
|
s.PrintResult(sResult)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user