utsuroi graphql labsLab 01 / 5 — Practitioner
01

Introspection 漏洩から隠し mutation の発見

Discovering hidden admin mutations via introspection

うつろい EC は GraphQL API を採用。本番環境で Introspection が無効化されていない。攻撃者は __schema クエリで全 API スキーマを取得できる。

スキーマには「フロントエンドからは呼ばれていないが定義されている管理者用 mutation」がいくつか含まれている。これらが認可チェック不備で誰でも呼べる状態。

① Introspection でスキーマ全体を取得 → ② 隠された管理用 mutation を発見 → ③ それを呼び出して機密情報を取得してください。

クイック試行:
(まだクエリを実行していません)
脆弱な設定
// 危険:本番でも introspection 有効
const server = new ApolloServer({
  typeDefs, resolvers,
  // introspection オプション未設定 = デフォルト true
});

// 各 mutation の resolver でも認可チェック漏れ
const resolvers = {
  Mutation: {
    exportCustomerData(parent, args, context) {
      // ★ context.user.role の確認なし
      return CustomerService.exportAll(args.format);
    }
  }
};
正解(ネタバレ)
  1. 「Introspection: mutation 一覧」を実行 → exportCustomerDataresetUserPassworddeleteAllUsers 等の管理用 mutation の存在が判明
  2. 「隠し mutation: exportCustomerData」を実行 → 全顧客データ(メールアドレス、住所、購入履歴)が CSV として返ってくる

これは「機能を隠したつもりが Introspection で全部見える」+「resolver で認可チェック忘れ」のダブルミス。実際の事案でも頻出します。