Shikata Ga Nai

Private? There is no such things.

GraphQL API 脆弱性診断マニュアル

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 /graphqlapplication/json のボディ
  • HTMLに /graphiql, /playground などの開発者ツールが露出している
  • __schema, __type, __typename というフィールドが通るか

GraphQLは便利で柔軟なAPI設計ができる反面、認可制御の失敗やスキーマの漏洩によって重大な情報漏洩・権限昇格に繋がりやすいです。 しっかりとしたスキーマ設計・フィールド制御・実行制限が行われているかを重点的に確認しましょう。

Best regards, (^^ゞ