前書き
- railsセキュリティガイドを読んでも攻撃手法のイメージが具体的にイメージできなかったので記事に残します。
クロスサイトリクエストフォージェリとは?
⇨ユーザーが意図しない操作を勝手に行わせる攻撃手法.
攻撃事例.
* amazonで勝手に商品を注文される.
どうやって攻撃している?
手順.
①悪い人が不特定多数の人に不正操作(ECサイトの購入処理や銀行の送金など)を行わせるリンクをメールなどで送信する(この時相手がそのリンクをクリックしたくなる文言付きでくる).
②このメールのリンクを踏むと不正な購入処理などが進む可能性がある。
なぜこんなことができるの?
⇨amazonのサーバーは「不正なリクエストと正常なリクエストの区別がつかない」. (要は自分のブラウザーからリクエストしたのか他人のメール内のリンクを踏んでリクエストしたのかサーバーは区別がつかない)
①amazonでログインするとセッションidというユーザーを特定するための識別番号がユーザーのブラウザ内のクッキーに保存される(amazonのサーバーにリクエストを送信するたびにこのクッキー情報も自動でリクエストに含まれる).
②この状態で攻撃者が作成した不正メール内のリンクをクリックしてしまうとユーザーのクッキー情報も含まれたリクエスト(不正な購入処理など)がamazonのサーバーに送られる.
③amazonのサーバーは「あっ何かリクエストが来た。誰からだろうとcookieの中身を見に行く」そして「〇〇さんからだ」と認識し「〇〇さんは購入処理をしたいのか」と認識する
対策は?
⇨ユーザーごとのformの中に一意のセキュリティトークンを持たせる。サーバーはリクエストに含まれるクッキー情報とセキュリティトークンの有無を確認する。セキュリティトークンがあれば正しいリクエスト、ないのは不正リクエストと判断している
いつセキュリティトークンは発行されるの?
⇨ユーザーがログインしたタイミング。そのトークンはsession_idと関連付いている。また ユーザーだけのformタグ(アカウント変更や更新など)の中に隠しフィールドとしてそのセキュリティトークンは存在している。 クロスサイトリクエストフォージェリをしかける攻撃者はsession_idを知らないのでもちろんsession_idに関連付いているセキュリティートークンも知らない,なので攻撃者が作成するformタグの中にユーザーのセキュリティトークンを含ませられないので不正リクエストをサーバーに処理させることはできない。