nuclei/pkg/fuzz/component/component.go
Tarun Koyalwar e88889b263
add -dast flag and multiple bug fixes for dast templates (#4941)
* add default get method

* remove residual payload logic from old implementation

* fuzz: clone current state of component

* fuzz: bug fix stacking of payloads in multiple mode

* improve stdout template loading stats

* stdout: force display warnings if no templates are loaded

* update flags in README.md

* quote non-ascii chars in extractor output

* aws request signature can only be used in signed & verified tmpls

* deprecate request signature

* remove logic related to deprecated fuzzing input

* update test to use ordered params

* fix interactsh-url lazy eval: #4946

* output: skip unnecessary updates when unescaping

* updates as per requested changes
2024-03-29 13:31:30 +05:30

98 lines
2.6 KiB
Go

package component
import (
"errors"
"strings"
"github.com/leslie-qiwa/flat"
"github.com/projectdiscovery/retryablehttp-go"
)
// ErrSetValue is a error raised when a value cannot be set
var ErrSetValue = errors.New("could not set value")
func IsErrSetValue(err error) bool {
if err == nil {
return false
}
return strings.Contains(err.Error(), "could not set value")
}
// ErrKeyNotFound is a error raised when a key is not found
var ErrKeyNotFound = errors.New("key not found")
// Component is a component for a request
type Component interface {
// Name returns the name of the component
Name() string
// Parse parses the component and returns the
// parsed component
Parse(req *retryablehttp.Request) (bool, error)
// Iterate iterates over all values of a component
// ex in case of query component, it will iterate over each query parameter
// depending on the rule if mode is single
// request is rebuilt for each value in this callback
// and in case of multiple, request will be rebuilt after iteration of all values
Iterate(func(key string, value interface{}) error) error
// SetValue sets a value in the component
// for a key
//
// After calling setValue for mutation, the value must be
// called again so as to reset the body to its original state.
SetValue(key string, value string) error
// Delete deletes a key from the component
// If it is applicable
Delete(key string) error
// Rebuild returns a new request with the
// component rebuilt
Rebuild() (*retryablehttp.Request, error)
// Clones current state of this component
Clone() Component
}
const (
// RequestBodyComponent is the name of the request body component
RequestBodyComponent = "body"
// RequestQueryComponent is the name of the request query component
RequestQueryComponent = "query"
// RequestPathComponent is the name of the request url component
RequestPathComponent = "path"
// RequestHeaderComponent is the name of the request header component
RequestHeaderComponent = "header"
// RequestCookieComponent is the name of the request cookie component
RequestCookieComponent = "cookie"
)
// Components is a list of all available components
var Components = []string{
RequestBodyComponent,
RequestQueryComponent,
RequestPathComponent,
RequestHeaderComponent,
RequestCookieComponent,
}
// New creates a new component for a componentType
func New(componentType string) Component {
switch componentType {
case "body":
return NewBody()
case "query":
return NewQuery()
case "path":
return NewPath()
case "header":
return NewHeader()
case "cookie":
return NewCookie()
}
return nil
}
var (
flatOpts = &flat.Options{
Safe: true,
Delimiter: "~",
}
)