もくじ
どういう攻撃なの?
- 攻撃者のサイトから、別のサイトにPOSTなどのメソッドを利用してフォーム送信が出来ることを利用した攻撃。
- CSRF(cross-site request forgeries)
クロスサイトリクエストフォージェリ、サイト間でのリクエストの強奪
CSRF脆弱性
以下のような攻撃(CSRF攻撃)を可能にする脆弱性を指す[1]:攻撃者はブラウザなどのユーザ・クライアントを騙し、意図しないリクエスト(たとえばHTTPリクエスト)をWebサーバに送信させる。Webアプリケーションがユーザ・クライアントからのリクエストを十分検証しないで受け取るよう設計されている場合、このリクエストを正規のものとして扱ってしまい、被害が発生する。CSRF攻撃はURL[1]、画像の読み込み[1]、XMLHttpRequest[1]などを利用して実行される。
具体的被害としてはデータの漏えい[1]、意図しないコードの実行[1]、権限の取得[1]、なりすまし[1]、防御メカニズムの回避[1]、アプリケーションデータの読み取り[1]などがありうる。権限の取得が可能な場合、その被害はユーザの持つ権限に依存する。ログインしていない状態でも起こりうる主な被害としてユーザ・クライアントに電子掲示板などへ書き込みをさせる行為があり[6]、これを利用してユーザを装った犯罪予告(例:パソコン遠隔操作事件)や大量の書き込みをさせるDoS攻撃(例:「ぼくはまちちゃん」 騒動)といった事件が発生した。
@see Wikipedia
具体的には?
- 掲示板やSNSに勝手に投稿されてしまう
- ECショップにログインしていた場合に買い物されてしまったりする。
- ネットバンクなら勝手に送金されてしまったりする。
攻撃者のサイトにアクセスした場合かつ掲示板、SNS、ECショップ、ネットバンクのフォームでCSRF対策を行っていなかった場合に限るので、どこが対策していないかは明確にわかる。
どう対策すれば良いの?
- 実装は簡単です、フォーム処理では必ず実装する癖をつける
- フレームワークを利用すると一行で済む
Laravelの場合
<form method="POST" action="post"> {{ csrf_field() }} <input type="text" name="user" value=""> </form>
{{ csrf_field() }}の一行で済みます。
フォーム入力ページ
- ワンタイムトークンを生成する
// 毎回異なるトークンでなければいけない - トークンをセッションに入れる
- トークンをhiddenで完了ページに渡す
フォーム完了ページ
- セッションに入っているトークンと、hiddenで渡されたトークンが正しいかを照合して合致しているかチェックする
→合致していなかったら、エラーメッセージを返して終了させる - フォームのプログラムを実行する
// メール送信や、DBへの格納など