クロスサイトスクリプティング

クロスサイト・スクリプティング

検索キーワードの表示画面や、個人情報入力/登録時の確認画面等、利用者からの入力内容や HTTPヘッダの情報を処理しウェブページ上に表示されるものがあり、ウェブページへの出力の 際に、問題がある場合スクリプトを埋め込まれる可能性があります。

このような攻撃を「クロスサイトスクリプティング」といいますが、攻撃の影響はウェブサイト 自身ではなく、そのウェブページを開いている利用者に及びます。

発生する可能性のある脅威

  • 本物のサイト上に偽物のページが表示される。

  • ブラウザが保持しているCookieを取得される。

  • 任意のCookieをブラウザに保存させられる。

実装例

  • エスケープ処理の未対策
       use CGI qw/:standard/;
       $keyword = param('keyword');
        ...
        print ... <input name="keyword" type="text" value="$keyword">
    ... 「$keyword」の検索結果...

上記の場合、複数箇所で利用されている$KeyWordに対し、エスケープ処理の未実施が スクリプトを埋め込まれる原因となります。 エスケープ用の関数を利用すること、独自に作成したエスケープ処理関数を利用することで、 回避することが可能となります。

文字コードは製作者側から指定しないと、受信したデータを元にブラウザで独自の解釈を行うため、 予期していない異なった文字コードを解釈してしまう場合があり、脆弱性となる場合があります。

フレームワークなどを利用する場合だと、自動的に実装されているため、対策としては、極力 フレームワークを利用すること、明示的に文字コードを指定することで、回避することができます。

  • 対策漏れ

利用者から入力される文字に対し、エスケープ処理を行うという間違った 認識から発生します。攻撃はフォームのコメント欄のように自由に入力ができる項目で のみ発生することではありません。入力値に重点を置くと、その他の要素を見逃してしまう 可能性もあります。

入力段階でエスケープ処理を行うことも、同じく対策漏れなどを発生させる 可能性があります。クロスサイト・スクリプティングの脆弱性への対策における エスケープ対象は「出力要素」であるのに、入力段階でエスケープ処理を行うと 出力前の演算の結果が、HTMLスクリプトを形成するケースに対応できない、または 必要な部分にエスケープ処理が施されているかどうかの判断もソースコードからの 判断を行わなくてはなりません。

対策としては、出力項目に対し、エスケープ処理を行うこと、ブラックリスト方式 による入力チェックのみの実装などで防ぐことが可能となります。