
Entdeckungssuite für verborgene Parameter
Das Tool hilft bei der Identifizierung versteckter Parameter, die möglicherweise angreifbar sind oder interessante Funktionalitäten offenlegen, die von anderen Testern übersehen werden könnten. Die hohe Genauigkeit wird durch zeilenweisen Vergleich der Seiten, Vergleich der Antwortcodes und Reflektionen erreicht.
Die Dokumentation, die jede Funktion erklärt, ist unter https://sh1yo.art/x8docs/ abrufbar. Der Quelltext der Dokumentation befindet sich unter /docs.md.
x8 -u "https://example.com/" -w <wortliste>
Mit Standardparametern:
x8 -u "https://example.com/?something=1" -w <wortliste>
/?something=1 entspricht /?something=1&%s
x8 -u "https://example.com/" -X POST -w <wortliste>
Oder mit einem benutzerdefinierten Body:
x8 -u "https://example.com/" -X POST -b '{"x":{%s}}' -w <wortliste>
%s wird durch verschiedene Parameter ersetzt, z. B. {"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 <wortliste>
Nun würde jede Anfrage wie /?user[a]=hg2s4&user[b]=a34fa&... aussehen.
Manchmal müssen Parameter kodiert werden. Auch das ist möglich:
x8 -u "https://example.com/?path=..%2faction.php%3f%s%23" --encode -w <wortliste>
GET /?path=..%2faction.php%3fWTDa8%3Da7UOS%26rTIDA%3DexMFp...%23 HTTP/1.1
Host: example.com
x8 -u "https://example.com" --headers -w <wortliste>
Sie können auch einzelne Header anvisieren:
x8 -u "https://example.com" --headers -H "Cookie: %s" -w <wortliste>
Sie können das Tool testen und mit anderen Tools auf den folgenden URLs vergleichen:
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]
Parameter:
Header:
Die Integration in die Burp-Suite erfolgt über die Send to-Erweiterung.
Geben Sie dem Eintrag einen Namen und fügen Sie die folgende Zeile in den Befehl ein:
/path/to/x8 --progress-bar-len 20 -c 3 -r %R -w /path/to/wordlist --proto %T --port %P
Sie können auch Ihre häufig verwendeten Argumente hinzufügen, wie z. B. --output-format, --replay-proxy, --recursion-depth, ..
HINWEIS: Wenn die Fortschrittsanzeige nicht richtig funktioniert, versuchen Sie, den Wert von --progress-bar-len zu verringern.
Wechseln Sie von „Run in background“ zu „Run in terminal“.

Falls Probleme mit der Schriftdarstellung im Terminal auftreten, können Sie die xterm-Optionen unter Send to Miscellaneous Options anpassen. Ersetzen Sie den vorhandenen Inhalt einfach durch xterm -rv -fa 'Monospace' -fs 10 -hold -e %C oder ersetzen Sie xterm durch Ihren bevorzugten Terminalemulator.
Jetzt können Sie zum Proxy/Repeater-Tab gehen und die Anfrage an das Tool senden:

Im nächsten Dialog können Sie den Befehl ändern und in einem neuen Terminalfenster ausführen.

Nach der Ausführung des Befehls erscheint ein neues Terminalfenster, das das laufende Tool anzeigt.

HINWEIS: Ab Version 4.0.0 verwendet die Installation über cargo install den crate-Branch anstelle von main. Dieser Branch enthält die originale reqwest-Bibliothek, die HTTP-Normalisierungen durchführt und das Senden ungültiger Anfragen verhindert. Wenn Sie die modifizierte reqwest-Version ohne diese Einschränkungen verwenden möchten, empfehle ich die Installation über die Seite „Releases“ oder das Erstellen aus dem Quellcode.
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
# Verschieben Sie die Binärdatei in $PATH, um sie ohne vollständigen Pfad verwenden zu können
cp ./target/release/x8 /usr/local/bin
# Falls /usr/local/bin nicht existiert, versuchen Sie:
# sudo cp ./target/release/x8 /usr/bin
cargo install x8
Mac
git clone https://github.com/sh1yo/x8
cd x8
cargo build --release
# Verschieben Sie die Binärdatei in $PATH, um sie ohne vollständigen Pfad verwenden zu können
cp ./target/release/x8 /usr/local/bin
cargo install x8
Windows