Fixed an issue with storing the matches for recursion jobs (#437)

This commit is contained in:
Joona Hoikkala 2021-04-27 00:10:11 +03:00 committed by GitHub
parent 8ffe1bd64e
commit 25fc4e4b49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 47 additions and 33 deletions

View File

@ -3,6 +3,7 @@
- New
- Added a CLI flag to disable the interactive mode
- 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 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

View File

@ -263,7 +263,7 @@ available commands:
queueskip - advance to the next queued recursion job
restart - restart and resume the current ffuf job
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
help - you are looking at it
>

View File

@ -46,9 +46,10 @@ type OutputProvider interface {
Result(resp Response)
PrintResult(res Result)
SaveFile(filename, format string) error
GetResults() []Result
SetResults(results []Result)
GetCurrentResults() []Result
SetCurrentResults(results []Result)
Reset()
Cycle()
}
type Result struct {

View File

@ -123,7 +123,7 @@ func (j *Job) Start() {
j.interruptMonitor()
for j.jobsInQueue() {
j.prepareQueueJob()
j.Reset()
j.Reset(true)
j.RunningJob = true
j.startExecution()
}
@ -135,13 +135,17 @@ func (j *Job) Start() {
}
// Reset resets the counters and wordlist position for a job
func (j *Job) Reset() {
func (j *Job) Reset(cycle bool) {
j.Input.Reset()
j.Counter = 0
j.skipQueue = false
j.startTimeJob = time.Now()
if cycle {
j.Output.Cycle()
} else {
j.Output.Reset()
}
}
func (j *Job) jobsInQueue() bool {
return j.queuepos < len(j.queuejobs)

View File

@ -53,12 +53,12 @@ func (i *interactive) handleInput(in []byte) {
i.paused = false
i.Job.Resume()
case "restart":
i.Job.Reset()
i.Job.Reset(false)
i.paused = false
i.Job.Output.Info("Restarting the current ffuf job!")
i.Job.Resume()
case "show":
for _, r := range i.Job.Output.GetResults() {
for _, r := range i.Job.Output.GetCurrentResults() {
i.Job.Output.PrintResult(r)
}
case "savejson":
@ -150,7 +150,7 @@ func (i *interactive) updateFilter(name, value string) {
}
results := make([]ffuf.Result, 0)
for _, res := range i.Job.Output.GetResults() {
for _, res := range i.Job.Output.GetCurrentResults() {
fakeResp := &ffuf.Response{
StatusCode: res.StatusCode,
ContentLines: res.ContentLength,
@ -162,7 +162,7 @@ func (i *interactive) updateFilter(name, value string) {
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
restart - restart and resume the current ffuf job
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
help - you are looking at it
`

View File

@ -28,12 +28,14 @@ const (
type Stdoutput struct {
config *ffuf.Config
Results []ffuf.Result
CurrentResults []ffuf.Result
}
func NewStdoutput(conf *ffuf.Config) *Stdoutput {
var outp Stdoutput
outp.config = conf
outp.Results = []ffuf.Result{}
outp.Results = make([]ffuf.Result, 0)
outp.CurrentResults = make([]ffuf.Result, 0)
return &outp
}
@ -133,17 +135,23 @@ func (s *Stdoutput) Banner() {
// Reset resets the result slice
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
func (s *Stdoutput) GetResults() []ffuf.Result {
return s.Results
func (s *Stdoutput) GetCurrentResults() []ffuf.Result {
return s.CurrentResults
}
// SetResults sets the result slice
func (s *Stdoutput) SetResults(results []ffuf.Result) {
s.Results = results
func (s *Stdoutput) SetCurrentResults(results []ffuf.Result) {
s.CurrentResults = results
}
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"
err = writeJSON(filename, s.config, s.Results)
err = writeJSON(filename, s.config, res)
if err != nil {
s.Error(err.Error())
}
s.config.OutputFile = BaseFilename + ".ejson"
err = writeEJSON(filename, s.config, s.Results)
err = writeEJSON(filename, s.config, res)
if err != nil {
s.Error(err.Error())
}
s.config.OutputFile = BaseFilename + ".html"
err = writeHTML(filename, s.config, s.Results)
err = writeHTML(filename, s.config, res)
if err != nil {
s.Error(err.Error())
}
s.config.OutputFile = BaseFilename + ".md"
err = writeMarkdown(filename, s.config, s.Results)
err = writeMarkdown(filename, s.config, res)
if err != nil {
s.Error(err.Error())
}
s.config.OutputFile = BaseFilename + ".csv"
err = writeCSV(filename, s.config, s.Results, false)
err = writeCSV(filename, s.config, res, false)
if err != nil {
s.Error(err.Error())
}
s.config.OutputFile = BaseFilename + ".ecsv"
err = writeCSV(filename, s.config, s.Results, true)
err = writeCSV(filename, s.config, res, true)
if err != nil {
s.Error(err.Error())
}
@ -266,19 +274,19 @@ func (s *Stdoutput) SaveFile(filename, format string) error {
var err error
switch format {
case "all":
err = s.writeToAll(filename, s.config, s.Results)
err = s.writeToAll(filename, s.config, append(s.Results, s.CurrentResults...))
case "json":
err = writeJSON(filename, s.config, s.Results)
err = writeJSON(filename, s.config, append(s.Results, s.CurrentResults...))
case "ejson":
err = writeEJSON(filename, s.config, s.Results)
err = writeEJSON(filename, s.config, append(s.Results, s.CurrentResults...))
case "html":
err = writeHTML(filename, s.config, s.Results)
err = writeHTML(filename, s.config, append(s.Results, s.CurrentResults...))
case "md":
err = writeMarkdown(filename, s.config, s.Results)
err = writeMarkdown(filename, s.config, append(s.Results, s.CurrentResults...))
case "csv":
err = writeCSV(filename, s.config, s.Results, false)
err = writeCSV(filename, s.config, append(s.Results, s.CurrentResults...), false)
case "ecsv":
err = writeCSV(filename, s.config, s.Results, true)
err = writeCSV(filename, s.config, append(s.Results, s.CurrentResults...), true)
}
return err
}
@ -319,7 +327,7 @@ func (s *Stdoutput) Result(resp ffuf.Response) {
ResultFile: resp.ResultFile,
Host: resp.Request.Host,
}
s.Results = append(s.Results, sResult)
s.CurrentResults = append(s.CurrentResults, sResult)
// Output the result
s.PrintResult(sResult)
}