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