Shikata Ga Nai

Private? There is no such things.

CSRFトークン検証の落とし穴:GETメソッドでバイパスされるケース

Hello there, ('ω')ノ

✅ 問題の本質:リクエストメソッドによってCSRFトークン検証をスキップしている

多くのアプリケーションでは、

  • POSTリクエストにはCSRFトークンを求めて厳密に検証するが
  • GETリクエストにはトークンを求めない or チェックしないという実装ミスが存在します。

📚 実例:メールアドレス変更リクエスト

GET /email/change?email=pwned@evil-user.net HTTP/1.1
Host: vulnerable-website.com
Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm
  • 本来この操作はCSRFトークンを含むPOSTでなければならないが、
  • GETでも同じ処理が通ってしまうため、CSRFトークンの存在意味がなくなっている

🎯 攻撃者のバイパス戦略

条件 攻撃内容
POST + トークン必須 通常は攻撃困難
GET + トークン不要 URLにパラメータを付けるだけで攻撃可能になる

✅ 攻撃HTMLの例(画像タグCSRF)

<img src="https://vulnerable-website.com/email/change?email=pwned@evil-user.net">
  • 被害者がこのページを読み込むだけでCSRF成立(ノークリック攻撃

⚠️ なぜこれは危険なのか?

  • GETリクエストでも処理内容に副作用(状態変更)があるのは設計ミス
  • HTTPの設計思想では「GETは読み取り専用」なので、状態変更を伴う操作にはPOST/PUTなどを使うべき

✅ 防御策(開発者向け)

対策 内容
全メソッドに対してCSRFトークン検証を行う GETでも重要操作なら検証必須
状態変更を伴う操作にはGETを使わない POST/PUT/DELETEなどを使う
SameSite Cookie設定 外部からのGETリクエストでもCookieを送らないよう制御可能
リクエスト制限(CSP/Refererチェック) 複数層のチェックで補強可能

✅ まとめ

「GETだから大丈夫」という思い込みは極めて危険です。

  • 状態変更機能がGETで動作するなら、CSRFトークンは無力
  • 攻撃者はこの隙をついて画像タグやリンクだけでCSRF攻撃を成立させます

Best regards, (^^ゞ