Hello there, ('ω')ノ
🎯 1. GraphQLとは?
GraphQLは、クライアントが必要なデータだけを指定して取得できるAPIのクエリ言語です。
REST APIと異なり、1つのエンドポイント(通常 /graphql
)でリクエストを受け付け、クエリを解析・処理します。
query { user(id: 1) { id username email } }
🔥 2. GraphQLで起きる主な脆弱性
脆弱性種別 | 内容 | 影響例 |
---|---|---|
情報漏洩 | 認証なしで内部構造やデータ取得 | メールアドレスや内部IDなど |
認可バイパス | 権限チェックなしで他人のデータ取得 | 他人のプロフィールにアクセス可能 |
スキーマの漏洩 | introspection(自己探索)で構造が丸見え | 管理用APIも特定可能 |
DoS | 無限にネストしたクエリによる負荷 | サーバダウン |
IDOR | user(id:1) などで他人の情報を取得可能 |
認証ありでも認可不備 |
不正なミューテーション | データ変更・削除 | 本来できない操作が可能に |
🛠️ 3. 基本的な診断手順
Step 1️⃣:GraphQLエンドポイントの特定
- URL例:
/graphql
,/api/graphql
,/graphiql
POST
リクエストでJSONを送信する形式が一般的
POST /graphql HTTP/1.1 Content-Type: application/json { "query": "{ __typename }" }
Step 2️⃣:Introspection(自己探索)を試す
{ __schema { types { name } } }
→ サーバのスキーマが見えたら 危険(情報漏洩) 管理API・非公開のクエリも特定できてしまう
Step 3️⃣:情報漏洩・認可バイパスの確認
{ user(id: 1) { username email role } }
→ 自分以外のIDで取得できたら IDOR / 認可不備の可能性
Step 4️⃣:ミューテーション(データ変更)の悪用確認
mutation { updateUser(id: 1, role: "admin") { id role } }
→ 自分に admin
権限が付与されたら 重大な脆弱性
Step 5️⃣:DoS(ネスト爆発)テスト
{ a { a { a { a { a { a { a }}}}}} }
→ サーバが遅くなる or エラーを返すか確認
🔍 4. よくある脆弱な構成・見つけやすいポイント
脆弱性 | 見つけ方 |
---|---|
introspection許可 | { __schema { types { name }}} が通る |
パラメータチェックなし | user(id:2) などで他人情報が見える |
ミューテーションの制限不足 | 認証なしで更新・削除可能 |
フィールドレベル認可なし | user { email, password } が通る |
無限ネスト | ネスト深度制限がない or 高すぎる |
未使用APIの存在 | introspectionで発見できる管理用APIなど |
🧰 5. 診断補助ツール
ツール | 用途 |
---|---|
Burp Suite | GraphQLリクエストの改変・再送信に最適 |
InQL (Burp拡張) | introspectionを使ってスキーマを自動解析 |
GraphQL Voyager | スキーマを視覚的にマッピングできる |
GraphQLmap | SQLMapのような自動スキャナ |
Postman | GraphQLリクエスト作成に便利なUIあり |
Altair / GraphiQL | ブラウザで使えるクエリインターフェース |
✅ 6. 安全なGraphQL実装のチェックポイント
項目 | 説明 |
---|---|
introspectionを本番では無効にする | 情報漏洩防止 |
フィールド単位でのアクセス制御 | 特に email , role , password など |
認可チェックをIDごとに行う | user(id) などで本人確認必須 |
クエリ制限(ネスト深度、実行時間) | 無限ネスト・複雑クエリの対策 |
使用していないミューテーションは無効化 | 攻撃面を最小限に |
✅ 7. 診断チェックリストまとめ
チェック項目 | ✔ / ✘ |
---|---|
introspectionでスキーマが漏れるか? | |
認証なしでもクエリが実行できるか? | |
自分以外のIDを指定してもデータが取れるか? | |
ミューテーションを使って不正な操作ができるか? | |
ネスト・サイズ・複雑度に対する制限があるか? |
📌 見つけやすいヒント
POST /graphql
にapplication/json
のボディ- HTMLに
/graphiql
,/playground
などの開発者ツールが露出している __schema
,__type
,__typename
というフィールドが通るか
GraphQLは便利で柔軟なAPI設計ができる反面、認可制御の失敗やスキーマの漏洩によって重大な情報漏洩・権限昇格に繋がりやすいです。 しっかりとしたスキーマ設計・フィールド制御・実行制限が行われているかを重点的に確認しましょう。
Best regards, (^^ゞ