エンジニアのspin13です. しばらくの間,地球そのものが敵となって花粉に苦しめられていました.
今回は クロスサイトリクエストフォージェリ(以後CSRF)について書きます.
CSRFとは
対象のwebアプリケーションがユーザの意図しないで送出されたリクエストを処理してしまう脆弱性.
具体例
言葉でうまく説明し辛いので具体例を提示する.
・気がついたらプロフィール設定が変更されていた!
・勝手にブログに記事が投稿されておる!
本来上記処理はユーザの操作で意図した処理として実行されるべきである.
手法
iframeでフォームを埋め込んで,開いた瞬間に対象のウェブアプリケーションにリクエストを送るようにする. 例えば下記のようなコードを仕込む.
<body onload="document.getElementById('form').submit()"> <form id="form" target="frame" method="POST" action="http://xxxx/yyyy/zzz.php"> <input name="f1" value="せいこう" type="hidden"> <input name="f2" value="だよ" type="hidden"> </form> <iframe id="frame" width="1" height="1"></iframe>
これでbodyに読み込まれた内容をsubmitという動きになる.
それぞれのinputタグの内容をターゲットのサイトのリクエストを実行するパラメータと揃えなければならない.
対策
・POSTリクエストを処理する部分でtokenをチェックする
パラメータを送出するページにワンタイムトークンを仕込んで,リクエストを処理する際に該当のトークンをチェックし,正しいリクエストかどうかを判断する. ※こちらのtokenはsessionIDをそのまま使うだけでも効果的だが,できればワンタイムトークンが望ましい. 要は攻撃者が本来想定できないようなパラメータを埋め込めば良い.
・Refererをチェックする
どこから飛んできたかをチェックすることによって,攻撃者が用意したサイトから飛んできたリクエストを弾くことができる. Refererチェックだけで対策するのではなくてトークンチェックをメインとし,Referチェックはあくまで保険として組み込んでおくのが良いと思う.