うつろい EC のマイページ — 「注文履歴」機能は ?order_id=12345 という URL で個別の注文詳細を表示する。サーバ側で「ログインユーザがその注文の所有者か」のチェックがされていない。
あなた(攻撃者役)はうつろい EC のアカウントを1つ持っており、自分の注文(注文番号 12345)は正規にアクセスできる状態。この URL の order_id を別の値に変えると、他のユーザの注文情報が見えてしまう。
うつろい EC のマイページ — 「注文履歴」機能は ?order_id=12345 という URL で個別の注文詳細を表示する。サーバ側で「ログインユーザがその注文の所有者か」のチェックがされていない。
あなた(攻撃者役)はうつろい EC のアカウントを1つ持っており、自分の注文(注文番号 12345)は正規にアクセスできる状態。この URL の order_id を別の値に変えると、他のユーザの注文情報が見えてしまう。
order_id を 12340〜12349 の範囲で試して、他のユーザ4名の注文情報(配送先住所、購入商品、決済額)を取得してください。発見された漏洩は下に自動で記録されます。
// GET /orders/{order_id}
$order = Order::find($_GET['order_id']);
if (!$order) {
abort(404, '注文が見つかりません');
}
return $order->detail();
// ↑ 認証はされている(セッション Cookie で「ログインしてるか」は確認)が、
// 「この注文の所有者か」のチェックがない
このコードでは、ログイン済みのどのユーザでも、order_id を指定するだけで誰の注文も見れてしまう。横の認可(同じ役割の他ユーザのリソースにアクセス)の欠落。
order_id は 12340〜12349 の範囲で試してください。あなた自身の注文は 12345 です。それ以外を試すと…
「次へ →」「← 前へ」ボタンで連続的に試行できます。10件全て試して、自分以外の注文4件を見つけましょう。
10件試すと、以下が他人の注文として判明します:
他は「注文が見つかりません」(該当 order_id が存在しない)。
このように URL の ID を変えるだけで他人の個人情報が漏洩するのが IDOR。実際の事案ではより大きな範囲(数万〜数百万件)を自動化ツールで一斉に取得され、大規模な情報漏洩に至ります。