github.com/projectdiscovery/nuclei/v2@v2.9.15/pkg/protocols/common/generators/load.go (about) 1 package generators 2 3 import ( 4 "bufio" 5 "path/filepath" 6 "strings" 7 8 "github.com/pkg/errors" 9 pkgTypes "github.com/projectdiscovery/nuclei/v2/pkg/types" 10 "github.com/spf13/cast" 11 ) 12 13 // loadPayloads loads the input payloads from a map to a data map 14 func (generator *PayloadGenerator) loadPayloads(payloads map[string]interface{}, templatePath, templateDirectory string, allowLocalFileAccess bool) (map[string][]string, error) { 15 loadedPayloads := make(map[string][]string) 16 17 for name, payload := range payloads { 18 switch pt := payload.(type) { 19 case string: 20 elements := strings.Split(pt, "\n") 21 //golint:gomnd // this is not a magic number 22 if len(elements) >= 2 { 23 loadedPayloads[name] = elements 24 } else { 25 if !allowLocalFileAccess { 26 pt = filepath.Clean(pt) 27 templateAbsPath, err := filepath.Abs(templatePath) 28 if err != nil { 29 return nil, errors.Wrap(err, "could not get absolute path") 30 } 31 templatePathDir := filepath.Dir(templateAbsPath) 32 if !(templatePathDir != "/" && strings.HasPrefix(pt, templatePathDir)) && !strings.HasPrefix(pt, templateDirectory) { 33 return nil, errors.New("denied payload file path specified") 34 } 35 } 36 payloads, err := generator.loadPayloadsFromFile(pt) 37 if err != nil { 38 return nil, errors.Wrap(err, "could not load payloads") 39 } 40 loadedPayloads[name] = payloads 41 } 42 case interface{}: 43 loadedPayloads[name] = cast.ToStringSlice(pt) 44 } 45 } 46 return loadedPayloads, nil 47 } 48 49 // loadPayloadsFromFile loads a file to a string slice 50 func (generator *PayloadGenerator) loadPayloadsFromFile(filepath string) ([]string, error) { 51 var lines []string 52 53 file, err := generator.catalog.OpenFile(filepath) 54 if err != nil { 55 return nil, err 56 } 57 defer file.Close() 58 59 scanner := bufio.NewScanner(file) 60 for scanner.Scan() { 61 text := scanner.Text() 62 if text == "" { 63 continue 64 } 65 lines = append(lines, text) 66 } 67 if err := scanner.Err(); err != nil && !errors.Is(err, pkgTypes.ErrNoMoreRequests) { 68 return lines, scanner.Err() 69 } 70 return lines, nil 71 }