mirror of
				https://github.com/chainreactors/spray.git
				synced 2025-11-04 09:58:03 +00:00 
			
		
		
		
	实装-U,-L, --remove-extensions, -extensions, --exclude-extension
This commit is contained in:
		
							parent
							
								
									b600761ed8
								
							
						
					
					
						commit
						4981ab326b
					
				@ -1,6 +1,7 @@
 | 
				
			|||||||
package internal
 | 
					package internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"github.com/chainreactors/logs"
 | 
						"github.com/chainreactors/logs"
 | 
				
			||||||
	"github.com/chainreactors/spray/pkg"
 | 
						"github.com/chainreactors/spray/pkg"
 | 
				
			||||||
	"github.com/chainreactors/words/mask"
 | 
						"github.com/chainreactors/words/mask"
 | 
				
			||||||
@ -16,8 +17,8 @@ type Option struct {
 | 
				
			|||||||
	Dictionaries      []string `short:"d" long:"dict"`
 | 
						Dictionaries      []string `short:"d" long:"dict"`
 | 
				
			||||||
	Word              string   `short:"w" long:"word"`
 | 
						Word              string   `short:"w" long:"word"`
 | 
				
			||||||
	Extension         string   `short:"e" long:"extensions"`
 | 
						Extension         string   `short:"e" long:"extensions"`
 | 
				
			||||||
	ExcludeExtensions bool     `long:"exclude-extensions"`
 | 
						ExcludeExtensions string   `long:"exclude-extensions"`
 | 
				
			||||||
	RemoveExtensions  bool     `long:"remove-extensions"`
 | 
						RemoveExtensions  string   `long:"remove-extensions"`
 | 
				
			||||||
	Uppercase         bool     `short:"U" long:"uppercase"`
 | 
						Uppercase         bool     `short:"U" long:"uppercase"`
 | 
				
			||||||
	Lowercase         bool     `short:"L" long:"lowercase"`
 | 
						Lowercase         bool     `short:"L" long:"lowercase"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -37,6 +38,10 @@ type Option struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (opt *Option) PrepareRunner() (*Runner, error) {
 | 
					func (opt *Option) PrepareRunner() (*Runner, error) {
 | 
				
			||||||
 | 
						ok := opt.Validate()
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("validate failed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	r := &Runner{
 | 
						r := &Runner{
 | 
				
			||||||
		Progress: uiprogress.New(),
 | 
							Progress: uiprogress.New(),
 | 
				
			||||||
@ -99,18 +104,51 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
 | 
				
			|||||||
		logs.Log.Importantf("load %d word from %s", len(dicts[i]), f)
 | 
							logs.Log.Importantf("load %d word from %s", len(dicts[i]), f)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var exts []string
 | 
				
			||||||
 | 
						if opt.Extension != "" {
 | 
				
			||||||
 | 
							exts = strings.Split(opt.Extension, ",")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if opt.Word == "" {
 | 
						if opt.Word == "" {
 | 
				
			||||||
		for _, w := range dicts {
 | 
							for _, w := range dicts {
 | 
				
			||||||
			r.Wordlist = append(r.Wordlist, w...)
 | 
								r.Wordlist = append(r.Wordlist, w...)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		mask.CustomWords = dicts
 | 
							mask.CustomWords = dicts
 | 
				
			||||||
 | 
							if len(exts) > 0 {
 | 
				
			||||||
 | 
								mask.CustomWords = append(mask.CustomWords, exts)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							opt.Word += fmt.Sprintf("{?%d}", len(exts)-1)
 | 
				
			||||||
		r.Wordlist, err = mask.Run(opt.Word)
 | 
							r.Wordlist, err = mask.Run(opt.Word)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if opt.Uppercase {
 | 
				
			||||||
 | 
							r.Fns = append(r.Fns, strings.ToUpper)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if opt.Lowercase {
 | 
				
			||||||
 | 
							r.Fns = append(r.Fns, strings.ToLower)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if opt.ExcludeExtensions != "" {
 | 
				
			||||||
 | 
							exexts := strings.Split(opt.ExcludeExtensions, ",")
 | 
				
			||||||
 | 
							r.Fns = append(r.Fns, func(s string) string {
 | 
				
			||||||
 | 
								if ext := parseExtension(s); SliceContains(exexts, ext) {
 | 
				
			||||||
 | 
									return ""
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return s
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if opt.RemoveExtensions != "" {
 | 
				
			||||||
 | 
							rexts := strings.Split(opt.ExcludeExtensions, ",")
 | 
				
			||||||
 | 
							r.Fns = append(r.Fns, func(s string) string {
 | 
				
			||||||
 | 
								if ext := parseExtension(s); SliceContains(rexts, ext) {
 | 
				
			||||||
 | 
									return strings.TrimSuffix(s, "."+ext)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return s
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	// prepare header
 | 
						// prepare header
 | 
				
			||||||
	for _, h := range opt.Headers {
 | 
						for _, h := range opt.Headers {
 | 
				
			||||||
		i := strings.Index(h, ":")
 | 
							i := strings.Index(h, ":")
 | 
				
			||||||
@ -124,6 +162,14 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
 | 
				
			|||||||
	return r, nil
 | 
						return r, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (opt *Option) Validate() bool {
 | 
				
			||||||
 | 
						if opt.Uppercase && opt.Lowercase {
 | 
				
			||||||
 | 
							logs.Log.Error("Cannot set -U and -L at the same time")
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func loadFileToSlice(filename string) ([]string, error) {
 | 
					func loadFileToSlice(filename string) ([]string, error) {
 | 
				
			||||||
	var ss []string
 | 
						var ss []string
 | 
				
			||||||
	content, err := ioutil.ReadFile(filename)
 | 
						content, err := ioutil.ReadFile(filename)
 | 
				
			||||||
@ -140,3 +186,19 @@ func loadFileToSlice(filename string) ([]string, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return ss, nil
 | 
						return ss, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func parseExtension(s string) string {
 | 
				
			||||||
 | 
						if i := strings.Index(s, "."); i != -1 {
 | 
				
			||||||
 | 
							return s[i+1:]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SliceContains(s []string, e string) bool {
 | 
				
			||||||
 | 
						for _, v := range s {
 | 
				
			||||||
 | 
							if v == e {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -190,6 +190,9 @@ Loop:
 | 
				
			|||||||
			if !ok {
 | 
								if !ok {
 | 
				
			||||||
				break Loop
 | 
									break Loop
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								for _, fn := range p.Fns {
 | 
				
			||||||
 | 
									u = fn(u)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			p.wg.Add(1)
 | 
								p.wg.Add(1)
 | 
				
			||||||
			_ = p.pool.Invoke(newUnit(u, WordSource))
 | 
								_ = p.pool.Invoke(newUnit(u, WordSource))
 | 
				
			||||||
		case <-ctx.Done():
 | 
							case <-ctx.Done():
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ type Runner struct {
 | 
				
			|||||||
	URLList  []string
 | 
						URLList  []string
 | 
				
			||||||
	Wordlist []string
 | 
						Wordlist []string
 | 
				
			||||||
	Headers  http.Header
 | 
						Headers  http.Header
 | 
				
			||||||
 | 
						Fns      []func(string) string
 | 
				
			||||||
	Threads  int
 | 
						Threads  int
 | 
				
			||||||
	PoolSize int
 | 
						PoolSize int
 | 
				
			||||||
	Pools    *ants.PoolWithFunc
 | 
						Pools    *ants.PoolWithFunc
 | 
				
			||||||
@ -51,6 +52,7 @@ func (r *Runner) Prepare() error {
 | 
				
			|||||||
			Timeout:  r.Timeout,
 | 
								Timeout:  r.Timeout,
 | 
				
			||||||
			Headers:  r.Headers,
 | 
								Headers:  r.Headers,
 | 
				
			||||||
			Mod:      pkg.ModMap[r.Mod],
 | 
								Mod:      pkg.ModMap[r.Mod],
 | 
				
			||||||
 | 
								Fns:      r.Fns,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if config.Mod == pkg.PathSpray {
 | 
							if config.Mod == pkg.PathSpray {
 | 
				
			||||||
 | 
				
			|||||||
@ -29,4 +29,5 @@ type Config struct {
 | 
				
			|||||||
	Headers     http.Header
 | 
						Headers     http.Header
 | 
				
			||||||
	EnableFuzzy bool
 | 
						EnableFuzzy bool
 | 
				
			||||||
	ClientType  int
 | 
						ClientType  int
 | 
				
			||||||
 | 
						Fns         []func(string) string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user