优化了输出中的number字段, 现在能正确判断了, 并且addition中的number会是当前的wordoffset, 可以用来判断错误发生的位置.

This commit is contained in:
M09Ic 2023-01-12 19:21:35 +08:00
parent e30bab194a
commit 3ff46e5e1f
4 changed files with 27 additions and 20 deletions

View File

@ -451,7 +451,7 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
return nil, err return nil, err
} }
} else if opt.AutoFile { } else if opt.AutoFile {
r.OutputFile, err = files.NewFile("result.json", true, false, true) r.OutputFile, err = files.NewFile("result.json", false, false, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -463,7 +463,7 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
return nil, err return nil, err
} }
} else if opt.AutoFile { } else if opt.AutoFile {
r.FuzzyFile, err = files.NewFile("fuzzy.json", true, false, true) r.FuzzyFile, err = files.NewFile("fuzzy.json", false, false, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -475,7 +475,7 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
return nil, err return nil, err
} }
} else if opt.Dump { } else if opt.Dump {
r.DumpFile, err = files.NewFile("dump.json", true, false, true) r.DumpFile, err = files.NewFile("dump.json", false, false, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -54,7 +54,6 @@ func NewPool(ctx context.Context, config *pkg.Config) (*Pool, error) {
waiter: sync.WaitGroup{}, waiter: sync.WaitGroup{},
initwg: sync.WaitGroup{}, initwg: sync.WaitGroup{},
limiter: rate.NewLimiter(rate.Limit(config.RateLimit), 1), limiter: rate.NewLimiter(rate.Limit(config.RateLimit), 1),
reqCount: 1,
failedCount: 1, failedCount: 1,
} }
@ -162,7 +161,7 @@ type Pool struct {
tempCh chan *pkg.Baseline // 待处理的baseline tempCh chan *pkg.Baseline // 待处理的baseline
checkCh chan int // 独立的check管道 防止与redirect/crawl冲突 checkCh chan int // 独立的check管道 防止与redirect/crawl冲突
additionCh chan *Unit additionCh chan *Unit
reqCount int wordOffset int
failedCount int failedCount int
isFailed bool isFailed bool
failedBaselines []*pkg.Baseline failedBaselines []*pkg.Baseline
@ -251,8 +250,8 @@ Loop:
continue continue
} }
pool.Statistor.End++ pool.Statistor.End++
if pool.reqCount < offset { pool.wordOffset++
pool.reqCount++ if pool.wordOffset <= offset {
continue continue
} }
@ -263,13 +262,13 @@ Loop:
pool.waiter.Add(1) pool.waiter.Add(1)
pool.urls[u] = struct{}{} pool.urls[u] = struct{}{}
pool.reqPool.Invoke(newUnit(pool.safePath(u), WordSource)) // 原样的目录拼接, 输入了几个"/"就是几个, 适配java的目录解析 pool.reqPool.Invoke(newUnitWithNumber(pool.safePath(u), WordSource, pool.wordOffset)) // 原样的目录拼接, 输入了几个"/"就是几个, 适配java的目录解析
case source := <-pool.checkCh: case source := <-pool.checkCh:
pool.Statistor.CheckNumber++ pool.Statistor.CheckNumber++
if pool.Mod == pkg.HostSpray { if pool.Mod == pkg.HostSpray {
pool.reqPool.Invoke(newUnit(pkg.RandHost(), source)) pool.reqPool.Invoke(newUnitWithNumber(pkg.RandHost(), source, pool.wordOffset))
} else if pool.Mod == pkg.PathSpray { } else if pool.Mod == pkg.PathSpray {
pool.reqPool.Invoke(newUnit(pool.safePath(pkg.RandPath()), source)) pool.reqPool.Invoke(newUnitWithNumber(pool.safePath(pkg.RandPath()), source, pool.wordOffset))
} }
case unit, ok := <-pool.additionCh: case unit, ok := <-pool.additionCh:
if !ok { if !ok {
@ -280,6 +279,7 @@ Loop:
pool.waiter.Done() pool.waiter.Done()
} else { } else {
pool.urls[unit.path] = struct{}{} pool.urls[unit.path] = struct{}{}
unit.number = pool.wordOffset
pool.reqPool.Invoke(unit) pool.reqPool.Invoke(unit)
} }
case <-closeCh: case <-closeCh:
@ -347,6 +347,7 @@ func (pool *Pool) Invoke(v interface{}) {
} }
bl.Source = unit.source bl.Source = unit.source
bl.ReqDepth = unit.depth bl.ReqDepth = unit.depth
bl.Number = unit.number
bl.Spended = time.Since(start).Milliseconds() bl.Spended = time.Since(start).Milliseconds()
switch unit.source { switch unit.source {
case InitRandomSource: case InitRandomSource:
@ -388,9 +389,7 @@ func (pool *Pool) Invoke(v interface{}) {
case WordSource: case WordSource:
// 异步进行性能消耗较大的深度对比 // 异步进行性能消耗较大的深度对比
pool.tempCh <- bl pool.tempCh <- bl
pool.reqCount++ if pool.wordOffset%pool.CheckPeriod == 0 {
if pool.reqCount%pool.CheckPeriod == 0 {
pool.reqCount++
pool.doCheck() pool.doCheck()
} else if pool.failedCount%pool.ErrPeriod == 0 { } else if pool.failedCount%pool.ErrPeriod == 0 {
pool.failedCount++ pool.failedCount++
@ -581,7 +580,7 @@ func (pool *Pool) doRule(bl *pkg.Baseline) {
pool.waiter.Done() pool.waiter.Done()
return return
} }
if bl.Source == int(RuleSource) { if bl.Source == RuleSource {
pool.waiter.Done() pool.waiter.Done()
return return
} }
@ -695,7 +694,7 @@ func (pool *Pool) resetFailed() {
} }
func (pool *Pool) recover() { func (pool *Pool) recover() {
logs.Log.Errorf("%s ,failed request exceeds the threshold , task will exit. Breakpoint %d", pool.BaseURL, pool.reqCount) logs.Log.Errorf("%s ,failed request exceeds the threshold , task will exit. Breakpoint %d", pool.BaseURL, pool.wordOffset)
for i, bl := range pool.failedBaselines { for i, bl := range pool.failedBaselines {
logs.Log.Errorf("[failed.%d] %s", i, bl.String()) logs.Log.Errorf("[failed.%d] %s", i, bl.String())
} }
@ -714,10 +713,13 @@ func (pool *Pool) Close() {
func (pool *Pool) safePath(u string) string { func (pool *Pool) safePath(u string) string {
// 自动生成的目录将采用safepath的方式拼接到相对目录中, 避免出现//的情况. 例如init, check, common // 自动生成的目录将采用safepath的方式拼接到相对目录中, 避免出现//的情况. 例如init, check, common
if !pool.isDir && !strings.HasPrefix(u, "/") { hasSlash := strings.HasPrefix(u, "/")
if !pool.isDir && hasSlash {
// 如果path已经有"/", 则去掉 // 如果path已经有"/", 则去掉
return pool.dir + u return pool.dir + "/" + u
} else { } else if pool.isDir && hasSlash {
return pool.dir + u[1:] return pool.dir + u[1:]
} else {
return pool.dir + u
} }
} }

View File

@ -62,7 +62,12 @@ func newUnit(path string, source int) *Unit {
return &Unit{path: path, source: source} return &Unit{path: path, source: source}
} }
func newUnitWithNumber(path string, source int, number int) *Unit {
return &Unit{path: path, source: source, number: number}
}
type Unit struct { type Unit struct {
number int
path string path string
source int source int
frontUrl string frontUrl string

View File

@ -91,6 +91,8 @@ func NewInvalidBaseline(u, host string, resp *ihttp.Response, reason string) *Ba
type Baseline struct { type Baseline struct {
Number int `json:"number"` Number int `json:"number"`
Url *url.URL `json:"-"` Url *url.URL `json:"-"`
IsValid bool `json:"valid"`
IsFuzzy bool `json:"fuzzy"`
UrlString string `json:"url"` UrlString string `json:"url"`
Path string `json:"path"` Path string `json:"path"`
Dir bool `json:"-"` Dir bool `json:"-"`
@ -112,8 +114,6 @@ type Baseline struct {
Extracteds Extracteds `json:"extracts"` Extracteds Extracteds `json:"extracts"`
ErrString string `json:"error"` ErrString string `json:"error"`
Reason string `json:"reason"` Reason string `json:"reason"`
IsValid bool `json:"valid"`
IsFuzzy bool `json:"fuzzy"`
Source int `json:"source"` Source int `json:"source"`
ReqDepth int `json:"depth"` ReqDepth int `json:"depth"`
Distance uint8 `json:"distance"` Distance uint8 `json:"distance"`