ffuf とは — Go 製の高速 Web ファジングツール のサムネイル

ffuf とは — Go 製の高速 Web ファジングツール

⏱ 約 10 分 view 17 like 0 LOG_DATE:2026-06-01
目次 / TOC

ffuf (Fuzz Faster U Fool) は、Joona Hoikkala (@joohoi) が 2018 年に公開した Go 製の高速 Web ファジングツール。「ファジング」と聞くとプロトコルやバイナリに異常入力を投げるイメージが強いが、ffuf が行うのは HTTP リクエストの一部を辞書で総当たりして「存在するもの」を炙り出すこと。リクエスト内に置いた FUZZ という目印をワードリストの各行で順に置き換え、返ってきたレスポンスを見て「隠れたディレクトリ・ファイル・パラメータ・サブドメイン・バーチャルホスト」を発見する。Go の並行処理で非常に高速なため、ペネトレーションテストや CTF の Web 列挙フェーズで事実上の定番になっている。

01

ffuf とは — FUZZ キーワードという中核 #

ffuf を理解する鍵はただ 1 つ、FUZZ キーワード。リクエストのどこにこの文字列を置いても、ffuf はそこをワードリスト (-w) の 1 行ずつで置き換えてリクエストを送る。置く場所によって「何を探すか」が変わる。

FUZZ を置く場所 何を探すことになるか
URL パス末尾 (/FUZZ) ディレクトリ / ファイル探索
クエリ / ボディの値 (?id=FUZZ) パラメータ値の総当たり
クエリのキー (?FUZZ=x) 隠しパラメータ名の発見
Host ヘッダ (Host: FUZZ.target) vhost / サブドメイン列挙

たとえば https://target/FUZZ に対し admin / login / backup … と総当たりすれば、サーバ上に実在するパスだけがそれと分かるステータスコードやサイズで返ってくる。ffuf 自体は「当たり/外れ」を文脈で理解しているわけではなく、レスポンスの違いを頼りに人間が当たりを判定する — だからこそ後述の「マッチャとフィルタ」が生命線になる。

▸ ファジングといっても「壊す」テストではない

ffuf の用途は主に コンテンツ探索 (content discovery)列挙 (enumeration)。異常値でクラッシュを誘発する古典的ファザーとは方向性が違い、「辞書を高速に投げて当たりを探すブルートフォーサー」と捉えるのが実態に近い。

02

法的・倫理的な注意 #

ffuf は短時間に数千〜数万のリクエストを送る。これは技術的には DoS に近い負荷であり、対象によっては明確な攻撃と見なされる。許可なく他人のサーバへ ffuf を撃つことは、日本の不正アクセス禁止法や業務妨害に問われ得る違法行為になりうる。

▸ ffuf を使ってよい対象
  • 自分が所有・管理しているサーバ / アプリ — ローカルの検証環境、自分が契約している VPS、隔離した学習用ラボ
  • 書面で明示的に許可された対象 — ペネトレーションテスト契約や脆弱性診断契約で、スコープ (対象ホスト・期間・レート制限) が文書化されているもの
  • 正規の学習プラットフォーム — Hack The Box、TryHackMe、PortSwigger Web Security Academy など、運営がファジングを許可している環境

高速ツールほど「軽い気持ちで他所に撃つ」ことが致命傷になる。レート制限 (-rate / -t) を設定せず本番サービスへ撃てば、相手が落ちて損害賠償・刑事責任という最悪の結末もあり得る。対象と許可を必ず先に確認すること。

03

基本 — ディレクトリ/ファイル探索とワードリスト #

最も基本的な使い方が、URL パスに FUZZ を置くディレクトリ/ファイル探索。

最小のディレクトリ探索
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -u https://target/FUZZ # -w 使用するワードリスト # -u 対象 URL (FUZZ が置換される位置)

ファジングの当たり外れは ワードリストの質で決まる。デファクトは SecLists。用途別に代表的なものを挙げる。

ワードリスト 用途
Discovery/Web-Content/raft-medium-directories.txt 実サイトの観測に基づくディレクトリ辞書 (バランス型)
Discovery/Web-Content/raft-medium-files.txt ファイル名辞書 (raft-* は directories/files/words の派生がある)
Discovery/Web-Content/directory-list-2.3-medium.txt 定番の大規模辞書 (DirBuster 由来)
Discovery/Web-Content/common.txt 軽量・高速な初手 (約 4,700 件)
Discovery/DNS/subdomains-top1million-*.txt サブドメイン列挙用

拡張子を補いたいときは -e を使う。FUZZ の各候補に対し指定拡張子を付けたリクエストも併せて送る。

拡張子付き + 再帰探索
$ ffuf -w wordlist.txt -u https://target/FUZZ -e .php,.html,.bak,.txt -recursion -recursion-depth 2 # -e 各候補に拡張子を付けても試す # -recursion 当たったディレクトリの中をさらに探索
04

マッチャとフィルタ — 偽陽性をいかに消すか #

ffuf を「ただ撃つだけ」だと、結果が 偽陽性 (false positive) の海に沈む。多くのサーバは存在しないパスにも 200 でカスタム 404 ページ (soft-404) を返したり、ワイルドカードで全リクエストに同じ応答を返したりするからだ。ここを制御するのが マッチャ (matcher)フィルタ (filter)。ffuf を使いこなせるかどうかは、ほぼこの 2 つにかかっている。

  • マッチャ (-m*) — 条件に 合致したものだけ表示 する (ホワイトリスト)
  • フィルタ (-f*) — 条件に 合致したものを除外 する (ブラックリスト)
観点 マッチャ フィルタ
ステータスコード -mc 200,301,403 -fc 404,400
レスポンスサイズ (byte) -ms 1234 -fs 0,4242
単語数 -mw 56 -fw 56
行数 -ml 10 -fl 10
正規表現 -mr "regex" -fr "regex"
応答時間 -mt >100 -ft >100

ffuf は既定で -mc 200,204,301,302,307,401,403,405,500 を表示する。たとえば HTTP 200 のものだけを見たいなら -mc 200 と明示する。複数指定はカンマ区切り (-mc 200,301,403)、全ステータスを拾うなら -mc all

マッチャ — 200 のものだけ表示
$ ffuf -w wordlist.txt -u https://target/FUZZ -mc 200 # -mc 200 ステータス 200 のレスポンスだけを表示 # -mc 200,301 200 と 301 だけ表示 (カンマ区切り) # -mc all 全ステータスを拾う (フィルタや -ac と併用)
▸ 実戦の定石 — まず「外れの形」を観察する

存在しないパス (例: /zzz-not-exist-123) に手で 1 回アクセスし、その ステータス・サイズ・単語数を確認する。外れが「200 / 4242 byte / 56 words」で一定なら、-fs 4242-fw 56 で丸ごと除外すれば、残ったものが当たり候補になる。サイズや単語数フィルタはステータスコードより強力なことが多い。

外れの応答が候補ごとにブレて固定値で弾けないときは、オートキャリブレーションに任せる。

オートキャリブレーションで soft-404 を自動除去
$ ffuf -w wordlist.txt -u https://target/FUZZ -ac # -ac 起動時にダミーリクエストを数発送り、 # 「外れの応答」を学習して自動でフィルタ化する # -mc all を併用すると全ステータスを拾った上で -ac が外れを引く

-ac はランダムな存在しないパスへ先に数回アクセスし、その応答 (サイズ・単語数など) を「これは外れ」として自動フィルタに登録する。ワイルドカード応答や soft-404 を返すサーバでは、これがあるかないかで結果の読みやすさが段違いになる。

05

ファジングモードと攻撃モード #

FUZZ をどこに置くかでモードが切り替わる。代表的な 4 つ。

バーチャルホスト / サブドメイン列挙 #

1 つの IP が複数のドメインをホストしている (バーチャルホスト) 場合、Host ヘッダを差し替えて隠れたサイトを探す。DNS に載っていない内部向けホストも見つかる。

vhost ファジング
$ ffuf -w subdomains.txt -u https://target.com/ -H "Host: FUZZ.target.com" -fs 4242 # Host ヘッダの FUZZ を辞書で置換。外れサイズを -fs で除外

GET パラメータの発見 #

URL のクエリ部に FUZZ を置けば、アプリが受け付ける 隠しパラメータ名を探せる (例: デバッグ用の debug、ファイル指定の file など)。

パラメータ名 / 値のファジング
# パラメータ名を探す $ ffuf -w params.txt -u https://target/page?FUZZ=test -fs 0 # パラメータ値を総当たり (id の有効値探索など) $ ffuf -w ids.txt -u https://target/page?id=FUZZ

POST データ / ログイン総当たり #

-X POST-d でボディに FUZZ を置けば、ログインフォームのパスワード総当たりなどができる。失敗レスポンスを -fc / -fs で弾き、成功だけを残す。

ログインフォームへの総当たり
$ ffuf -w passwords.txt -u https://target/login -X POST \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=admin&password=FUZZ" -fc 200 # ログイン失敗が 200 で返るなら、それを弾けば成功 (302 等) が残る

複数 FUZZ と攻撃モード #

ワードリストに名前を付けて (-w list.txt:KEYWORD) 複数のポジションを同時に総当たりできる。Burp Suite の Intruder と同じく 攻撃モード (-mode) で組み合わせ方を選ぶ。

攻撃モード挙動典型用途
clusterbomb全ワードリストの総組み合わせ (直積)ユーザ名 × パスワードの全パターン
pitchfork各リストを同じ行番号で並行に消費対になった user/pass ペアの検証
sniper単一リストを1 ポジションずつ順に適用複数候補位置を 1 辞書で順次テスト
clusterbomb で user × pass の全組み合わせ
$ ffuf -w users.txt:USER -w pass.txt:PASS \ -u https://target/login -X POST \ -d "username=USER&password=PASS" -mode clusterbomb -fc 200
06

運用 Tips — レート・出力・偽装 #

撃ち方の調整に使う主要オプション。とくに レート制御は、対象を落とさないため・検知を避けるため・そして礼儀として重要。

オプション 効果
-t 40 並行スレッド数 (既定 40)。下げると低速・低負荷になる
-rate 50 1 秒あたりの最大リクエスト数。本番診断では必須級
-p 0.1 各リクエスト間の遅延 (秒)。-p "0.1-0.5" でランダム化も可
-H "..." / -b "..." ヘッダ / Cookie 付与 (認証後ページの探索)
-x http://127.0.0.1:8080 プロキシ経由 (Burp に流して観察・記録)
-o out.json -of json 結果をファイル出力 (json / html / csv / md など)
-ic ワードリスト中の # コメント行を無視
-c -v 色付き・詳細表示 (当たりの URL とリダイレクト先を見やすく)
-timeout 10 リクエストタイムアウト秒
▸ 防御側から見た ffuf の足跡

ffuf のスキャンはアクセスログに 大量の 404/403 が短時間に並ぶ、User-Agent が既定のままなら Fuzz Faster U Fool 系の文字列が残る、といった形で容易に検知できる。WAF やレート制限、404 の監視で大半は弾ける。攻撃側がこれを避けるには -rate での低速化や -H での UA 偽装を使うが、正規の診断では痕跡を残すこと自体は問題ではない — むしろ許可されたスコープ内で行うことが前提。

07

類似ツールとの位置づけ #

Web コンテンツ探索ツールは複数あり、ffuf はその中で **「速度 + 任意位置 FUZZ + 強力なフィルタ」**を特徴とする。

ツール言語特徴
ffufGo高速。FUZZ を任意位置に置ける汎用ファザー。マッチャ/フィルタが豊富
gobusterGo高速。dir/dns/vhost などモード別のシンプルな設計
feroxbusterRust高速 + 再帰探索が強力。自動再帰で深く掘る用途に向く
wfuzzPythonffuf の先祖的存在。柔軟だが低速。現在は ffuf に置き換わりつつある
dirb / dirbusterC / Java古典。低速だが枯れている。学習・互換目的で残る
▸ ffuf を使いこなす定石

(1) 軽い辞書で初手を撃つ (common.txt) → (2) 外れの形を観察してフィルタを決める (-fs / -fw / -ac) → (3) 当たったディレクトリを再帰や大きい辞書で深掘り、という段階的な進め方が王道。最初から最大辞書を全力で撃つより、フィルタを正しく設定して結果を読める状態にする方が、速度より遥かに重要になる。