ffuf-web-fuzzing について
ペネトレーションテストや Web 探索で使う、Go 製ファザー ffuf の活用スキルです。パス、パラメーター、ヘッダー、認証付きリクエストのテストに加え、レスポンスの絞り込みとリクエスト速度の制御を扱います。
主な機能
- 01ディレクトリ、ファイル、サブドメインの発見
- 02パラメーター、ヘッダー、リクエスト本文のファジング
- 03生 HTTP ファイルによる認証付きリクエストのテスト
- 04レスポンスの照合とフィルタリング
- 05リクエスト速度と並行数の制御
- 06JSON、HTML、CSV 形式での結果保存
活用シーン
- 01非公開の Web パスやファイルの探索
- 02サブドメインと API エンドポイントの列挙
- 03脆弱性につながるパラメーターや入力のテスト
- 04取得したリクエストを使った認証ルートのファジング
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jthack/ ffuf_claude_skill --skill ffuf-web-fuzzingインストール後、Claude Code で/ffuf-web-fuzzingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
ffuf_helper.pyresources/REQUEST_TEMPLATES.mdWORDLISTS.md詳細
FFUF(Fuzz Faster U Fool)スキル
概要
FFUFはGoで記述された高速なウェブファザーです。侵入テスト中に、隠れたコンテンツ、ディレクトリ、ファイル、サブドメインの発見や、脆弱性のテストを行うよう設計されています。dirbやdirbusterなどの従来のツールよりも大幅に高速です。
インストール
# Using Go
go install github.com/ffuf/ffuf/v2@latest
# Using Homebrew (macOS)
brew install ffuf
# Binary download
# Download from: https://github.com/ffuf/ffuf/releases/latest
基本概念
FUZZキーワード
FUZZキーワードは、ワードリストのエントリに置き換えられるプレースホルダーとして使用します。次のように、どこにでも配置できます。
- URL:
https://target.com/FUZZ - ヘッダー:
-H "Host: FUZZ" - POSTデータ:
-d "username=admin&password=FUZZ" - カスタムキーワードを使った複数の場所:
-w wordlist.txt:CUSTOMを指定し、FUZZの代わりにCUSTOMを使用します
複数ワードリストのモード
- clusterbomb:すべての組み合わせをテストします(デフォルト)。直積です
- pitchfork:ワードリストを並行して処理します(1対1で対応)
- sniper:一度に1つの位置をテストします(複数のFUZZ位置がある場合)
一般的な使用例
1. ディレクトリとファイルの検出
# Basic directory fuzzing
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ
# With file extensions
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -e .php,.html,.txt,.pdf
# Colored and verbose output
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -c -v
# With recursion (finds nested directories)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -recursion -recursion-depth 2
2. サブドメインの列挙
# Virtual host discovery
ffuf -w /path/to/subdomains.txt -u https://target.com -H "Host: FUZZ.target.com" -fs 4242
# Note: -fs 4242 filters out responses of size 4242 (adjust based on default response size)
3. パラメーターのファジング
# GET parameter names
ffuf -w /path/to/params.txt -u https://target.com/script.php?FUZZ=test_value -fs 4242
# GET parameter values
ffuf -w /path/to/values.txt -u https://target.com/script.php?id=FUZZ -fc 401
# Multiple parameters
ffuf -w params.txt:PARAM -w values.txt:VAL -u https://target.com/?PARAM=VAL -mode clusterbomb
4. POSTデータのファジング
# Basic POST fuzzing
ffuf -w /path/to/passwords.txt -X POST -d "username=admin&password=FUZZ" -u https://target.com/login.php -fc 401
# JSON POST data
ffuf -w entries.txt -u https://target.com/api -X POST -H "Content-Type: application/json" -d '{"name": "FUZZ", "key": "value"}' -fr "error"
# Fuzzing multiple POST fields
ffuf -w users.txt:USER -w passes.txt:PASS -X POST -d "username=USER&password=PASS" -u https://target.com/login -mode pitchfork
5. ヘッダーのファジング
# Custom headers
ffuf -w /path/to/wordlist.txt -u https://target.com -H "X-Custom-Header: FUZZ"
# Multiple headers
ffuf -w /path/to/wordlist.txt -u https://target.com -H "User-Agent: FUZZ" -H "X-Forwarded-For: 127.0.0.1"
フィルタリングとマッチング
マッチャー(結果を含める)
-mc:ステータスコードでマッチします(デフォルト:200-299,301,302,307,401,403,405,500)-ml:行数でマッチします-mr:正規表現でマッチします-ms:レスポンスサイズでマッチします-mt:レスポンス時間でマッチします(例:>100または<100ミリ秒)-mw:単語数でマッチします
フィルター(結果を除外)
-fc:ステータスコードでフィルタリングします(例:-fc 404,403,401)-fl:行数でフィルタリングします-fr:正規表現でフィルタリングします(例:-fr "error")-fs:レスポンスサイズでフィルタリングします(例:-fs 42,4242)-ft:レスポンス時間でフィルタリングします-fw:単語数でフィルタリングします
自動キャリブレーション(デフォルトで使用してください!)
重要: 特別な理由がない限り、常に-acを使用してください。特にClaudeに結果を分析させる場合は重要です。ノイズや誤検知を大幅に減らせます。
# Auto-calibration - ALWAYS USE THIS
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -ac
# Per-host auto-calibration (useful for multiple hosts)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -ach
# Custom auto-calibration string (for specific patterns)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -acc "404NotFound"
-acが不可欠な理由:
- 繰り返される誤検知レスポンスを自動的に検出してフィルタリングします
- ランダムなコンテンツを含む動的なウェブサイトのノイズを除去します
- 人間とClaudeの両方にとって、結果の分析がはるかに簡単になります
- 同一の404/403レスポンスが何千件も出力を埋め尽くすのを防ぎます
- 対象の固有の動作に適応します
Claudeにffufの結果を分析させる場合、-acは必須です。 使用しないと、Claudeは興味深い異常を見つける代わりに、何千もの誤検知を選別することになります。
レート制限とタイミング
レート制御
# Limit to 2 requests per second (stealth mode)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -rate 2
# Add delay between requests (0.1 to 2 seconds random)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -p 0.1-2.0
# Set number of concurrent threads (default: 40)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -t 10
時間制限
# Maximum total execution time (60 seconds)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -maxtime 60
# Maximum time per job (useful with recursion)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -maxtime-job 60 -recursion
出力オプション
出力形式
# JSON output
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -o results.json
# HTML output
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -of html -o results.html
# CSV output
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -of csv -o results.csv
# All formats
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -of all -o results
# Silent mode (no progress, only results)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -s
# Pipe to file with tee
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -s | tee results.txt
高度なテクニック
生のHTTPリクエストの使用(認証済みファジングでは重要)
これはffufの最も強力な機能の1つで、特に複雑なヘッダー、Cookie、トークンを含む認証済みリクエストで威力を発揮します。
ワークフロー:
- 認証済みリクエスト全体をキャプチャします(Burp Suite、ブラウザーのDevToolsなどを使用)
- ファイルに保存します(例:
req.txt) - ファジングしたい値を
FUZZキーワードに置き換えます --requestフラグを使用します
# From a file containing raw HTTP request
ffuf --request req.txt -w /path/to/wordlist.txt -ac
req.txtファイルの例:
POST /api/v1/users/FUZZ HTTP/1.1
Host: target.com
User-Agent: Mozilla/5.0
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Cookie: session=abc123xyz; csrftoken=def456
Content-Type: application/json
Content-Length: 27
{"action":"view","id":"1"}
使用例:
- 複雑な認証ヘッダーを含む認証済みエンドポイントのファジング
- JWTトークンを使用するAPIエンドポイントのテスト
- CSRFトークン、セッションCookie、カスタムヘッダーを使用したファジング
- 特定のUser-AgentやAcceptヘッダーを必要とするエンドポイントのテスト
- 認証が必要なPOST/PUT/DELETEリクエスト
プロのヒント:
- URLパス、ヘッダー、本文など、複数の場所にFUZZを配置できます
- 必要に応じて
-request-proto httpsを使用します(デフォルトはhttpsです) - 認証済みの「見つからない」レスポンスやエラーレスポンスを除外するため、常に
-acを使用します - IDORテストに最適です。認証済みの環境でユーザーIDやドキュメントIDなどをファジングできます
# Common authenticated fuzzing patterns
ffuf --request req.txt -w user_ids.txt -ac -mc 200 -o results.json
# With multiple FUZZ positions using custom keywords
ffuf --request req.txt -w endpoints.txt:ENDPOINT -w ids.txt:ID -mode pitchfork -ac
プロキシの使用
# HTTP proxy (useful for Burp Suite)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -x http://127.0.0.1:8080
# SOCKS5 proxy
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -x socks5://127.0.0.1:1080
# Replay matched requests through proxy
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -replay-proxy http://127.0.0.1:8080
Cookieと認証
# Using cookies
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -b "sessionid=abc123; token=xyz789"
# Client certificate authentication
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -cc client.crt -ck client.key
エンコーディング
# URL encoding
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -enc 'FUZZ:urlencode'
# Multiple encodings
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -enc 'FUZZ:urlencode b64encode'
脆弱性のテスト
# SQL injection testing
ffuf -w sqli_payloads.txt -u https://target.com/page.php?id=FUZZ -fs 1234
# XSS testing
ffuf -w xss_payloads.txt -u https://target.com/search?q=FUZZ -mr "<script>"
# Command injection
ffuf -w cmdi_payloads.txt -u https://target.com/execute?cmd=FUZZ -fr "error"
複数の対象のバッチ処理
# Process multiple URLs
cat targets.txt | xargs -I@ sh -c 'ffuf -w wordlist.txt -u @/FUZZ -ac'
# Loop through multiple targets with results
for url in $(cat targets.txt); do
ffuf -w wordlist.txt -u $url/FUZZ -ac -o "results_$(echo $url | md5sum | cut -d' ' -f1).json"
done
ベストプラクティス
1. 必ず自動キャリブレーションを使用する
すべてのスキャンで、デフォルトで -ac を使用してください。効率的なペンテストには必須です。
ffuf -w wordlist.txt -u https://target.com/FUZZ -ac
2. 認証には生のリクエストを使用する
複雑な認証のためにコマンドラインフラグで苦労する必要はありません。リクエスト全体をキャプチャし、--request を使用してください。
# 1. Capture authenticated request from Burp/DevTools
# 2. Save to req.txt with FUZZ keyword in place
# 3. Run with -ac
ffuf --request req.txt -w wordlist.txt -ac -o results.json
3. 適切なワードリストを使用する
- ディレクトリの検出:SecLists Discovery/Web-Content(raft-large-directories.txt、directory-list-2.3-medium.txt)
- サブドメイン:SecLists Discovery/DNS(subdomains-top1million-5000.txt)
- パラメーター:SecLists Discovery/Web-Content(burp-parameter-names.txt)
- ユーザー名:SecLists Usernames
- パスワード:SecLists Passwords
- ソース:https://github.com/danielmiessler/SecLists
3. ステルスのためのレート制限
WAF/IDS の検知を回避し、サーバーへの過負荷を防ぐために -rate を使用してください。
ffuf -w wordlist.txt -u https://target.com/FUZZ -rate 2 -t 10
4. 戦略的にフィルタリングする
- まずデフォルトの応答を確認し、一般的な応答サイズ、ステータスコード、パターンを特定します
- サイズでフィルタリングするには
-fsを、ステータスコードでフィルタリングするには-fcを使用します - フィルターを組み合わせます:
-fc 403,404 -fs 1234
5. 結果を適切に保存する
後で分析できるように、必ず結果をファイルに保存してください。
ffuf -w wordlist.txt -u https://target.com/FUZZ -o results.json -of json
6. 対話モードを使用する
実行中に ENTER キーを押すと、次の操作ができる対話モードに切り替わります。
- フィルターをその場で調整する
- 現在の結果を保存する
- スキャンを再開する
- キューを管理する
7. 再帰の深さ
無限ループに陥ったり、サーバーに過負荷をかけたりしないよう、再帰の深さに注意してください。
ffuf -w wordlist.txt -u https://target.com/FUZZ -recursion -recursion-depth 2 -maxtime-job 120
よくあるパターンとワンライナー
クイックディレクトリスキャン
ffuf -w ~/wordlists/common.txt -u https://target.com/FUZZ -mc 200,301,302,403 -ac -c -v
拡張子を指定した包括的なスキャン
ffuf -w ~/wordlists/raft-large-directories.txt -u https://target.com/FUZZ -e .php,.html,.txt,.bak,.old -ac -c -v -o results.json
認証付きファジング(生のリクエスト)
# 1. Save your authenticated request to req.txt with FUZZ keyword
# 2. Run:
ffuf --request req.txt -w ~/wordlists/api-endpoints.txt -ac -o results.json -of json
API エンドポイントの検出
ffuf -w ~/wordlists/api-endpoints.txt -u https://api.target.com/v1/FUZZ -H "Authorization: Bearer TOKEN" -mc 200,201 -ac -c
自動キャリブレーションを使ったサブドメインの検出
ffuf -w ~/wordlists/subdomains-top5000.txt -u https://FUZZ.target.com -ac -c -v
POST ログインのブルートフォース
ffuf -w ~/wordlists/passwords.txt -X POST -d "username=admin&password=FUZZ" -u https://target.com/login -fc 401 -rate 5 -ac
認証付き IDOR テスト
# Use req.txt with authenticated headers and FUZZ in the ID parameter
ffuf --request req.txt -w numbers.txt -ac -mc 200 -fw 100-200
設定ファイル
デフォルト設定用に ~/.config/ffuf/ffufrc を作成します。
[http]
headers = ["User-Agent: Mozilla/5.0"]
timeout = 10
[general]
colors = true
threads = 40
[matcher]
status = "200-299,301,302,307,401,403,405,500"
トラブルシューティング
誤検知が多すぎる
- 自動キャリブレーションに
-acを使用します - デフォルトの応答を確認し、
-fsでサイズを指定してフィルタリングします -frで正規表現によるフィルタリングを使用します
遅すぎる
- スレッド数を増やします:
-t 100 - ワードリストのサイズを小さくします
- 応答コンテンツが不要な場合は
-ignore-bodyを使用します
ブロックされる
- レートを下げます:
-rate 2 - 遅延を追加します:
-p 0.5-1.5 - スレッド数を減らします:
-t 10 - User-Agent をランダム化します
- プロキシをローテーションします
結果が見つからない
- フィルタリングが厳しすぎないか確認します
-mc allを使ってすべての応答を表示します- 一時的に自動キャリブレーションを無効にします
- 詳細モード
-vを使って状況を確認します
リソース
- 公式 GitHub:https://github.com/ffuf/ffuf
- Wiki:https://github.com/ffuf/ffuf/wiki
- Codingo のガイド:https://codingo.io/tools/ffuf/bounty/2020/09/17/everything-you-need-to-know-about-ffuf.html
- 練習用ラボ:http://ffuf.me
- SecLists ワードリスト:https://github.com/danielmiessler/SecLists
クイックリファレンスカード
| タスク | コマンドテンプレート |
|---|---|
| ディレクトリの検出 | ffuf -w wordlist.txt -u https://target.com/FUZZ -ac |
| サブドメインの検出 | ffuf -w subdomains.txt -u https://FUZZ.target.com -ac |
| パラメーターのファジング | ffuf -w params.txt -u https://target.com/page?FUZZ=value -ac |
| POST データのファジング | ffuf -w wordlist.txt -X POST -d "param=FUZZ" -u https://target.com/endpoint |
| 拡張子を指定 | -e .php,.html,.txt を追加 |
| ステータスでフィルタリング | -fc 404,403 を追加 |
| サイズでフィルタリング | -fs 1234 を追加 |
| レート制限 | -rate 2 を追加 |
| 出力を保存 | -o results.json を追加 |
| 詳細表示 | -c -v を追加 |
| 再帰 | -recursion -recursion-depth 2 を追加 |
| プロキシ経由 | -x http://127.0.0.1:8080 を追加 |
追加リソース
このスキルには、resources/ ディレクトリに補足資料が含まれています。
リソースファイル
- WORDLISTS.md:SecLists のワードリスト、さまざまなシナリオで推奨されるリスト、ファイル拡張子、クイックリファレンスのパターンを網羅したガイド
- REQUEST_TEMPLATES.md:一般的な認証シナリオ(JWT、OAuth、セッション Cookie、API キーなど)向けの、使用例付きの事前作成済み req.txt テンプレート
ヘルパースクリプト
- ffuf_helper.py:以下を支援する Python スクリプト:
- ffuf の JSON 結果を分析し、異常や注目すべき結果を見つける
- コマンドライン引数から req.txt テンプレートファイルを作成する
- IDOR テスト用の数字ベースのワードリストを生成する
ヘルパースクリプトの使用方法:
# Analyze results to find interesting anomalies
python3 ffuf_helper.py analyze results.json
# Create authenticated request template
python3 ffuf_helper.py create-req -o req.txt -m POST -u "https://api.target.com/users" \
-H "Authorization: Bearer TOKEN" -d '{"action":"FUZZ"}'
# Generate IDOR testing wordlist
python3 ffuf_helper.py wordlist -o ids.txt -t numbers -s 1 -e 10000
リソースを使用する場面:
- ユーザーがワードリストの推奨を必要としている → WORDLISTS.md を参照します
- ユーザーが認証済みリクエストについて支援を必要としている → REQUEST_TEMPLATES.md を参照します
- ユーザーが結果を分析したい → ffuf_helper.py analyze を使用します
- ユーザーが req.txt を生成したい → ffuf_helper.py create-req を使用します
- ユーザーが IDOR 用の数値範囲を必要としている → ffuf_helper.py wordlist を使用します
Claude 向けの注意事項
ユーザーの ffuf の使用を支援する際は、次の点に従ってください。
- すべてのコマンドに必ず
-acを含めてください — 効率的なペンテストと結果分析に必須です - ユーザーが認証済みのファジングに言及したり、認証トークンや Cookie を提示したりした場合:
- 完全な HTTP リクエストを含む
req.txtファイルの作成を提案します - ファジングしたい箇所に FUZZ を挿入する方法を説明します
ffuf --request req.txt -w wordlist.txt -acを使用します
- 完全な HTTP リクエストを含む
- 自動キャリブレーションのため、最初から
-acを付けるよう常に推奨します - タスクに応じて、SecLists から適切なワードリストを提案します
- 本番環境のターゲットにはレート制限(
-rate)を使用するよう、ユーザーに注意を促します - ドキュメント化のため、出力をファイルに保存するよう推奨します:
-o results.json - 初期偵察の結果に基づいて、適切なフィルタリング戦略を提案します
- FUZZ キーワードは常に大文字・小文字を区別して使用します
- ステルス性を考慮し、機密性の高いターゲットではスレッド数を減らし、レート制限や遅延を設定します
- ペンテストレポートでは、クライアントに適した形式として
-of htmlまたは-of csvを使用します - ユーザーの ffuf 結果を分析する際:
- ユーザーは
-acを使用したものと想定します(使用していない場合、結果にノイズが多くなります) - 異常に注目します:異なるステータスコード、レスポンスサイズ、タイミング
- 注目すべきエンドポイントを探します:admin、api、backup、config、.git など
- 潜在的な脆弱性を指摘します:エラーメッセージ、スタックトレース、バージョン情報
- 注目すべき結果について、追加のファジングを提案します
- ユーザーは