On this page 15 sections
  1. What is FFUF?
  2. Directory fuzzing
  3. Extension fuzzing
  4. Page fuzzing
  5. Recursive fuzzing
  6. Subdomain fuzzing
  7. Virtual host fuzzing
  8. Filtering responses
  9. GET parameter fuzzing
  10. POST parameter fuzzing
  11. Parameter value fuzzing
  12. Useful SecLists wordlists
  13. Create a numeric wordlist
  14. Local DNS entry
  15. Validate requests with curl
01

What is FFUF?

FFUF is a web fuzzing tool that replaces the FUZZ keyword with values from a wordlist. By placing FUZZ in different parts of a request, it can be used to discover hidden directories, files, extensions, subdomains, virtual hosts, parameters and parameter values.

Display FFUF help
ffuf -h
02

Directory fuzzing

Place FUZZ directly in the URL path to test directory or file names from a wordlist. Each word replaces FUZZ and FFUF sends a request for the resulting path.

Discover directories
ffuf -w wordlist.txt:FUZZ -u https://sam0x.me/FUZZ
03

Extension fuzzing

FUZZ can be placed after a filename to discover valid file extensions. This is useful when the filename is known but its extension is not.

Discover file extensions
ffuf -w wordlist.txt:FUZZ -u https://sam0x.me/indexFUZZ
04

Page fuzzing

When the application technology or extension is already known, FUZZ can be placed in the filename while keeping the extension fixed.

Discover PHP pages
ffuf -w wordlist.txt:FUZZ -u https://sam0x.me/blog/FUZZ.php
05

Recursive fuzzing

FFUF can recursively continue fuzzing inside discovered directories. The recursion depth controls how many directory levels are explored, while -e adds extensions to test.

Recursive discovery
ffuf -w wordlist.txt:FUZZ -u https://sam0x.me/FUZZ -recursion -recursion-depth 1 -e .php -v
06

Subdomain fuzzing

FUZZ can be inserted into the hostname to test possible subdomain names from a DNS wordlist.

Discover subdomains
ffuf -w wordlist.txt:FUZZ -u https://FUZZ.sam0x.me/
07

Virtual host fuzzing

Virtual hosts can share the same IP address while responding differently depending on the HTTP Host header. Instead of changing the destination URL, FUZZ is inserted into the Host header.

Discover virtual hosts
ffuf -w wordlist.txt:FUZZ -u https://sam0x.me/ -H 'Host: FUZZ.sam0x.me' -fs xxx
08

Filtering responses

Fuzzing can generate many responses that look identical. The -fs option filters responses by their size, making it easier to remove known false positives. Replace xxx with the response size that should be ignored.

Filter by response size
ffuf -w wordlist.txt:FUZZ -u https://sam0x.me/FUZZ -fs xxx
09

GET parameter fuzzing

FUZZ can replace a parameter name in the query string. This allows testing a list of possible parameter names against an endpoint.

Discover GET parameters
ffuf -w wordlist.txt:FUZZ -u https://admin.sam0x.me/admin/admin.php?FUZZ=key -fs xxx
10

POST parameter fuzzing

POST parameters can be fuzzed by placing FUZZ inside the request body. The request method is defined with -X POST and the form content type is supplied through the HTTP header.

Discover POST parameters
ffuf -w wordlist.txt:FUZZ -u https://admin.sam0x.me/admin/admin.php -X POST -d 'FUZZ=key' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx
11

Parameter value fuzzing

Once a parameter name is known, FUZZ can be placed in its value instead. The wordlist then provides the candidate values that FFUF sends to the application.

Fuzz POST parameter values
ffuf -w ids.txt:FUZZ -u https://admin.sam0x.me/admin/admin.php -X POST -d 'id=FUZZ' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx
12

Useful SecLists wordlists

Different fuzzing targets benefit from different wordlists. The cheat sheet uses SecLists collections for directories, extensions, subdomains and parameter names.

Directory and page names
/opt/useful/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
Web extensions
/opt/useful/seclists/Discovery/Web-Content/web-extensions.txt
Subdomain names
/opt/useful/seclists/Discovery/DNS/subdomains-top1million-5000.txt
HTTP parameter names
/opt/useful/seclists/Discovery/Web-Content/burp-parameter-names.txt
13

Create a numeric wordlist

A simple numeric sequence can be generated when an application uses predictable numerical values such as IDs.

Create IDs from 1 to 1000
for i in $(seq 1 1000); do echo $i >> ids.txt; done
14

Local DNS entry

When a lab hostname does not exist in public DNS, it can be mapped manually to a target IP through /etc/hosts.

Map target1.sam0x.me locally
sudo sh -c 'echo "SERVER_IP target1.sam0x.me" >> /etc/hosts'
15

Validate requests with curl

Before fuzzing a POST request, curl can be used to reproduce and verify the request manually. This helps confirm the endpoint, parameter name, request body and content type.

Send a POST request
curl https://admin.sam0x.me/admin/admin.php -X POST -d 'id=key' -H 'Content-Type: application/x-www-form-urlencoded'