Updated Jul 15, 2026

Fuzzing

Discover hidden parameters by response diff

Hidden parameter discovery by response comparison.

Agent

overview

What x8 does

x8 probes a known --url with a --wordlist of candidate parameter names. It compares responses against a learned baseline and keeps names that change status, length, or body.

Aim at the query string by default, or supply --body for POST and PUT. --max caps parameters per request; --delay paces rate-limited apps; --strict and --verify cut false positives.

Point --url and --wordlist at the node; it writes FOLDER and FILE of confirmed parameter names. Hand those names to ffuf or an injection scanner for value testing. Use --strict and --verify when catch-all pages would otherwise inflate hits.

source github.com/Sh1Yo/x8

use cases

Where x8 fits

Discover undocumented query parameters

Brute-force parameter names against a live endpoint and keep only the ones that change the response, exposing inputs the application never advertised.

Find hidden body and header parameters

Switch the injection point to the request body or headers to surface parameters that only take effect on POST, PUT, or in specific headers.

Feed an injection-testing stage

Hand the discovered parameters to a fuzzer or injection scanner so testing targets real, server-honored inputs instead of guessed ones.

Cut false positives with verification

Use strict comparison and the verify pass so reported parameters are confirmed against a baseline, not artifacts of a noisy page.

reference

x8 inputs and flags

46 inputs
NameTypeFlagDescription
maxSTRING--maxChange the maximum number of parameters per request. (default is <= 256 for query, 64 for headers and 512 for body)
urlSTRING--urlYou can add a custom injection point with %s. Multiple values are supported: https://url1 http://url2
bodySTRING--bodyExample body: '{"x":{%s}}'
httpSTRING--httpHTTP version. Supported versions: --http 1.1, --http 2
portSTRING--portPort to use with request file
testBOOLEAN--testPrints request and response
delaySTRING--delayDelay between requests in milliseconds [default: 0]

Showing key inputs. x8 exposes 46 inputs in total.

Full flag reference (46 inputs)
NameTypeFlagDescription
maxSTRING--maxChange the maximum number of parameters per request. (default is <= 256 for query, 64 for headers and 512 for body)
urlSTRING--urlYou can add a custom injection point with %s. Multiple values are supported: https://url1 http://url2
bodySTRING--bodyExample body: '{"x":{%s}}'
httpSTRING--httpHTTP version. Supported versions: --http 1.1, --http 2
portSTRING--portPort to use with request file
testBOOLEAN--testPrints request and response
delaySTRING--delayDelay between requests in milliseconds [default: 0]
forceBOOLEAN--forceForce searching for parameters on pages > 25MB. Remove an error in case there's 1
protoSTRING--protoProtocol to use with request file (default is "https")
proxySTRING--proxyProxy
encodeBOOLEAN--encodeEncodes query or body before making a request, i.e & -> %26, = -> %3D
invertBOOLEAN--invertBy default, parameters are sent within the body only in case PUT or POST methods
joinerSTRING--joinerHow to join parameter templates. Example: --joiner '&'. Default: urlencoded - '&', json - ', ', header values - '; '
methodSTRING--methodMultiple values are supported: -X GET POST
strictBOOLEAN--strictOnly report parameters that have changed the different parts of a page
verifyBOOLEAN--verifyVerify found parameters.
headersSTRING-HExample: 'one:one' 'two:two'
requestFILE--requestThe file with the raw http request
timeoutSTRING--timeoutHTTP request timeout in seconds. [default: 15]
verboseSTRING--verboseVerbose level 0/1/2 [default: 1]
workersSTRING--workersThe number of concurrent url checks. [default: 1]
split-bySTRING--split-bySplit the request into lines by the provided sequence. By default splits by \r, \n and \r\n
url-listFILE--urlYou can add a custom injection point with %s. Multiple values are supported: https://url1 http://url2
wordlistFILE--wordlist-w, --wordlist <wordlist>
data-typeSTRING--data-type-t, --data-type <data-type>
concurrencySTRING-cThe number of concurrent requests per url [default: 1]
replay-onceBOOLEAN--replay-onceIf a replay proxy is specified, send all found parameters within one request.
check-binaryBOOLEAN--check-binaryCheck the body of responses with binary content types
remove-emptyBOOLEAN--remove-emptySkip writing to file outputs of url:method pairs without found parameters
replay-proxySTRING--replay-proxyRequest target with every found parameter via the replay proxy at the end.
custom-valuesSTRING--custom-valuesValues for custom parameters (default is "1 0 false off null true yes no")
mimic-browserBOOLEAN--mimic-browserAdd default headers that browsers usually set.
output-formatSTRING--output-formatstandart, json, url, request [default: standart]
disable-colorsBOOLEAN--disable-colorsDisable colors
learn-requestsSTRING--learn-requestsSet the custom number of learn requests. [default: 9]
param-templateSTRING--param-template%k - key, %v - value. Example: --param-template 'user[%k]=%v'. Default: urlencoded - <%k=%v>, json - <"%k":%v>, headers - <%k=%v>
reflected-onlyBOOLEAN--reflected-onlyDisable page comparison and search for reflected parameters only.
recursion-depthSTRING--recursion-depthCheck the same list of parameters with the found parameters until there are no new parameters to be found. Conflicts with --verify for now.
disable-trustdnsBOOLEAN--disable-trustdnsCan solve some dns related problems
follow-redirectsBOOLEAN--follow-redirectsFollow redirections
progress-bar-lenSTRING--progress-bar-len[default: 26]
custom-parametersSTRING--custom-parametersCheck these parameters with non-random values like true/false yes/no (default is "admin bot captcha debug disable encryption env show sso test waf")
one-worker-per-hostBOOLEAN--one-worker-per-hostMultiple urls with the same host will be checked one after another,
disable-progress-barBOOLEAN--disable-progress-barDisable progress bar
disable-additional-checksBOOLEAN--disable-additional-checksDisable additional checks
disable-custom-parametersBOOLEAN--disable-custom-parametersDo not automatically check parameters like admin=true

example

Run x8

x8 · command
# x8: mine hidden parameters on an endpointx8 --url 'https://api.example.com/v1/user' --wordlist params.txt --max 30
sample output
[+] debug (reflected)[+] admin (length +412)[+] include (status 500)[+] source (reflected)[+] preview (length +88)[+] format (body changed)

guidance

Choosing x8

Use x8 when a stable endpoint may hide undocumented parameters. Prefer ffuf for path and file discovery. Pair with an injection scanner to test values after discovery.

arjun

Another hidden parameter finder. x8 leans on full page comparison across query, body, and headers.

ffuf

General web fuzzer for paths and values. Use it to fuzz the parameters x8 discovers, not to find them.

faq

x8 questions

It compares full responses against a learned baseline and checks status codes and reflections. --strict and --verify further confirm parameters that genuinely change behavior.

Run x8 yourself

A URL and a wordlist feed x8, which compares responses to confirm which hidden parameters the server honors and writes them as a queryable output.

Facts on this page come from the live Trickest tool library.