2021-07-05 04:35:53 +05:30
|
|
|
package load
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"errors"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"os"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/projectdiscovery/nuclei/v2/pkg/catalog/loader/filter"
|
|
|
|
|
"github.com/projectdiscovery/nuclei/v2/pkg/types"
|
|
|
|
|
"gopkg.in/yaml.v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Load loads a template by parsing metadata and running
|
|
|
|
|
// all tag and path based filters on the template.
|
|
|
|
|
func Load(templatePath string, workflow bool, customTags []string, tagFilter *filter.TagFilter) (bool, error) {
|
|
|
|
|
f, err := os.Open(templatePath)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
|
|
data, err := ioutil.ReadAll(f)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template := make(map[string]interface{})
|
|
|
|
|
err = yaml.NewDecoder(bytes.NewReader(data)).Decode(template)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info, ok := template["info"]
|
|
|
|
|
if !ok {
|
|
|
|
|
return false, errors.New("no template info field provided")
|
|
|
|
|
}
|
2021-07-05 14:25:42 +05:30
|
|
|
infoMap, ok := info.(map[interface{}]interface{})
|
|
|
|
|
if !ok {
|
|
|
|
|
return false, errors.New("could not get info")
|
|
|
|
|
}
|
2021-07-05 04:35:53 +05:30
|
|
|
|
2021-07-05 17:29:45 +05:30
|
|
|
if _, nameOk := infoMap["name"]; !nameOk {
|
2021-07-05 04:35:53 +05:30
|
|
|
return false, errors.New("no template name field provided")
|
|
|
|
|
}
|
|
|
|
|
author, ok := infoMap["author"]
|
|
|
|
|
if !ok {
|
|
|
|
|
return false, errors.New("no template author field provided")
|
|
|
|
|
}
|
|
|
|
|
severity, ok := infoMap["severity"]
|
|
|
|
|
if !ok {
|
|
|
|
|
severity = ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
templateTags, ok := infoMap["tags"]
|
|
|
|
|
if !ok {
|
|
|
|
|
templateTags = ""
|
|
|
|
|
}
|
|
|
|
|
tagStr := types.ToString(templateTags)
|
|
|
|
|
|
|
|
|
|
tags := strings.Split(tagStr, ",")
|
|
|
|
|
severityStr := types.ToString(severity)
|
|
|
|
|
authors := strings.Split(types.ToString(author), ",")
|
|
|
|
|
|
|
|
|
|
matched := false
|
|
|
|
|
|
2021-07-05 17:41:39 +05:30
|
|
|
_, workflowsFound := template["workflows"]
|
|
|
|
|
if !workflowsFound && workflow {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
if workflow {
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|
2021-07-05 04:35:53 +05:30
|
|
|
for _, tag := range tags {
|
|
|
|
|
for _, author := range authors {
|
|
|
|
|
var match bool
|
|
|
|
|
var err error
|
|
|
|
|
|
2021-07-06 13:18:18 +05:30
|
|
|
if len(customTags) == 0 {
|
2021-07-05 04:35:53 +05:30
|
|
|
match, err = tagFilter.Match(strings.TrimSpace(tag), strings.TrimSpace(author), severityStr)
|
|
|
|
|
} else {
|
|
|
|
|
match, err = tagFilter.MatchWithAllowedTags(customTags, strings.TrimSpace(tag), strings.TrimSpace(author), severityStr)
|
|
|
|
|
}
|
|
|
|
|
if err == filter.ErrExcluded {
|
|
|
|
|
return false, filter.ErrExcluded
|
|
|
|
|
}
|
2021-07-05 14:25:42 +05:30
|
|
|
if !matched && match {
|
2021-07-05 04:35:53 +05:30
|
|
|
matched = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if !matched {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
if workflowsFound && !workflow {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|