25 juli 2026 · 6 min leestijd · tools
ffuf (Fuzz Faster U Fool) is een open-source webfuzzer, geschreven in Go en in 2018 gemaakt door Joona Hoikkala (@joohoi). Je gebruikt ffuf om plekken in een webapplicatie te ontdekken die je niet tegenkomt door gewoon rond te klikken: verborgen mappen en bestanden, ongedocumenteerde parameters, virtual hosts en subdomeinen. In plaats van te gokken werk je een woordenlijst af. ffuf vraagt elk woord uit die lijst op bij de server en laat zien welke bestaan.
Waar in het verzoek dat woord belandt, bepaal je zelf met het keyword FUZZ. Je zet FUZZ op de plek die je wilt aftasten en ffuf vult daar telkens de volgende regel uit de lijst in. Aan de statuscode en de grootte van elke reactie zie je of er op dat adres iets bestaat. ffuf verstuurt veel verzoeken tegelijk en loopt zo’n lijst in seconden door, en dat maakt het ons standaardgereedschap voor de enumeratie-fase van een webpentest.
De plek van dat keyword bepaalt wát je zoekt. Staat FUZZ in het pad, dan zoek je mappen en bestanden. Staat het in de Host-header, dan zoek je virtual hosts. Staat het in de querystring of de body, dan test je parameters. Zo dekt één tool het hele enumeratiewerk af.
In een webapplicatie-pentest is ffuf een van de eerste tools die we inzetten. Denk aan een vergeten /admin-paneel, een back-up als database.sql.bak, een blootgestelde .git-map of een test-endpoint dat nooit is opgeruimd. Zulke vondsten zijn vaak het beginpunt van een serieuze kwetsbaarheid.
Daarnaast zetten we ffuf in om virtual hosts te ontdekken die niet in DNS staan, om verborgen GET- en POST-parameters te vinden, en om subdomeinen te enumereren. ffuf doet hetzelfde werk als Gobuster en het oudere Wfuzz, maar is flexibeler in waar je fuzzt en daarom onze standaardkeuze. Wat ffuf naar boven haalt, onderzoeken we daarna handmatig in Burp Suite, en concrete kwetsbaarheden volgen we op met Nuclei of SQLMap.
Op Kali zit ffuf in de standaard-repositories:
sudo apt install ffuf
Heb je een Go-toolchain, dan haal je de nieuwste versie rechtstreeks binnen met go install github.com/ffuf/ffuf/v2@latest. Op macOS werkt brew install ffuf. Voor de woordenlijsten gebruiken wij SecLists, dat op Kali onder /usr/share/seclists/ staat.
Het minimale commando bestaat uit een woordenlijst (-w) en een URL (-u) met daarin het FUZZ-keyword. ffuf vervangt FUZZ door elke regel uit de lijst en toont welke reacties de moeite waard zijn:
# Verborgen mappen en bestanden zoeken: FUZZ staat in het pad
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
-u https://target.example.com/FUZZ
Standaard toont ffuf alleen reacties met een interessante statuscode (onder andere 200, 301, 302, 401, 403 en 500). Per treffer zie je de statuscode, de grootte in bytes, en het aantal woorden en regels. Die getallen heb je straks nodig om ruis weg te filteren.
| Flag | Doel | Voorbeeld |
|---|---|---|
-w |
Woordenlijst (met :NAAM een eigen keyword) |
ffuf -w lijst.txt:FUZZ -u https://target/FUZZ |
-u |
Doel-URL met daarin het FUZZ-keyword |
ffuf -w lijst.txt -u https://target/FUZZ |
-mc |
Alleen deze statuscodes tonen (match) | ffuf ... -mc 200,204,301,403 |
-fc |
Deze statuscodes verbergen (filter) | ffuf ... -fc 404,403 |
-fs |
Reacties van deze grootte verbergen | ffuf ... -fs 4242 |
-fw |
Reacties met dit aantal woorden verbergen | ffuf ... -fw 12 |
-fl |
Reacties met dit aantal regels verbergen | ffuf ... -fl 1 |
-ac |
Autocalibration: leer en filter de standaardpagina | ffuf ... -ac |
-e |
Extensies achter het keyword plakken | ffuf ... -e .php,.bak,.zip |
-recursion |
Gevonden mappen automatisch verder doorzoeken | ffuf ... -recursion -recursion-depth 2 |
-H |
Extra header meesturen (mag FUZZ bevatten) |
ffuf ... -H "Host: FUZZ.target" |
-X / -d |
HTTP-methode en request-body (mag FUZZ bevatten) |
ffuf ... -X POST -d "user=admin&pass=FUZZ" |
-t |
Aantal gelijktijdige threads (standaard 40) | ffuf ... -t 100 |
Sommige servers antwoorden op elke URL met een 200 OK, ook op paden die niet bestaan. In plaats van een nette 404 krijg je dan een standaard ’niet gevonden’-pagina met code 200. Voor ffuf lijkt elke regel uit de lijst zo een treffer, en wordt de uitvoer onbruikbaar. Filteren haalt die ruis eruit.
Je filtert op de kenmerken van die standaardpagina. Zie je dat elke valse treffer precies 4242 bytes groot is, dan verberg je die met -fs 4242. Vaak is -fw (aantal woorden) of -fl (aantal regels) stabieler dan de grootte, omdat een dynamische pagina in bytes kan verschillen maar in structuur gelijk blijft.
Weet je die waarden niet vooraf, dan doet -ac het werk. Met autocalibration stuurt ffuf eerst een paar verzoeken naar willekeurige, zeker niet-bestaande paden, meet hoe de ’niet gevonden’-reactie eruitziet en filtert precies die reacties automatisch weg. In de praktijk begin je een scan vaak met -ac erbij, en verfijn je daarna handmatig met -fs of -fw als er nog ruis doorheen glipt.
Directories en bestanden met extensies. Naast mapnamen wil je ook bestanden vinden. Met -e plak je extensies achter elk woord, zodat ffuf zowel config als config.php en config.bak probeert. Autocalibration houdt de uitvoer schoon.
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-words.txt \
-u https://target.example.com/FUZZ \
-e .php,.bak,.zip,.txt -ac
Virtual host fuzzing. Eén IP-adres bedient vaak meerdere sites op basis van de Host-header. Door FUZZ in die header te zetten, ontdek je hostnamen die niet in DNS staan. De standaardsite geeft telkens dezelfde grootte terug, dus die filter je weg met -fs.
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u https://target.example.com/ \
-H "Host: FUZZ.target.example.com" -fs 4242
Verborgen GET-parameters. Een endpoint gedraagt zich soms anders zodra je de juiste parameter meestuurt. Zet FUZZ in de querystring en filter de reacties weg die niets veranderen aan de responsgrootte.
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u "https://target.example.com/api/item?FUZZ=1" -ac
POST-velden testen. Met -X POST en FUZZ in de body (-d) test je form-velden. Zo controleer je bijvoorbeeld welke veldnamen een reactie geven die afwijkt van de standaard-foutmelding.
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u https://target.example.com/login \
-X POST -d "FUZZ=test" \
-H "Content-Type: application/x-www-form-urlencoded" -ac
Een fuzzing-run valt op door het volume. Met de standaard 40 threads stuurt ffuf duizenden verzoeken per minuut vanaf één IP-adres, en dat laat een lange rij 404- en 403-regels in de webserverlogs achter. Een blue team dat op afwijkende request-aantallen let, ziet zo’n scan meteen.
Voor verdedigers komt het neer op een paar maatregelen. Een WAF of rate-limiter die het aantal verzoeken per IP begrenst, remt een fuzzing-run flink af en genereert een duidelijk signaal. Zorg daarnaast dat de applicatie op een niet-bestaande pagina een echte 404 teruggeeft in plaats van een 200, zodat een aanvaller niet eenvoudig kan filteren. En het belangrijkste blijft basishygiëne: laat geen back-ups, .git-mappen of vergeten adminpanelen op een productieserver staan, want dat is precies wat ffuf als eerste vindt.
Gebruik ffuf alleen op systemen waarvoor je expliciete, schriftelijke toestemming hebt. Een fuzzing-run genereert veel verkeer, kan een applicatie overbelasten en is zonder afgesproken scope juridisch ongeoorloofde toegang.
FUZZ-keyword overal staan (URL, header of body), waardoor één tool zowel directories als virtual hosts en parameters aankan, en het wordt actief onderhouden. Gobuster is ongeveer even snel, maar minder flexibel in waar je fuzzt. Wfuzz is ouder, trager en wordt nauwelijks nog onderhouden. Binnen Hackify is ffuf ons standaardgereedschap voor webfuzzing.
200 OK met dezelfde ’niet gevonden’-pagina terug, in plaats van een nette 404. Dan lijkt alles een treffer. Filter op de kenmerken van die standaardpagina: -fs op grootte, -fw op aantal woorden of -fl op aantal regels. Weet je die waarden niet, dan doet -ac (autocalibration) het voor je: ffuf stuurt eerst een paar willekeurige verzoeken, leert hoe een niet-bestaande pagina eruitziet en filtert die er automatisch uit.
FUZZ-keyword werkt in de URL, in headers (-H) en in de request-body (-d). Zo test je verborgen GET-parameters (-u 'https://target/?FUZZ=1') of POST-velden. Voor het gericht bruteforcen van een inlogformulier of het uitbuiten van een injectie pakken we meestal Burp Suite of een specifieke tool, maar voor het ontdekken van bestaande parameters is ffuf uitstekend.
404- of 403-regels in de webserverlogs oplevert vanaf één IP-adres. Een WAF of rate-limiter pikt dat patroon zonder moeite op en kan je blokkeren. Wil je onder de radar blijven, dan verlaag je de snelheid met -t en -p (vertraging tussen verzoeken), maar de scan blijft zichtbaar in de logs.
Nmap brengt netwerken in kaart: poorten scannen, diensten en versies herkennen en hosts ontdekken. De eerste stap van vrijwel elke pentest.
XXE (XML External Entity injection) misbruikt een zwak ingestelde XML-parser om bestanden uit te lezen en interne systemen te bereiken. Wij testen erop.
SSRF (Server-Side Request Forgery) laat een aanvaller uw server HTTP-verzoeken laten doen naar zelf-gekozen adressen. Wij testen waar dat mogelijk is.