
Suite de descoberta de parâmetros ocultos
A ferramenta ajuda a identificar parâmetros ocultos que podem ser vulneráveis ou revelar funcionalidades interessantes que outros testadores podem não perceber. Sua alta precisão é alcançada através da comparação linha por linha das páginas, comparação de códigos de resposta e reflexões.
A documentação que explica cada funcionalidade pode ser acessada em https://sh1yo.art/x8docs/. O código-fonte da documentação está em /docs.md.
admin=true.x8 -u "https://example.com/" -w <wordlist>
Com parâmetros padrão:
x8 -u "https://example.com/?something=1" -w <wordlist>
/?something=1 equivale a /?something=1&%s
x8 -u "https://example.com/" -X POST -w <wordlist>
Ou com um corpo personalizado:
x8 -u "https://example.com/" -X POST -b '{"x":{%s}}' -w <wordlist>
%s será substituído por diferentes parâmetros, como {"x":{"a":"b3a1a", "b":"ce03a", ...}}
x8 -u "https://example.com/" "https://4rt.one/" -W0
x8 -u "https://example.com/" --param-template "user[%k]=%v" -w <wordlist>
Agora cada requisição seria algo como /?user[a]=hg2s4&user[b]=a34fa&...
Às vezes os parâmetros precisam ser codificados. Isso também é possível:
x8 -u "https://example.com/?path=..%2faction.php%3f%s%23" --encode -w <wordlist>
GET /?path=..%2faction.php%3fWTDa8%3Da7UOS%26rTIDA%3DexMFp...%23 HTTP/1.1
Host: example.com
x8 -u "https://example.com" --headers -w <wordlist>
Você também pode mirar cabeçalhos individuais:
x8 -u "https://example.com" --headers -H "Cookie: %s" -w <wordlist>
Você pode testar a ferramenta e compará-la com outras ferramentas nas seguintes URLs:
https://4rt.one/level1 (GET)
https://4rt.one/level3 (GET)
USAGE:
x8 [FLAGS] [OPTIONS]
FLAGS:
--append Append to the output file instead of overwriting it.
-B Equal to -x http://localhost:8080
--check-binary Check the body of responses with binary content types
--disable-additional-checks Private
--disable-colors
--disable-custom-parameters Do not automatically check parameters like admin=true
--disable-progress-bar
--disable-trustdns Can solve some dns related problems
--encode Encodes query or body before making a request, i.e & -> %26, = -> %3D
List of chars to encode: ", `, , <, >, &, #, ;, /, =, %
-L, --follow-redirects Follow redirections
--force Force searching for parameters on pages > 25MB. Remove an error in case there's 1
worker with --one-worker-per-host option.
-h, --help Prints help information
--headers Switch to header discovery mode.
NOTE Content-Length and Host headers are automatically removed from the list
--invert By default, parameters are sent within the body only in case PUT or POST methods
are used.
It's possible to overwrite this behavior by specifying the option
--mimic-browser Add default headers that browsers usually set.
--one-worker-per-host Multiple urls with the same host will be checked one after another,
while urls with different hosts - are in parallel.
Doesn't increase the number of workers
--reflected-only Disable page comparison and search for reflected parameters only.
--remove-empty Skip writing to file outputs of url:method pairs without found parameters
--replay-once If a replay proxy is specified, send all found parameters within one request.
--strict Only report parameters that have changed the different parts of a page
--test Prints request and response
-V, --version Prints version information
--verify Verify found parameters.
OPTIONS:
-b, --body <body> Example: --body '{"x":{%s}}'
Available variables: {{random}}
-c <concurrency> The number of concurrent requests per url [default: 1]
--custom-parameters <custom-parameters>
Check these parameters with non-random values like true/false yes/no
(default is "admin bot captcha debug disable encryption env show sso test waf")
--custom-values <custom-values>
Values for custom parameters (default is "1 0 false off null true yes no")
-t, --data-type <data-type>
Available: urlencode, json
Can be detected automatically if --body is specified (default is "urlencode")
-d, --delay <Delay between requests in milliseconds> [default: 0]
-H <headers> Example: -H 'one:one' 'two:two'
--http <http> HTTP version. Supported versions: --http 1.1, --http 2
-j, --joiner <joiner>
How to join parameter templates. Example: --joiner '&'
Default: urlencoded - '&', json - ', ', header values - '; '
--learn-requests <learn-requests-count> Set the custom number of learn requests. [default: 9]
-m, --max <max>
Change the maximum number of parameters per request.
(default is <= 256 for query, 64 for headers and 512 for body)
-X, --method <methods> Multiple values are supported: -X GET POST
-o, --output <file>
-O, --output-format <output-format> standart, json, url, request [default: standart]
-P, --param-template <parameter-template>
%k - key, %v - value. Example: --param-template 'user[%k]=%v'
Default: urlencoded - <%k=%v>, json - <"%k":%v>, headers - <%k=%v>
-p, --port <port> Port to use with request file
--progress-bar-len <progress-bar-len> [default: 26]
--proto <proto> Protocol to use with request file (default is "https")
-x, --proxy <proxy>
--recursion-depth <recursion-depth>
Check the same list of parameters with the found parameters until there are no new parameters to be found.
Conflicts with --verify for now.
--replay-proxy <replay-proxy>
Request target with every found parameter via the replay proxy at the end.
-r, --request <request> The file with the raw http request
--save-responses <save-responses>
Save request and response to a directory when a parameter is found
--split-by <split-by>
Split the request into lines by the provided sequence. By default splits by \r, \n and \r\n
--timeout <timeout> HTTP request timeout in seconds. [default: 15]
-u, --url <url>
You can add a custom injection point with %s.
Multiple urls and filenames are supported:
-u filename.txt
-u https://url1 http://url2
-v, --verbose <verbose> Verbose level 0/1/2 [default: 1]
-w, --wordlist <wordlist>
The file with parameters (leave empty to read from stdin) [default: ]
-W, --workers <workers>
The number of concurrent url checks.
Use -W0 to run everything in parallel [default: 1]
Parâmetros:
Cabeçalhos:
A integração com o Burp Suite é feita através da extensão send to.
Dê um nome à entrada e insira a seguinte linha no comando:
/path/to/x8 --progress-bar-len 20 -c 3 -r %R -w /path/to/wordlist --proto %T --port %P
Você também pode adicionar seus argumentos frequentemente usados, como --output-format, --replay-proxy, --recursion-depth, ...
NOTA se a barra de progresso não funcionar corretamente — tente reduzir o valor de --progress-bar-len.
Altere de Run in background para Run in terminal.

Se você tiver problemas com a renderização de fontes no terminal, pode ajustar as opções do xterm em Send to Miscellaneous Options. Basta substituir o conteúdo existente por xterm -rv -fa 'Monospace' -fs 10 -hold -e %C, ou substituir xterm pelo seu emulador de terminal preferido.
Agora você pode ir para a aba proxy/repeater e enviar a requisição para a ferramenta:

Na próxima janela, você pode modificar o comando e executá-lo em uma nova janela de terminal.

Após executar o comando, uma nova janela de terminal aparecerá exibindo a ferramenta em execução.

NOTA: A partir da v4.0.0, instalar via cargo install usa o branch crate em vez de main. Esse branch inclui a biblioteca reqwest original que realiza normalizações HTTP e impede o envio de requisições inválidas. Se você quiser usar a versão modificada do reqwest sem essas limitações, recomendo instalar pela página de Releases ou compilar a partir dos fontes.
Docker
git clone https://github.com/Sh1Yo/x8
cd x8
docker build -t x8 .
Linux
# pacman -Sy x8
git clone https://github.com/sh1yo/x8
cd x8
cargo build --release
# mova o binário para o $PATH para poder usá-lo sem especificar o caminho completo
cp ./target/release/x8 /usr/local/bin
# se disser que /usr/local/bin não existe, tente
# sudo cp ./target/release/x8 /usr/bin
cargo install x8
Mac
git clone https://github.com/sh1yo/x8
cd x8
cargo build --release
# mova o binário para o $PATH para poder usá-lo sem especificar o caminho completo
cp ./target/release/x8 /usr/local/bin
cargo install x8
Windows