mirror of
https://github.com/chainreactors/spray.git
synced 2025-09-15 11:40:13 +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