Hello there, ('ω')ノ
🎯 ラボの目的
このラボでは、GraphQL APIが抱える情報漏洩の脆弱性を利用して、「非公開ブログ投稿」のパスワードを取得します。
🧠 問題の概要
- ブログ投稿はGraphQLエンドポイント
/graphql/v1
を通じて取得される。 - クエリのレスポンスに含まれる投稿IDが連番になっていない(例:ID3が欠番)。
- これは、存在しているが非表示になっている投稿があることを示唆している。
- GraphQLのイントロスペクション機能を利用して、投稿オブジェクトに「postPassword」フィールドが存在することを確認できる。
🛠 攻略手順
① 非公開投稿の存在を確認する
- Burpのブラウザでブログページにアクセス。
Proxy > HTTP history
で GraphQLリクエスト(POST /graphql/v1)を確認。- レスポンスを見ると、例えば ID1, 2, 4 は存在し、ID3 が欠番 → 非公開投稿の存在が疑われる。
② イントロスペクションでスキーマを調査
- 対象のリクエストを「Send to Repeater」。
- Repeater上で右クリック→「GraphQL > Set introspection query」。
- リクエスト送信後のレスポンスで、
BlogPost
型にpostPassword
フィールドが存在することを確認。
③ 非公開投稿の詳細を取得する
- 再び
POST /graphql/v1
を Repeater に送り、変数id: 3
を設定。 - クエリ部分に
postPassword
を追加:
query ($id: Int!) { post(id: $id) { title content postPassword } }
- リクエストを送信 →
postPassword
フィールドに値が含まれている。 - このパスワードをコピーし、ラボ画面のフォームに貼り付けて送信 → ラボクリア!
✅ 攻略のポイントと対策
項目 | 説明 |
---|---|
🔍 イントロスペクション | GraphQLスキーマ構造が丸見えになる。 |
🔓 IDOR脆弱性 | シーケンシャルなIDをたどるだけで非公開データにアクセス可能。 |
🛡 対策 | 本番環境では __schema などのイントロスペクションを無効にする。アクセス制御をIDベースで厳格に実装する。 |
Best regards, (^^ゞ