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

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

目次

はじめに

クロスサイトスクリプティングという言葉をよく耳にするようになりました。
我々エンジニアが運用するWebサーバーがその攻撃に利用されるというのが恐怖を煽ります。
知らないうちに犯罪に加担してしまう結果にもなりかねないこのクロスサイトスクリプティングですが、どういうものなのかを周りでもちゃんと説明できる人はいないでしょう。

クロスサイトスクリプティングについて解説しているサイトや記事は山のようにあるにも関わらず、どれも微妙に説明が違っていて結局何が本当なのかよくわかりません。

セキュリティをビジネスにしているようなベンダーのページでは流石に気を使っていて、間違った理解をされないような説明になっていますが、逆に一般的すぎて意味がわかりません。

実はちゃんと理解するためにはWebサーバー上で動いているアプリケーションの仕組みに関する知識が必要なのです。
この記事ではクロスサイトスクリプティングがどういうものなのかに関して解説し、さらにそれを防ぐための対策に関しても簡単に説明します。

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

そもそもクロスサイトスクリプティングというのは、最近ではXSS(Cross-site Scripting)と略されることも多いのですが 本来ならクロスサイトスクリプティング攻撃(以降XSS攻撃)、あるいはクロスサイトスクリプティングの脆弱性(以降XSSの脆弱性)という言葉を使うのが正しく、ただクロスサイトスクリプティングというと、そのどちらを指しているのかがわからなくなります。

XSS攻撃が可能であるようなサーバーの脆弱性をXSSの脆弱性と言います。意味としてはサイト横断的なスクリプティングという事になりますが、サイト横断的というのはXSS攻撃が出現した時代には複数のサイトを行ったり来たりして不正コードを埋め込むことが多かったのでそのように呼ばれていますが最近は脆弱性を持つサイト1つだけにアクセスする場合の方が多いので既に「サイト横断的」は不要とも言えます。

次に、スクリプティングに関してですが、スクリプティングはスクリプト(=プログラム)を動かすという意味なのですが、スクリプトにはサーバーサイドスクリプトとクライアントサイドスクリプトの2種類があります。プログラムが動く環境がサーバー側なのかクライアント側(ブラウザ)なのかということで、サーバー側で動くのはJavaやPHP等で、クライアント側で動くのがJavaScriptです。

XSS攻撃で使われるのは主にクライアント側です。
現代のWebアプリケーションは多くがダイナミック型になっています。
以前主流であったHTMLだけでできているスタティックなサイトはもうあまり見られなくなっています。ダイナミック型はスクリプトやHTML5などを使ってユーザーのアクションに合わせて見せるページをダイナミックに構成変更します。ここに攻撃者がつけ込みます。

ここからは一般的なXSSの攻撃方法を解説します。
攻撃者はまず、ターゲットとなるユーザーがアクセスしそうな掲示板やブログ等にXSSの脆弱性を持つサイトへのリンクをつけて投稿します。
内容としては思わずリンクをクリックしてしまうようなものです。

リンクにはターゲットとなるサイトの中でダイナミックにページを変更して入力エリアを表示するページを出し、そのページに個人情報を入力させます。
そこでボタンを押すと入力エリアの一部にスクリプトを埋め込んだページを生成しそれをブラウザに表示させる事によってそのスクリプトをクライアント側で実行させることができます。このスクリプトには入力された個人情報を攻撃者のサイトに送るようなコードが仕込まれています。
このようにして攻撃者はユーザーの情報を盗むことができるのです。

クロスサイトスクリプティングへの対策

ここでは、XSS攻撃への対策のいくつかを例をあげて解説します。

入力値のチェックロジックの見直し

XSS攻撃が不正コードを埋め込むのは入力値であることが多いので、入力値にどんな値が入力されたのかをチェックするロジックで弾くのが有効になります。
チェック方法としては、不正なコードに特有のパターンを見つけることや、最初から入力値のフォーマットや文字数を限定するようなチェックを行うことによってある程度攻撃を防ぐことができます。

入力データのサニタイズ

サニタイズとは元々「消毒」あるいは「無害化」という意味ですが、ここでは不正コードに含まれているような特殊文字を無害な文字に置き換えるような仕組みのことを言います。
例えば”<”の文字は”&lt;”という文字に置き換えられます。このようなサニタイズの仕組みは標準的に有効になっているようなCMSもありますが、もう一度組み込まれて動いているかのチェックが必要です。

ソフトウェアの最新化

これはどんなものを対象にしたセキュリティ対策でも登場してくるものですが、基本として確実に行うべきです。使用しているWebサーバー関連のソフトウェアやツール、CMSなどのパッケージは常に最新化すべきです。それによって、知らないところに存在する脆弱性も修正されます。

WAF(Web Application Firewall)の導入

ネットワーク上で不正トラフィックをブロックするファイアウォールの機能のWebアプリケーション版で、WAFはHTTPのトラフィックを監視し、不正コードのパターンを見つけ出して遮断します。
つまり、前述の入力値のチェックを自動で行うことができるような機能と言えます。WAFはクラウド型を中心に色々なベンダーからリリースされています。AWSにおいてもAWS WAFというサービスが提供されています。

おわりに

これまで解説してきたように、XSS攻撃は、Webサーバーの脆弱性を利用してそのサーバーを利用するユーザーから個人情報を奪う以外にも、フィッシング詐欺やデータ改竄なども行われるような恐ろしいものです。

それを防ぐためにはサーバーのオーナーが常にチェックを行なって、前述のような確実な対策をとる義務があります。そして、対策のためにはXSS攻撃や他の脅威に関する正しい情報が必須です。その意味では我々は日々学習し続けなければならないのです。