Path: blob/dev/pkg/protocols/common/automaticscan/util.go
2072 views
package automaticscan12import (3"github.com/pkg/errors"4"github.com/projectdiscovery/nuclei/v3/pkg/catalog/config"5"github.com/projectdiscovery/nuclei/v3/pkg/templates"6"github.com/projectdiscovery/nuclei/v3/pkg/types"7sliceutil "github.com/projectdiscovery/utils/slice"8)910// getTemplateDirs returns template directories for given input11// by default it returns default template directory12func getTemplateDirs(opts Options) ([]string, error) {13defaultTemplatesDirectories := []string{config.DefaultConfig.GetTemplateDir()}14// adding custom template path if available15if len(opts.ExecuterOpts.Options.Templates) > 0 {16defaultTemplatesDirectories = append(defaultTemplatesDirectories, opts.ExecuterOpts.Options.Templates...)17}18// Collect path for default directories we want to look for templates in19var allTemplates []string20for _, directory := range defaultTemplatesDirectories {21templates, err := opts.ExecuterOpts.Catalog.GetTemplatePath(directory)22if err != nil {23return nil, errors.Wrap(err, "could not get templates in directory")24}25allTemplates = append(allTemplates, templates...)26}27allTemplates = sliceutil.Dedupe(allTemplates)28if len(allTemplates) == 0 {29return nil, errors.New("no templates found for given input")30}31return allTemplates, nil32}3334// LoadTemplatesWithTags loads and returns templates with given tags35func LoadTemplatesWithTags(opts Options, templateDirs []string, tags []string, logInfo bool) ([]*templates.Template, error) {36finalTemplates := opts.Store.LoadTemplatesWithTags(templateDirs, tags)37if len(finalTemplates) == 0 {38return nil, errors.New("could not find any templates with tech tag")39}4041if !opts.ExecuterOpts.Options.DisableClustering {42// cluster and reduce requests43totalReqBeforeCluster := getRequestCount(finalTemplates) * int(opts.Target.Count())44finalTemplates, clusterCount := templates.ClusterTemplates(finalTemplates, opts.ExecuterOpts)45totalReqAfterClustering := getRequestCount(finalTemplates) * int(opts.Target.Count())46if totalReqAfterClustering < totalReqBeforeCluster && logInfo {47opts.ExecuterOpts.Logger.Info().Msgf("Automatic scan tech-detect: Templates clustered: %d (Reduced %d Requests)", clusterCount, totalReqBeforeCluster-totalReqAfterClustering)48}49}5051// log template loaded if VerboseVerbose flag is set52if opts.ExecuterOpts.Options.VerboseVerbose {53for _, tpl := range finalTemplates {54opts.ExecuterOpts.Logger.Print().Msgf("%s\n", templates.TemplateLogMessage(tpl.ID,55types.ToString(tpl.Info.Name),56tpl.Info.Authors.ToSlice(),57tpl.Info.SeverityHolder.Severity))58}5960}61return finalTemplates, nil62}6364// returns total requests count65func getRequestCount(templates []*templates.Template) int {66count := 067for _, template := range templates {68// ignore requests in workflows as total requests in workflow69// depends on what templates will be called in workflow70if len(template.Workflows) > 0 {71continue72}73count += template.TotalRequests74}75return count76}777879