HTTP Parameter Crawling and Discovery
Parameter discovery finds GET and POST parameters the application accepts but doesn't expose in visible forms or links. Hidden parameters are a direct path to injection vulnerabilities, IDOR, and business logic issues. Run this after content discovery so you have a full list of endpoints to target. Results feed into SQL injection detection, SSRF detection, and IDOR testing.
Arjun — Parameter Discovery
Arjun is the go-to tool for parameter discovery. It tests large wordlists efficiently by grouping parameters and comparing responses:
[+] Parameters found: id, user, token, debug
Explain command
| -u | Specifies the target URL to scan for hidden HTTP parameters. |
| http://$TARGET_IP:$PORT/endpoint | Target URL with variable host IP, port, and endpoint path. |
Explain command
| -u | Specifies the target URL to scan for parameters. |
| http://$TARGET_IP:$PORT/endpoint | Target URL with variable host IP and port to the endpoint. |
| -m | Specifies the HTTP method to use for requests. |
| POST | Uses HTTP POST method for parameter discovery. |
Explain command
| -u | Specifies the target URL to scan for hidden parameters. |
| http://$TARGET_IP:$PORT/endpoint | Target URL with variable host IP and port to probe. |
| -m | Sets the request method/format for parameter discovery. |
| JSON | Sends parameters in JSON format in the request body. |
Run against multiple endpoints at once by providing a file:
Explain command
| -i endpoints.txt | Input file containing list of endpoints to scan. |
| -o arjun_results.json | Save discovered parameters output to specified JSON file. |
For authenticated endpoints, add the session cookie:
Explain command
| -u | Target URL to scan for hidden HTTP parameters. |
| http://$TARGET_IP:$PORT/api/endpoint | Target host IP, port, and API endpoint path to fuzz. |
| -H | Specify a custom HTTP header to include in requests. |
| "Cookie: session=REPLACE_ME" | Session cookie header value used for authenticated requests. |
| -m | Specify the HTTP method to use for parameter discovery. |
| GET | Use HTTP GET method when sending parameter fuzzing requests. |
x8 — Parameter Bruteforce
x8 is faster than Arjun for high-volume parameter discovery and handles response differences more granularly:
Explain command
| -u http://$TARGET_IP:$PORT/endpoint | Target URL to fuzz for hidden HTTP parameters. |
| -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt | Wordlist of parameter names to use during fuzzing. |
Explain command
| -u http://$TARGET_IP:$PORT/endpoint | Target URL to probe for hidden HTTP parameters. |
| -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt | Wordlist file containing parameter names to fuzz with. |
| -m POST | Use HTTP POST method for parameter discovery requests. |
ffuf for Manual Parameter Fuzzing
When you already know a parameter exists and want to test values, ffuf is more flexible than dedicated parameter discovery tools:
Explain command
| -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt | Wordlist file containing parameter names to fuzz. |
| -u http://$TARGET_IP:$PORT/page?FUZZ=test | Target URL with FUZZ keyword marking the injection point. |
| $TARGET_IP:$PORT | Variable placeholders for the target host IP and port. |
| -mc 200,204,301,302,307,401,403 | Match only responses with these HTTP status codes. |
| -fs 1234 | Filter out responses with a body size of 1234 bytes. |
Explain command
| -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt | Wordlist path used for fuzzing parameter names. |
| -u http://$TARGET_IP:$PORT/page | Target URL with host and port placeholders. |
| -X POST | Use HTTP POST method for requests. |
| -d "FUZZ=test" | POST body data with FUZZ keyword as the parameter name placeholder. |
| -H "Content-Type: application/x-www-form-urlencoded" | Set Content-Type header for URL-encoded form data. |
| -mc 200,204,301,302,307,401,403 | Match only responses with these HTTP status codes. |
| -fs 1234 | Filter out responses with a body size of 1234 bytes. |
JavaScript Source Mining
JavaScript files often contain API endpoints and parameter names not visible in HTML. Extract them before running parameter discovery:
Explain command
| -s | Silent mode; suppresses progress meter and error messages. |
| -k | Allow insecure TLS connections, skipping certificate verification. |
| http://$TARGET_IP:$PORT/app.js | Target URL with variable host and port to fetch app.js. |
| -oP | Output only matched text using Perl-compatible regex. |
| (?<=[?&])[a-zA-Z_][a-zA-Z0-9_]*(?==) | PCRE lookaround to extract URL query parameter names. |
| -u | Output only unique lines, suppressing duplicates. |
Explain command
| -s | Silent mode; suppresses progress meter and error messages. |
| -k | Allows insecure TLS connections by skipping certificate verification. |
| http://$TARGET_IP:$PORT/app.js | Target URL with variable host and port to fetch the JS file. |
| -oE | Enables extended regex and prints only the matching part of each line. |
| "[a-z_][a-z0-9_]{2,}"\s*: | Regex pattern to extract lowercase JSON-style key names. |
| -d | Specifies characters to delete; removes quotes and colons from output. |
| '":' | Set of characters (double-quote, colon) to strip via tr. |
| -u | Outputs only unique sorted lines, removing duplicates. |
Discovered parameters are the starting point for injection testing. Take any parameter that accepts user input and test it through SQL injection detection, SSTI detection, and SSRF detection.
References
-
HTTP parameter discovery tool supporting GET, POST, JSON, and XML
-
Hidden HTTP parameter discovery tool with response comparison
-
Parameter value fuzzing and filtering options
Was this helpful?
Your feedback helps improve this page.