はじめに
セキュリティはエンジニアとして生きていく以上目を背けることができないものです。今回は、有名な攻撃手法のクロスサイトスクリプティングというものについて紹介します。
本記事の対象者:Webサイトを運用してみたい初学者の方
クロスサイトスクリプティングとは
Webサイトの不備をついて、サイト上に悪意のあるスクリプトを埋め込む攻撃です。基本情報技術者試験とかでも出題される攻撃手法なので名前は知っているという方も多いのではないでしょうか。さて、この攻撃ですが注意しないといけないのは以下のような機能をもったサイトを運用している方です。
- 入力内容を確認させる表示画面(会員登録、アンケート等)
- 誤入力時の再入力を要求する画面で、前の入力内容を表示するとき
- 検索結果の表示
- エラー表示
- コメントの反映(ブログ、掲示板等)
ほとんどのWebサイトがいずれかに該当する機能をもっているのではないでしょうか。つまり、Webサイトを運用していく上でこのクロスサイトスクリプティングについて知り対策することは必要不可欠です。
被害事例
簡単に過去のクロスサイトスクリプティングを利用した被害事例を見てみましょう。
-
Youtube
- コメントシステムにおけるクロスサイトスクリプティングの脆弱性が悪用された。デマニュースのポップアップが表示されたり、別のWebサイトにリダイレクトされるなどの被害が相次いだ。
-
Twitter
- TwitterDeckにおけるクロスサイトスクリプティングの脆弱性が悪用された。勝手に意味不明な投稿をさせられるワームが拡散。50万人ほどが影響を受けたと言われている。
デモサイトを使って実験してみる
どんなものかを視覚的に理解しやすくするため、脆弱性のあるWebサイトを用意し、実験をしてみました。
名前とメッセージを入力して送信すると、リアルタイムでメッセージが反映される掲示板のようなサイトです。
まずは意図する挙動を見てみましょう。これは名前を「test」、メッセージを「Hello World」にしています。これを送信すると...
掲示板部分にチャットが反映されました。当然ながら、これが本来望まれている挙動です。
では、次に予期せぬ挙動をするメッセージを送信してみます。
なんということでしょう。文字が大きくなり、字は赤色に変えられてメッセージが投稿されています。これは意図する挙動ではありません。
何が起こったのでしょうか。答えは簡単で、メッセージ部分に入力された文字列がhtmlタグとして解釈されてしまったからです。先ほどメッセージ部分に入力した文字列はhtml上で「Hello World」を見出しの大きさにして、赤色にするという意味になります。
このhtmlタグをユーザが利用できてしまうヤバさを認識してください。htmlタグを入力できるということは<script>タグが使えます。つまり、JavaScriptのコードをユーザが実行することができます。以下のメッセージを送信してみます。
画面にアラートが表示されてしまいました。JavaScriptのコードを実行できることがわかりましたね。
対策
これだけには限りませんが、重要なものをピックアップしました。
-
サニタイジング
- 特殊な記号にエスケープ処理を施す。例えば、「<」「>」「&」など。フレームワークを使って文字の受け渡しをしている場合、勝手にエスケープ処理されていることが多いが、油断は禁物。
-
URLの出力時には、「http://」「https://」で始まるURLのみを許可
- URLには「javascript:」で始まるものがあるので、ユーザが入力したURLを<a>タグで出力する処理がある場合、「http://」「https://」以外は弾くようにする。※「javascript:」だけを拒否するブラックリスト方式ではなく、「http://」「https://」だけを許可するホワイトリスト方式にする方が漏れがなくて安全。
おわりに
もしも、Webサイトにクロスサイトスクリプティングの脆弱性が残っていた場合、Cookie情報の流出、不正なサイトへの強制リダイレクト、Webページの改ざんといった重大な被害につながる恐れがあります。自分のサイトを運用している方は今一度設定を見直しましょう。