mirror of
https://github.com/projectdiscovery/httpx.git
synced 2024-08-16 21:10:23 +03:00
Merge pull request #1761 from projectdiscovery/support_multiple_values
Support multiple values
This commit is contained in:
commit
e432123e95
12
README.md
12
README.md
@ -113,6 +113,7 @@ PROBES:
|
||||
-websocket display server using websocket
|
||||
-ip display host ip
|
||||
-cname display host cname
|
||||
-extract-fqdn, -efqdn get domain and subdomains from response body and header in jsonl/csv output
|
||||
-asn display host asn information
|
||||
-cdn display cdn/waf in use (default true)
|
||||
-probe display probe status
|
||||
@ -131,15 +132,15 @@ MATCHERS:
|
||||
-mlc, -match-line-count string match response body with specified line count (-mlc 423,532)
|
||||
-mwc, -match-word-count string match response body with specified word count (-mwc 43,55)
|
||||
-mfc, -match-favicon string[] match response with specified favicon hash (-mfc 1494302000)
|
||||
-ms, -match-string string match response with specified string (-ms admin)
|
||||
-mr, -match-regex string match response with specified regex (-mr admin)
|
||||
-ms, -match-string string[] match response with specified string (-ms admin)
|
||||
-mr, -match-regex string[] match response with specified regex (-mr admin)
|
||||
-mcdn, -match-cdn string[] match host with specified cdn provider (cloudfront, fastly, google, leaseweb, stackpath)
|
||||
-mrt, -match-response-time string match response with specified response time in seconds (-mrt '< 1')
|
||||
-mdc, -match-condition string match response with dsl expression condition
|
||||
|
||||
EXTRACTOR:
|
||||
-er, -extract-regex string[] display response content with matched regex
|
||||
-ep, -extract-preset string[] display response content matched by a pre-defined regex (mail,url,ipv4)
|
||||
-ep, -extract-preset string[] display response content matched by a pre-defined regex (url,ipv4,mail)
|
||||
|
||||
FILTERS:
|
||||
-fc, -filter-code string filter response with specified status code (-fc 403,401)
|
||||
@ -148,8 +149,8 @@ FILTERS:
|
||||
-flc, -filter-line-count string filter response body with specified line count (-flc 423,532)
|
||||
-fwc, -filter-word-count string filter response body with specified word count (-fwc 423,532)
|
||||
-ffc, -filter-favicon string[] filter response with specified favicon hash (-ffc 1494302000)
|
||||
-fs, -filter-string string filter response with specified string (-fs admin)
|
||||
-fe, -filter-regex string filter response with specified regex (-fe admin)
|
||||
-fs, -filter-string string[] filter response with specified string (-fs admin)
|
||||
-fe, -filter-regex string[] filter response with specified regex (-fe admin)
|
||||
-fcdn, -filter-cdn string[] filter host with specified cdn provider (cloudfront, fastly, google, leaseweb, stackpath)
|
||||
-frt, -filter-response-time string filter response with specified response time in seconds (-frt '> 1')
|
||||
-fdc, -filter-condition string filter response with dsl expression condition
|
||||
@ -218,6 +219,7 @@ CONFIGURATIONS:
|
||||
-no-decode avoid decoding body
|
||||
-tlsi, -tls-impersonate enable experimental client hello (ja3) tls randomization
|
||||
-no-stdin Disable Stdin processing
|
||||
-hae, -http-api-endpoint string experimental http api endpoint
|
||||
|
||||
DEBUG:
|
||||
-health-check, -hc run diagnostic check up
|
||||
|
@ -180,16 +180,16 @@ type Options struct {
|
||||
InputRawRequest string
|
||||
rawRequest string
|
||||
RequestBody string
|
||||
OutputFilterString string
|
||||
OutputMatchString string
|
||||
OutputFilterRegex string
|
||||
OutputMatchRegex string
|
||||
OutputFilterString goflags.StringSlice
|
||||
OutputMatchString goflags.StringSlice
|
||||
OutputFilterRegex goflags.StringSlice
|
||||
OutputMatchRegex goflags.StringSlice
|
||||
Retries int
|
||||
Threads int
|
||||
Timeout int
|
||||
Delay time.Duration
|
||||
filterRegex *regexp.Regexp
|
||||
matchRegex *regexp.Regexp
|
||||
filterRegexes []*regexp.Regexp
|
||||
matchRegexes []*regexp.Regexp
|
||||
VHost bool
|
||||
VHostInput bool
|
||||
Smuggling bool
|
||||
@ -359,8 +359,8 @@ func ParseOptions() *Options {
|
||||
flagSet.StringVarP(&options.OutputMatchLinesCount, "match-line-count", "mlc", "", "match response body with specified line count (-mlc 423,532)"),
|
||||
flagSet.StringVarP(&options.OutputMatchWordsCount, "match-word-count", "mwc", "", "match response body with specified word count (-mwc 43,55)"),
|
||||
flagSet.StringSliceVarP(&options.OutputMatchFavicon, "match-favicon", "mfc", nil, "match response with specified favicon hash (-mfc 1494302000)", goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringVarP(&options.OutputMatchString, "match-string", "ms", "", "match response with specified string (-ms admin)"),
|
||||
flagSet.StringVarP(&options.OutputMatchRegex, "match-regex", "mr", "", "match response with specified regex (-mr admin)"),
|
||||
flagSet.StringSliceVarP(&options.OutputMatchString, "match-string", "ms", nil, "match response with specified string (-ms admin)", goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringSliceVarP(&options.OutputMatchRegex, "match-regex", "mr", nil, "match response with specified regex (-mr admin)", goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringSliceVarP(&options.OutputMatchCdn, "match-cdn", "mcdn", nil, fmt.Sprintf("match host with specified cdn provider (%s)", cdncheck.DefaultCDNProviders), goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringVarP(&options.OutputMatchResponseTime, "match-response-time", "mrt", "", "match response with specified response time in seconds (-mrt '< 1')"),
|
||||
flagSet.StringVarP(&options.OutputMatchCondition, "match-condition", "mdc", "", "match response with dsl expression condition"),
|
||||
@ -378,8 +378,8 @@ func ParseOptions() *Options {
|
||||
flagSet.StringVarP(&options.OutputFilterLinesCount, "filter-line-count", "flc", "", "filter response body with specified line count (-flc 423,532)"),
|
||||
flagSet.StringVarP(&options.OutputFilterWordsCount, "filter-word-count", "fwc", "", "filter response body with specified word count (-fwc 423,532)"),
|
||||
flagSet.StringSliceVarP(&options.OutputFilterFavicon, "filter-favicon", "ffc", nil, "filter response with specified favicon hash (-ffc 1494302000)", goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringVarP(&options.OutputFilterString, "filter-string", "fs", "", "filter response with specified string (-fs admin)"),
|
||||
flagSet.StringVarP(&options.OutputFilterRegex, "filter-regex", "fe", "", "filter response with specified regex (-fe admin)"),
|
||||
flagSet.StringSliceVarP(&options.OutputFilterString, "filter-string", "fs", nil, "filter response with specified string (-fs admin)", goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringSliceVarP(&options.OutputFilterRegex, "filter-regex", "fe", nil, "filter response with specified regex (-fe admin)", goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringSliceVarP(&options.OutputFilterCdn, "filter-cdn", "fcdn", nil, fmt.Sprintf("filter host with specified cdn provider (%s)", cdncheck.DefaultCDNProviders), goflags.NormalizedStringSliceOptions),
|
||||
flagSet.StringVarP(&options.OutputFilterResponseTime, "filter-response-time", "frt", "", "filter response with specified response time in seconds (-frt '> 1')"),
|
||||
flagSet.StringVarP(&options.OutputFilterCondition, "filter-condition", "fdc", "", "filter response with dsl expression condition"),
|
||||
@ -610,16 +610,22 @@ func (options *Options) ValidateOptions() error {
|
||||
if options.filterContentLength, err = stringz.StringToSliceInt(options.OutputFilterContentLength); err != nil {
|
||||
return errors.Wrap(err, "Invalid value for filter content length option")
|
||||
}
|
||||
if options.OutputFilterRegex != "" {
|
||||
if options.filterRegex, err = regexp.Compile(options.OutputFilterRegex); err != nil {
|
||||
for _, filterRegexStr := range options.OutputFilterRegex {
|
||||
filterRegex, err := regexp.Compile(filterRegexStr)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Invalid value for regex filter option")
|
||||
}
|
||||
options.filterRegexes = append(options.filterRegexes, filterRegex)
|
||||
}
|
||||
if options.OutputMatchRegex != "" {
|
||||
if options.matchRegex, err = regexp.Compile(options.OutputMatchRegex); err != nil {
|
||||
|
||||
for _, matchRegexStr := range options.OutputMatchRegex {
|
||||
matchRegex, err := regexp.Compile(matchRegexStr)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Invalid value for match regex option")
|
||||
}
|
||||
options.matchRegexes = append(options.matchRegexes, matchRegex)
|
||||
}
|
||||
|
||||
if options.matchLinesCount, err = stringz.StringToSliceInt(options.OutputMatchLinesCount); err != nil {
|
||||
return errors.Wrap(err, "Invalid value for match lines count option")
|
||||
}
|
||||
|
@ -846,10 +846,19 @@ func (r *Runner) RunEnumeration() {
|
||||
if len(r.options.filterWordsCount) > 0 && sliceutil.Contains(r.options.filterWordsCount, resp.Words) {
|
||||
continue
|
||||
}
|
||||
if r.options.filterRegex != nil && r.options.filterRegex.MatchString(resp.Raw) {
|
||||
if r.options.filterRegexes != nil {
|
||||
shouldContinue := false
|
||||
for _, filterRegex := range r.options.filterRegexes {
|
||||
if filterRegex.MatchString(resp.Raw) {
|
||||
shouldContinue = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if shouldContinue {
|
||||
continue
|
||||
}
|
||||
if r.options.OutputFilterString != "" && stringsutil.ContainsAnyI(resp.Raw, r.options.OutputFilterString) {
|
||||
}
|
||||
if len(r.options.OutputFilterString) > 0 && stringsutil.EqualFoldAny(resp.Raw, r.options.OutputFilterString...) {
|
||||
continue
|
||||
}
|
||||
if len(r.options.OutputFilterFavicon) > 0 && stringsutil.EqualFoldAny(resp.FavIconMMH3, r.options.OutputFilterFavicon...) {
|
||||
@ -861,10 +870,19 @@ func (r *Runner) RunEnumeration() {
|
||||
if len(r.options.matchContentLength) > 0 && !sliceutil.Contains(r.options.matchContentLength, resp.ContentLength) {
|
||||
continue
|
||||
}
|
||||
if r.options.matchRegex != nil && !r.options.matchRegex.MatchString(resp.Raw) {
|
||||
if r.options.matchRegexes != nil {
|
||||
shouldContinue := false
|
||||
for _, matchRegex := range r.options.matchRegexes {
|
||||
if !matchRegex.MatchString(resp.Raw) {
|
||||
shouldContinue = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if shouldContinue {
|
||||
continue
|
||||
}
|
||||
if r.options.OutputMatchString != "" && !stringsutil.ContainsAnyI(resp.Raw, r.options.OutputMatchString) {
|
||||
}
|
||||
if len(r.options.OutputMatchString) > 0 && !stringsutil.ContainsAnyI(resp.Raw, r.options.OutputMatchString...) {
|
||||
continue
|
||||
}
|
||||
if len(r.options.OutputMatchFavicon) > 0 && !stringsutil.EqualFoldAny(resp.FavIconMMH3, r.options.OutputMatchFavicon...) {
|
||||
|
Loading…
Reference in New Issue
Block a user