utsuroi access control labs Lab 01 / 5 — Apprentice
01

IDOR — 注文番号を変えて他人の注文を覗く

Insecure direct object references via order ID tampering

うつろい EC のマイページ — 「注文履歴」機能は ?order_id=12345 という URL で個別の注文詳細を表示する。サーバ側で「ログインユーザがその注文の所有者か」のチェックがされていない

あなた(攻撃者役)はうつろい EC のアカウントを1つ持っており、自分の注文(注文番号 12345)は正規にアクセスできる状態。この URL の order_id を別の値に変えると、他のユーザの注文情報が見えてしまう。

order_id を 12340〜12349 の範囲で試して、他のユーザ4名の注文情報(配送先住所、購入商品、決済額)を取得してください。発見された漏洩は下に自動で記録されます。

https://shop.utsuroi.example.com/orders/12345
脆弱なサーバ実装(うつろい EC の注文詳細エンドポイント)
// GET /orders/{order_id}
$order = Order::find($_GET['order_id']);

if (!$order) {
    abort(404, '注文が見つかりません');
}

return $order->detail();
// ↑ 認証はされている(セッション Cookie で「ログインしてるか」は確認)が、
//   「この注文の所有者か」のチェックがない

このコードでは、ログイン済みのどのユーザでも、order_id を指定するだけで誰の注文も見れてしまう。横の認可(同じ役割の他ユーザのリソースにアクセス)の欠落。

これまでのアクセス履歴
    ヒント 1 — 試行範囲

    order_id は 12340〜12349 の範囲で試してください。あなた自身の注文は 12345 です。それ以外を試すと…

    ヒント 2 — 他人の注文を全部見つける

    「次へ →」「← 前へ」ボタンで連続的に試行できます。10件全て試して、自分以外の注文4件を見つけましょう。

    正解(ネタバレ)

    10件試すと、以下が他人の注文として判明します:

    • 12342 — 立花美穂さん(横浜市中区、ナイトクリーム × 2)
    • 12344 — 野村ゆきさん(京都市上京区、ハンドクリームセット)
    • 12347 — 森田香苗さん(福岡市中央区、化粧水「凪」3点セット)
    • 12348 — 高橋直美さん(札幌市中央区、ベースメイクキット)

    他は「注文が見つかりません」(該当 order_id が存在しない)。

    このように URL の ID を変えるだけで他人の個人情報が漏洩するのが IDOR。実際の事案ではより大きな範囲(数万〜数百万件)を自動化ツールで一斉に取得され、大規模な情報漏洩に至ります。