はじめに
現在携わっているシステムでセキュリティのチェックをするにあたり、
曖昧な知識しかないなと痛感したので、復習を兼ねて調べてみることにしました。
今回はクロスサイトスクリプティングについてです。
クロスサイト・スクリプティングとは
ウェブページの出力処理に問題がある場合に、そのウェブページにスクリプト等を埋め込まれてしまうことをクロスサイト・スクリプティングの脆弱性といいます。
その脆弱性を悪用して、利用者のブラウザ上で不正なスクリプトを実行する攻撃をクロスサイト・スクリプティング攻撃といいます。
この攻撃を受けると、ウェブサイトを閲覧している利用者には以下のような影響を及ぼす可能性があります。
本物のサイト上に偽のページが表示される
- 偽情報の流布による混乱
- フィッシング詐欺による重要情報の漏洩
例えば、ウェブサイト上に偽のログイン画面や個人情報入力画面が表示されることで、
入力したアカウント情報や個人情報が漏洩してしまう可能性があります。
ブラウザが保存しているCookieを取得される
- CookieにセッションIDが格納されている場合、利用者へのなりすましにつながる
- Cookieに個人情報等が格納されている場合、その情報が漏洩する
例えば、ログイン管理にセッションIDを利用しているサイトの場合、セッションIDが漏れることで、知らない間に別の人に自分のアカウントで取引や投稿などをされてしまう可能性があります。
任意のCookieをブラウザに保存される
- セッションIDが利用者に送り込まれ、セッションIDの固定化攻撃に悪用されます。
セッションIDの固定化とは
悪意を持った人物が、あらかじめ用意したセッションIDを利用者に送り込み、そのセッションIDで利用者がログインすると発生する問題です。
このセッションIDの送り込みは、セッションID受け渡し時の不備が悪用されています。
この攻撃をされると、あらかじめ用意したセッションIDで本人になりすましてウェブサイトにアクセスすることができてしまいます。
注意の必要なサイト
- cookieを利用して、ログインセッション管理を行なっているサイト
- ログイン画面や個人情報入力画面をもつサイト etc.
主な原因
1. 入力したスクリプトをそのまま実行できる状態になっている
1.ユーザーが入力した文字列をエスケープしないで画面に表示している
- スクリプトを作成する際には、&や<、>、,、"などの特殊文字が利用されますが、
それらの文字があった場合文字列に置き換えるなどの処理を施していないと、
そのスクリプトが実行され、クロスサイト・スクリプティングが実行できてしまう可能性があります。
2.入力値が制限されていない
-
郵便番号や電話番号、計算値のような数字以外の情報を入力しない入力欄に対して
何も入力値の制限をしないこともクロスサイト・スクリプティング攻撃に繋がる可能性があります。 -
また、文字数制限がないと、スクリプトが書きやすくなってしまう可能性があります。
対策
1.入力したスクリプトをそのまま実行できる状態になっている場合の対策
- 入力されたデータに対してエスケープ処理を実行するなどして、スクリプトを無害化する必要があります。
- 文字列に変換するなどして無害化しておけば、スクリプトが文字列として表示されるだけになり、攻撃者の意図するような攻撃を防止することができます。
具体例として、
<div>何か処理</div>
のような値が入ってきたときに、そのまま処理してしまうと、意図しない画面が表示されてしまうなどの危険性があります。
これに対して、
< → <
> → >
に置き換えると
<div >何か処理</div>
のようになり、スクリプトではなく、文字列と認識されるようになります。
この置き換えの処理はライブラリを使うか、自分で置き換えのための関数を作って、それを使ってエスケープ処理を実施するといいでしょう。
2.入力値が制限されていない場合の対策
-
入力欄には意図した値以外は入力できないように制限を設けておくと、スクリプトを入力されるリスクを軽減できます。
-
また、入力値の制限が難しい場合なども、文字数を制限しておくことでクロスサイト・スクリプティング攻撃を抑止することにつながります。
-
また、入力値のチェックについては、ブラウザ側で制限を追加するだけでなく、サーバー上でも行うことが大切です。
なぜなら、ブラウザ上でのチェックはJavaScriptで行いますが、JavaScriptを無効にすることで、ブラウザ上でのチェックを免れてしまう可能性があるからです。
加えて、JavaScriptを無効にしなくてもクライアントサイドで書き換えができることもあるので、サーバー側でのチェックは欠かさないようにしましょう。
参照