(学習たれ流し)クロスサイト・リクエスト・フォージェリ(CSRF)
概要
利用者がサイトにログインしている状態(=セッションを確立している状態)で、攻撃者の罠により利用者が意図しないリクエストを実行させられてしまうことで、情報改ざんや意図しない操作などの被害を与える攻撃。
例えば、ショッピングサイトにログインしている状態で攻撃者の罠サイトにアクセスし、その中の罠となるリンクをクリックすることで、そのショッピングサイトへリクエストを送信し、意図しない商品を購入してしまうなど。
XSRF脆弱性のあるサイトの特徴
重要な情報のへのうや商品の購入といったがめんにおいて以下の全てを満たす場合、脆弱性がある。
画面上に表示されないhidden属性でトークンを持っていない、または推測可能である
以下のようにhidden属性でトークンを持ち、リクエスト毎に認証を検証する仕組みにしていない。
<form action="commit.php" method="post">
・・・
<input type="hidden" name="sid" value="6a0752gpmhignmnq109865438">
・・・
</form>
パスワードの再入力を求めない
どこからのリクエストかを意味するRefererを確認していない
つまり、罠サイトから遷移されていることを検証されていない。
発生しうる脅威
ログイン後の利用者のみが利用可能なサービスの悪用:不正な送金、意図しない商品購入、意図しない退会処理
ログイン後の利用者のみが編集可能な情報の改ざん、新規登録:意図しないパスワード変更、不適切な書き込み
注意が必要なウェブサイトの特徴
以下のセッション管理技術を持っているウェブサイト
Cookieを用いたセッション管理
Basic認証
SSLクライアント認証
また、以下のような機能を持つウェブサイト
金銭処理が発生するサイト:ネットバンキング、ショッピング
ログイン機能を持つサイト:会員専用サイト、日記サイト
根本的解決
処理を実行するページをPOSTメソッドでアクセスさせ、前ページにはhidden属性で秘密情報を持つページを自動生成して、実行ページで秘密情報を検証する仕組みにする
「①入力画面→②確認画面→③登録処理」のような画面があったとする。
②生成時に、セッション管理に使っているセッションIDとは別のセッションID(第2セッションIDとする)を生成し、秘密情報としてhidden属性にセットする。その後、③リクエスト時に第2セッションIDの一致を検証する場合のみ処理を実行する。
なお、③リクエスト時にはPOSTで行う。GETの場合、Refererに秘密情報が含まれてしまうためである。
処理実行直前で再度パスワードの入力を求める
操作の快適性に関わるが、実装は簡単である。(秘密情報の生成には、推測されないために暗号論的擬似乱数生成器などを用意しなければならないため)
Refererが正しいリンク元かを確認する
Refererを確認し本来の画面遷移を経ているかを判断する。確認できない場合や空の場合は処理を実行しないようにする。
ただし、攻撃者がウェブサイト上に罠を設置する可能性がある。また、利用者がブラウザやファイアウォール等の設定でRefererを送信しないようにしている場合、そもそもサイトを利用できなくなる可能性あるためこの対策を採用する際は注意すること。
保険的対策
重要な操作を行った際に。その旨を登録済みのメールアドレスに自動送信する
事後処理のため被害は防げないが、被害にいち早く気づくきっかけになる対策。