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, (^^ゞ