XSS と CSRF
セキュリティの文脈で XSS (cross site scripting)
と CSRF (cross-site request forgeries)
がやたら出てくると思うのですが、名前も似てるしなんか悪さするスクリプトを埋め込むんだろうなーくらいにしか理解しておらず、明確な違いがわかっていなかったのでこの機会にまとめてみました。
XSS とは
XSS とは一言で表すと ユーザー(被害者)の Web ブラウザで任意の JavaScript を実行させることを許す脆弱性または攻撃手法
です。
ちなみに略称が CSS
ではなく XSS
なのは、Cascading Style Sheets とかぶってるのでややこしいからのようです。
XSS を実現する手順
どうやって、被害者のブラウザで JavaScript を実行させるかというと、
- 攻撃者が脆弱性のある Web アプリケーションを見つける。
- 不正なスクリプトを含んだ罠を用意する。
- 罠に誘導するための URL をユーザー(被害者)に SNS / メールなどで配る。
- 罠にかかったユーザーが URL にアクセスし、脆弱性のある Web アプリケーションにアクセスする。
- Web アプリケーションから不正なスクリプトを含んだ Web ページが返される。
- ユーザーの Web ブラウザで不正なスクリプトが実行される。
という手順を踏むことによって実行させます。
結果として Cookie や機密情報抜かれたり、偽情報を表示して社会的信用を落とされたりとか色々やられます。
XSS を防ぐには
1. 攻撃者が脆弱性のある Web アプリケーションを見つける。
と書きましたが、HTML 生成時に特殊文字をエスケープしないことが XSS を実現させてしまう一因となってしまいます。
例えば、入力フォームに検索条件を入力して、サーバーから返された検索結果を表示するようなサービスの場合、<
や >
をエスケープせずにそのまま入力できるようにしてしまうと、<form method="POST" ...>
みたいな感じで入力情報を別のサーバーに飛ばすフォームをブラウザにレンダリングさせることができるわけです
そのため対策として、HTML の特殊文字のエスケープ がとても大切になります。
CSRF
続いて CSRF です。CSRF を一言で表すと 正規ユーザを誘導し、強制的に特定の処理を実行させる攻撃を許す脆弱性または攻撃手法
と言えます。
forgeries/forgery
ってあまり聞かないですよね... 偽造
という意味らしいですよ。(サイトをまたがってリクエストを偽造する )
CSRF を実現する手順
どうやって強制的に特定の処理を実行させているかというと、
- ユーザーが特定の Web サービスにログインする
- 攻撃者が用意した罠ページにユーザーがアクセスしてしまう
- 罠ページから攻撃コードが Web サービスに送られてしまう
- ユーザーはログインが完了しているので、Web サービスにリクエストが届いてしまう
強制的に実行させる特定の処理
と言っているのは、例えば通販サイトであれば 商品の不正な購入
であったり、掲示板サービスだったら不正な書き込み
させると言った感じです
CSRF を防ぐには
CSRF は正常にログインしているのでサーバーでは不正なリクエストかどうかの判定が難しいところを突いてきている手法だと言えます。
なので、対策としては コメント投稿、商品購入、退会といった副作用が発生する画面の実行時に、想定通りの画面遷移が行われたかどうかを確認する
などして、セッションの管理を不備なく行うことが大切です。
また、事前にユーザーにサーバーからトークンを渡しておいて、副作用が発生する画面の実行時にトークンが正しいか確認する
ということも有効です。
まとめ
XSS
- 不正なスクリプトが実行されるのはユーザーの Web ブラウザ
- 受ける被害は機密情報を抜かれる、偽情報が表示され社会的信用を落とされるなど
- 対策として HTML の特殊文字のエスケープが有効
CSRF
- 不正なスクリプトが実行されるのは Web サーバ
- 受ける被害は通販サイトであれば商品の不正な購入、掲示板サービスだったら不正な書き込みなど
- 対策として、副作用が発生する画面の実行時に、想定通りの画面遷移が行われたかどうかを確認する。または、事前に渡したトークンが正しいものであるかをチェックするということが有効