Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring variables logic with map + get public ip #3853

Merged
merged 6 commits into from
Jun 22, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions v2/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ require (
github.com/klauspost/compress v1.16.6
github.com/labstack/echo/v4 v4.10.2
github.com/mholt/archiver v3.1.1+incompatible
github.com/projectdiscovery/dsl v0.0.9
github.com/projectdiscovery/dsl v0.0.11-0.20230621003022-b5d83457b872
github.com/projectdiscovery/fasttemplate v0.0.2
github.com/projectdiscovery/goflags v0.1.10
github.com/projectdiscovery/gologger v1.1.10
Expand Down Expand Up @@ -129,7 +129,7 @@ require (
github.com/projectdiscovery/cdncheck v1.0.6 // indirect
github.com/projectdiscovery/freeport v0.0.4 // indirect
github.com/refraction-networking/utls v1.3.2 // indirect
github.com/sashabaranov/go-openai v1.9.1 // indirect
github.com/sashabaranov/go-openai v1.11.2 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/skeema/knownhosts v1.1.1 // indirect
github.com/smartystreets/assertions v1.0.0 // indirect
Expand Down
8 changes: 4 additions & 4 deletions v2/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -409,8 +409,8 @@ github.com/projectdiscovery/cdncheck v1.0.6 h1:bjo4oxCD1Y5972ow0LWCjUpO8KOO12j6u
github.com/projectdiscovery/cdncheck v1.0.6/go.mod h1:NN0QRfxBzUVZJoS0lN37spElCOXHzFuvq1yg5RhTxCE=
github.com/projectdiscovery/clistats v0.0.12 h1:KLYJxpiwEFidduU4PbcwEcCQ2L7c5wrf7DI5IN5fZ+8=
github.com/projectdiscovery/clistats v0.0.12/go.mod h1:9luKJj+7Hjq3+a7g129sKWRYx4SbTdkUWZQxabn3H5Y=
github.com/projectdiscovery/dsl v0.0.9 h1:VfznBxpbNKMn2amQd9gtRnMfK1/Sf9MwsJD9x2Et/fY=
github.com/projectdiscovery/dsl v0.0.9/go.mod h1:kdPdbbqceWxkSedXm99z0Hzh9z/DFj42A9L95GJjybo=
github.com/projectdiscovery/dsl v0.0.11-0.20230621003022-b5d83457b872 h1:h3Y+eFAaD2I6k51KCVXa99ItaWn9DZs8sScBx+TJQnc=
github.com/projectdiscovery/dsl v0.0.11-0.20230621003022-b5d83457b872/go.mod h1:bpJD7YUHBx2D0obqI4jdRVepBGTJZ8p+86j3WNb0QXs=
github.com/projectdiscovery/fastdialer v0.0.29 h1:uDy2/bXHl8ISkuRp0EpmajkfWHewL3q5oDcYxB07ME8=
github.com/projectdiscovery/fastdialer v0.0.29/go.mod h1:CBzmr7QS+Ml66h1jjuudR8Uzl6bt2YeqYmTg0IedWsI=
github.com/projectdiscovery/fasttemplate v0.0.2 h1:h2cISk5xDhlJEinlBQS6RRx0vOlOirB2y3Yu4PJzpiA=
Expand Down Expand Up @@ -471,8 +471,8 @@ github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA=
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/sashabaranov/go-openai v1.9.1 h1:3N52HkJKo9Zlo/oe1AVv5ZkCOny0ra58/ACvAxkN3MM=
github.com/sashabaranov/go-openai v1.9.1/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
github.com/sashabaranov/go-openai v1.11.2 h1:HuMf+18eldSKbqVblyeCQbtcqSpGVfqTshvi8Bn6zes=
github.com/sashabaranov/go-openai v1.11.2/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c=
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
Expand Down
9 changes: 5 additions & 4 deletions v2/pkg/protocols/common/variables/variables.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,12 @@ func evaluateVariableValue(expression string, values, processing map[string]inte
// checkForLazyEval checks if the variables have any lazy evaluation i.e any dsl function
// and sets the flag accordingly.
func (variables *Variable) checkForLazyEval() bool {

variables.ForEach(func(key string, value interface{}) {
if stringsutil.ContainsAny(types.ToString(value), protocolutils.KnownVariables...) {
variables.LazyEval = true
return
for _, v := range protocolutils.KnownVariables {
if stringsutil.ContainsAny(types.ToString(value), v) {
variables.LazyEval = true
return
}
}
})
return variables.LazyEval
Expand Down
104 changes: 71 additions & 33 deletions v2/pkg/protocols/utils/variables.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,51 @@ import (
"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/contextargs"
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/generators"
maputil "github.com/projectdiscovery/utils/maps"
urlutil "github.com/projectdiscovery/utils/url"
"github.com/weppos/publicsuffix-go/publicsuffix"
)

// KnownVariables are the variables that are known to input requests
var KnownVariables = []string{"BaseURL", "RootURL", "Hostname", "Host", "Port", "Path", "File", "Scheme", "Input", "FQDN", "RDN", "DN", "TLD", "SD"}
var KnownVariables maputil.Map[KnownVariable, string]

func init() {
KnownVariables = maputil.Map[KnownVariable, string]{
BaseURL: "BaseURL",
RootURL: "RootURL",
Hostname: "Hostname",
Host: "Host",
Port: "Port",
Path: "Path",
File: "File",
Scheme: "Scheme",
Input: "Input",
Fqdn: "FQDN",
Rdn: "RDN",
Dn: "DN",
Tld: "TLD",
Sd: "SD",
}
}

type KnownVariable uint16

const (
BaseURL KnownVariable = iota
RootURL
Hostname
Host
Port
Path
File
Scheme
Input
Fqdn
Rdn
Dn
Tld
Sd
)

// GenerateVariables will create default variables with context args
func GenerateVariablesWithContextArgs(input *contextargs.Context, trailingSlash bool) map[string]interface{} {
Expand All @@ -34,18 +73,18 @@ func GenerateDNSVariables(domain string) map[string]interface{} {

domainName := strings.Join([]string{parsed.SLD, parsed.TLD}, ".")
dnsVariables := make(map[string]interface{})
for _, k := range KnownVariables {
for k, v := range KnownVariables {
switch k {
case "FQDN":
dnsVariables[k] = domain
case "RDN":
dnsVariables[k] = domainName
case "DN":
dnsVariables[k] = parsed.SLD
case "TLD":
dnsVariables[k] = parsed.TLD
case "SD":
dnsVariables[k] = parsed.TRD
case Fqdn:
dnsVariables[v] = domain
case Rdn:
dnsVariables[v] = domainName
case Dn:
dnsVariables[v] = parsed.SLD
case Tld:
dnsVariables[v] = parsed.TLD
case Sd:
dnsVariables[v] = parsed.TRD
}
}
return dnsVariables
Expand All @@ -55,13 +94,12 @@ func GenerateDNSVariables(domain string) map[string]interface{} {
// Returns the map of KnownVariables keys
// This function is used by http, headless, websocket, network and whois protocols to generate protocol variables
func GenerateVariables(input interface{}, removeTrailingSlash bool, additionalVars map[string]interface{}) map[string]interface{} {

var vars = make(map[string]interface{})
switch input := input.(type) {
case string:
parsed, err := urlutil.Parse(input)
if err != nil {
return map[string]interface{}{"Input": input, "Hostname": input}
return map[string]interface{}{KnownVariables[Input]: input, KnownVariables[Hostname]: input}
}
vars = generateVariables(parsed, removeTrailingSlash)
case *urlutil.URL:
Expand Down Expand Up @@ -106,26 +144,26 @@ func generateVariables(inputURL *urlutil.URL, removeTrailingSlash bool) map[stri
}
}
knownVariables := make(map[string]interface{})
for _, k := range KnownVariables {
for k, v := range KnownVariables {
switch k {
case "BaseURL":
knownVariables[k] = parsed.String()
case "RootURL":
knownVariables[k] = fmt.Sprintf("%s://%s", parsed.Scheme, parsed.Host)
case "Hostname":
knownVariables[k] = parsed.Host
case "Host":
knownVariables[k] = parsed.Hostname()
case "Port":
knownVariables[k] = port
case "Path":
knownVariables[k] = requestPath
case "File":
knownVariables[k] = base
case "Scheme":
knownVariables[k] = parsed.Scheme
case "Input":
knownVariables[k] = parsed.String()
case BaseURL:
knownVariables[v] = parsed.String()
case RootURL:
knownVariables[v] = fmt.Sprintf("%s://%s", parsed.Scheme, parsed.Host)
case Hostname:
knownVariables[v] = parsed.Host
case Host:
knownVariables[v] = parsed.Hostname()
case Port:
knownVariables[v] = port
case Path:
knownVariables[v] = requestPath
case File:
knownVariables[v] = base
case Scheme:
knownVariables[v] = parsed.Scheme
case Input:
knownVariables[v] = parsed.String()
}
}
return generators.MergeMaps(knownVariables, GenerateDNSVariables(parsed.Hostname()))
Expand Down
Loading