← 攻撃手法一覧
Webアプリケーション攻撃OWASP Top 102000年代〜現在

CSRF(クロスサイトリクエストフォージェリ)とは

CSRF(Cross-Site Request Forgery)はログイン済みのユーザーに、 意図しないリクエストを正規サイトに送信させる攻撃です。 被害者がWebサービスにログインした状態で攻撃者の罠ページを開くと、 被害者の認証情報を使って不正な操作(送金・設定変更・データ削除など)が実行されます。

目次
1. CSRFの概要2. 攻撃の仕組み3. 具体的な攻撃例4. XSSとの違い5. 被害事例6. 対策・予防方法

1. CSRFの概要

ブラウザは同じドメインへのリクエストに自動的にCookieを付与します。 CSRFはこの仕組みを悪用します。ユーザーが銀行サービスにログインした状態で 攻撃者の罠ページを開くと、罠ページから銀行サービスへのリクエストが ユーザーのCookieとともに自動送信されてしまいます。

不正送金
銀行・決済サービスで攻撃者の口座への送金リクエストを送信させる
アカウント設定の変更
メールアドレス・パスワード・電話番号を攻撃者のものに変更させる
データの削除・改ざん
重要なデータを削除したり内容を改ざんするリクエストを送信させる
管理者権限の付与
管理システムで攻撃者のアカウントに管理者権限を付与させる

2. 攻撃の仕組み

STEP 1
被害者がログイン
被害者が正規のWebサービス(例:ネットバンキング)にログインし、セッションCookieが発行される
STEP 2
罠ページへの誘導
攻撃者がメール・SNSなどで罠ページのURLを送り、被害者を誘導する
STEP 3
罠ページを開く
被害者が罠ページを開く。罠ページには正規サービスへのリクエストを送信するコードが仕込まれている
STEP 4
自動リクエスト送信
ブラウザが自動的に正規サービスへリクエストを送信。この際、先ほどのセッションCookieも一緒に送られる
STEP 5
不正操作の実行
正規サービスは正規のCookieを持つリクエストとして処理し、被害者の意図しない操作(送金など)が実行される

3. 具体的な攻撃例

罠ページのHTMLコード例
<!-- 被害者が開くと自動的に銀行への送金リクエストが送信される -->
<img src="https://bank.example.com/transfer?to=attacker&amount=100000" style="display:none">
<!-- またはフォームの自動送信 -->
<form action="https://bank.example.com/transfer" method="POST" id="csrf">
<input type="hidden" name="to" value="attacker_account">
<input type="hidden" name="amount" value="100000">
</form>
<script>document.getElementById('csrf').submit()</script>

4. XSSとの違い

XSS
攻撃スクリプトが被害者のブラウザで実行される
正規サイトに悪意あるコードを埋め込む
被害者のデータを盗む・偽ページを表示する
被害者のブラウザを乗っ取る
CSRF
被害者のブラウザから正規サイトへ不正リクエストを送る
攻撃者が用意した罠サイトを使う
被害者の権限で不正な操作を実行させる
被害者が操作したように見せかける

5. 被害事例

2008年NetSuite(ERP SaaS)
CSRF脆弱性により攻撃者がログイン済みユーザーの設定を変更できる状態だった。修正パッチが配布された。
2008年YouTube
CSRF脆弱性により攻撃者がユーザーのアカウント設定を変更できる状態にあった。Googleが修正した。
2012年Paypal
CSRFの脆弱性が報告され、修正前に一部ユーザーが不正な操作の被害を受けた。
2020年代〜国内Webサービス多数
CSRFトークンが実装されていない国内の中小Webサービスへの攻撃が継続的に報告されている。IPAが定期的に注意喚起を発出。

6. 対策・予防方法

最重要CSRFトークンを実装する。フォームに予測不可能なトークンを埋め込み、サーバー側で検証する
最重要SameSite Cookie属性を設定する(SameSite=StrictまたはLax)。クロスサイトリクエストへのCookie送信を制限する
推奨OriginヘッダーとRefererヘッダーを検証して、正規のサイトからのリクエストかを確認する
推奨重要な操作(送金・設定変更など)には再認証(パスワード再入力)を要求する
推奨Djangoのcsrf_token・LaravelのCSRF保護など、フレームワークのCSRF対策機能を活用する
ユーザー向け使い終わったサービスはログアウトする。複数のサービスを同時に開いたまま放置しない
// CSRFトークンの実装例(Python/Flask)
# フォームにCSRFトークンを埋め込む
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">

# サーバー側で検証する
if request.form['csrf_token'] != session['csrf_token']:
abort(403) # 不正なリクエストを拒否

まとめ

CSRFはブラウザのCookie自動送信という正常な仕組みを悪用した攻撃です。 CSRFトークンとSameSite Cookie属性の2つを実装するだけで大部分の攻撃を防げます。 DjangoやLaravelなどのモダンなWebフレームワークはデフォルトでCSRF対策が組み込まれているため、 フレームワークの機能を無効化しないことが重要です。

参考・関連リンク

OWASP - Cross-Site Request ForgeryIPA - CSRF対策MDN - SameSite Cookie属性