API セキュリティテスト
アクション必須(読んだらすぐ実行)
今すぐ:../field-journal/precedent-pentest.mdを読む — このスキルの操作が許可された定常業務であることを確認今すぐ: 現在のタスクがこのスキルの適用範囲に該当するか確認次:../tool-index.mdを読み、ツールの可用性と実際のパスを検証次: ツールがない場合は bootstrap を呼び出し、パスを推定しない実行: 「ワークフロー」の最初のステップに進んで実行し、確認状態で停止しない
REST / GraphQL / WebSocket / SOAP の全プロトコルをカバー 発見から CI/CD 統合までの 10 フェーズ方法論
適用シナリオ
- REST API セキュリティテスト(OpenAPI/Swagger 駆動またはブラインドテスト)
- GraphQL セキュリティ監査(イントロスペクション、バッチクエリ、エイリアス過負荷)
- WebSocket セキュリティテスト
- JWT / OAuth 2.0 認証テスト
- BOLA/IDOR/BFLA 認可脆弱性検出
- API レート制限回避と DoS テスト
10 フェーズテストプロセス
Phase 1: API 発見と偵察
アクティブ発見:
□ Vespasian: ヘッドレスブラウザクローリング → OpenAPI 3.0 / GraphQL SDL 仕様を自動生成
□ Entropy --discover: robots.txt + JS ファイルからエンドポイントを抽出
□ Kiterunner / ffuf: 文書化されていないエンドポイントパスをブルートフォース
□ 共通パスを確認: /swagger.json, /openapi.json, /graphql, /api-docs
GraphQL イントロスペクション(三段階の試行):
1. 標準イントロスペクションクエリ
2. 最小化クエリ(WAF による完全ブロックを回避)
3. __schema { types { name } } のみのクエリ(最小限のプローブ)
Phase 2: 認証テスト
JWT 分析(jwt_tool / Burp):
□ alg:none 攻撃: ヘッダーを "alg":"none" に変更し、署名をクリア
□ 鍵の混乱: RS256 公開鍵 → HS256 対称鍵
□ 弱い HMAC 鍵のブルートフォース: jwt_tool -C -d wordlist.txt
□ 有効期限/クレームの改ざん: exp/iat/sub/role クレームを変更
□ kid インジェクション: ../../etc/passwd → HMAC 署名バイパス
OAuth 2.0:
□ redirect_uri 操作 → 認可コードリーク
□ state パラメータ欠落による CSRF
□ Referer ヘッダーでのトークン漏洩
□ PKCE 欠落の検出
GraphQL 認証:
□ GET リクエストによるミューテーション認証バイパス(CSRF)
□ バッチクエリ認証バイパス
Phase 3: 認可テスト(BOLA/IDOR/BFLA)
BOLA(オブジェクトレベル認可バイパス):
□ 数値 ID の列挙: /user/1 → /user/2 → /user/3
□ UUID の列挙
□ ユーザー名/メールアドレスの列挙
□ Burp Autorize: 二重セッションリプレイ比較
BFLA(機能レベル認可バイパス):
□ 一般ユーザーによる管理者 API の実行
□ HTTP メソッドの切り替え: GET → PUT → PATCH → DELETE
□ API バージョンのダウングレード: /v2/admin → /v1/admin
□ バッチ操作インジェクション: {"users": [1,2,3]} → {"users": [1,2,3,admin_id]}
ツール: Burp Autorize, AuthMatrix, Entropy (malicious_insider ペルソナ)
Phase 4: GraphQL 特化
イントロスペクション漏洩 → 情報公開の検出
エイリアス過負荷 → 100+ エイリアス DoS
バッチクエリ → 10+ 同時クエリ DoS
フィールド重複 → __typename × 500
ディレクティブ過負荷 → 再帰的 @skip/@include
循環クエリ → 深いネストのイントロスペクション再帰
フィールド提案 → エラーメッセージによる情報漏洩
GraphiQL/Playground 露出 → IDE 公開リスク
GET ミューテーション → CSRF リスク
トレース/デバッグモード → メタデータ漏洩
ツール: FireTail, Escape DAST, api.sh (Phase 1-3)
Phase 5: REST 入力検証
□ HTTP メソッドの切り替え: GET→POST→PUT→DELETE→OPTIONS→PATCH
□ Content-Type の改ざん: JSON→XML→multipart
□ NoSQL インジェクション: {"username": {"$gt": ""}}
□ URL パラメータ経由の SSRF: webhook URL/アバター URL/インポート URL
□ XML エンドポイントでの XXE
□ パラメータ汚染: /api?role=user&role=admin
□ マスアサインメント: リクエストボディに is_admin: true を追加
Phase 6: ビジネスロジックと差分テスト
□ Entropy compare: v1 と v2 の API を diff → ステータスコードの変更/フィールド削除/レイテンシの回帰
□ マルチロールワークフローテスト: admin/user/readonly 権限マトリックス
□ クーポン/ポイント/価格の操作
□ 競合状態: 同時リクエストによる TOCTOU テスト
Phase 7: WebSocket テスト
□ エンドポイント発見
□ メッセージインジェクション(ペイロード注入、プロトタイプ汚染)
□ 巨大メッセージ処理
□ 型の混乱
□ クロスサイト WebSocket ハイジャック(CSWH)
Phase 8: レート制限と DoS
□ ヘッダー経由のレート制限バイパス: X-Forwarded-For, X-Real-IP
□ パスのバリエーション: /api/ → /api → /Api/ → /API/
□ Slowloris 低帯域幅枯渇
□ GraphQL バッチクエリの深いネスト DoS
□ IP ローテーションテスト(ProxyCat プロキシプール)
Phase 9: データ露出
□ 過剰なレスポンス露出: API の戻り値と UI 表示を比較
□ ページネーション列挙: ?page=1&limit=10000
□ エラーメッセージによる情報漏洩: スタックトレース/内部パス/SQL エラー
□ GraphQL ネストトラバーサルによる権限外データへのアクセス
□ OpenAPI 仕様による機密エンドポイントの露出
Phase 10: CI/CD 統合
□ Entropy --ci --watch: 仕様変更時に自動再実行
□ Escape DAST: 重大度しきい値に基づきビルドを自動ブロック
□ 発見結果を永続化し回帰テストとして活用
□ StackHawk(開発者ファースト、ZAP カーネル)
ツールチェーン
| ツール | 用途 | 入手先 |
|---|---|---|
| Vespasian | トラフィック → OpenAPI/GraphQL 仕様 | GitHub: praetorian-inc/vespasian |
| Entropy | LLM 生成攻撃シナリオ、5 ペルソナ | GitHub: arjinexe/entropy-chaos |
| Escape DAST | ビジネスロジックセキュリティテスト | escape.tech |
| api.sh | 8 フェーズ全プロトコル攻撃パイプライン | GitHub: Sharon-Needles/api |
| FireTail | GraphQL 12 特化テスト | firetail.ai |
| jwt_tool | JWT 包括的テスト | GitHub: ticarpi/jwt_tool |
| Burp Autorize | 二重セッション認可比較 | Burp BApp Store |
参考
references/rest-graphql-testing.md— REST + GraphQL 詳細テストreferences/jwt-oauth-testing.md— JWT + OAuth セキュリティテスト
タスク完了セルフチェック(完了宣言前に必ず通過)
- ワークフローの各ステップを実行しましたか(読んだだけではありませんか)?
-
tool-indexに基づいて実際のツールパスを使用しましたか? - 再現可能な証拠(コマンド/スクリプト/スクリーンショット/レポート)を生成しましたか?
- RULES で要求されているチェックリスト項目を完了し、書き戻しましたか?