CSRF
ログイン中の利用者に、攻撃者が用意した罠のページを開かせ、利用者の意図しないリクエストを、利用者の権限で正規のWebサイトに送らせる攻撃。
イマシルちゃんの解説
きみが、ネットショップにログインしたまま、別のサイトを見ていたとするよ。
そのサイトに、こっそり「ネットショップで、高い商品を買う」っていう命令ボタンが隠されていたら?
ブラウザは、きみのログイン情報をつけて、その命令をネットショップに届けちゃうんだ。
ネットショップから見ると、きみ本人が注文したように見えちゃうんだよ。
より深い解説
定義
CSRF(Cross-Site Request Forgery)は、Webアプリケーションが、リクエストが利用者の意思で送られたものかを確かめていない脆弱性を突く攻撃である。ブラウザは、あるサイトへのリクエストに、そのサイトのCookie(セッションID)を自動で付けて送るため、別のサイトから送らされたリクエストも、ログイン中の利用者からの正規のリクエストとして処理されてしまう。
攻撃の流れ
- 利用者が、正規のサイトにログインする(セッションIDのCookieがブラウザに保存される)
- 利用者が、攻撃者の罠のページを開く
- 罠のページが、正規のサイトへのリクエスト(送金、パスワードの変更、書込みなど)を、自動で送信させる
- ブラウザが、正規のサイトのCookieを付けて送るため、正規のサイトは利用者本人の操作として処理する
対策
| 対策 | 内容 |
|---|---|
| トークンの確認 | 正規のフォームに、推測できない値(CSRF対策トークン)を埋め込み、送られてきた値を確かめる |
| 再認証 | 重要な操作の前に、パスワードの再入力を求める |
| SameSite属性 | Cookieに SameSite 属性を付け、ほかのサイトからのリクエストにCookieを付けないようにする |
| Refererなどの確認 | リクエストが、正規のページから送られたかを確かめる |
XSS、セッションハイジャックとの比較
| 攻撃 | 内容 |
|---|---|
| CSRF | 利用者に、意図しないリクエストを送らせる。攻撃者は、Cookieを盗まなくてよい |
| XSS(クロスサイトスクリプティング) | 正規のサイトの中で、攻撃者のスクリプトを利用者のブラウザで実行させる |
| セッションハイジャック | セッションIDを盗むなどして、利用者になりすます |