nuclei/pkg/fuzz/component/component.go
Ice3man 5f0b7eb19b
feat: added initial live DAST server implementation (#5772)
* feat: added initial live DAST server implementation

* feat: more logging + misc additions

* feat: auth file support enhancements for more complex scenarios + misc

* feat: added io.Reader support to input providers for http

* feat: added stats db to fuzzing + use sdk for dast server + misc

* feat: more additions and enhancements

* misc changes to live server

* misc

* use utils pprof server

* feat: added simpler stats tracking system

* feat: fixed analyzer timeout issue + missing case fix

* misc changes fix

* feat: changed the logics a bit + misc changes and additions

* feat: re-added slope checks + misc

* feat: added baseline measurements for time based checks

* chore(server): fix typos

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(templates): potential DOM XSS

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(authx): potential NIL deref

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* feat: misc review changes

* removed debug logging

* feat: remove existing cookies only

* feat: lint fixes

* misc

* misc text update

* request endpoint update

* feat: added tracking for status code, waf-detection & grouped errors (#6028)

* feat: added tracking for status code, waf-detection & grouped errors

* lint error fixes

* feat: review changes + moving to package + misc

---------

Co-authored-by: sandeep <8293321+ehsandeep@users.noreply.github.com>

* fix var dump (#5921)

* fix var dump

* fix dump test

* Added filename length restriction for debug mode (-srd flag) (#5931)

Co-authored-by: Andrey Matveenko <an.matveenko@vkteam.ru>

* more updates

* Update pkg/output/stats/waf/waf.go

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: sandeep <8293321+ehsandeep@users.noreply.github.com>
Co-authored-by: Dwi Siswanto <25837540+dwisiswant0@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Dogan Can Bakir <65292895+dogancanbakir@users.noreply.github.com>
Co-authored-by: 9flowers <51699499+Lercas@users.noreply.github.com>
Co-authored-by: Andrey Matveenko <an.matveenko@vkteam.ru>
Co-authored-by: Sandeep Singh <sandeep@projectdiscovery.io>
2025-02-13 18:46:28 +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,
RequestHeaderComponent,
RequestPathComponent,
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: "~",
}
)