ANNAIマガジン
xss
この記事は「 Introduction to cross-site scripting (XSS) and Drupal 」の翻訳です。
この記事の目次

クロスサイトスクリプティング(XSS)は、コードの脆弱性の一種であり、ユーザーの同意や自覚なしにブラウザ内でコードを実行することができます。 XSSは一般的にJavaScriptで実行されますが、Flash、Javaなどの類似のWebプログラミングが使用されることもあります。

XSSはブラウザ内において、セッション(クッキー)を使用して、あなたの代わりにサイトとのやり取りを可能にするコード利用することで、攻撃者があなたと同じ権限でのアクセスを可能とします。

悪意のあるXSSコードを実行しているページにアクセスすると、新しいコンテンツの投稿、他のユーザーへの友達申請、投票、サイトの管理設定の変更など、サイト内であなたが行う事ができる、あらゆる操作を第三者が行うことができる状態となります。

なぜ「クロスサイトスクリプティング」と呼ばれているのか?

クロスサイトスクリプティングの歴史に関する記事の中で、Jeremiah GrossmanはXSSについて以下のように説明しています。

悪意のあるWebサイトは隣接するフレームやウィンドウに別のWebサイトを読み込み、そこにJavaScriptを読み込ませます。これにより、あるサイトがサイトの境界を越えて別のページにスクリプトを書き込んだり、フォームからデータを取り出したり、ページを書き直したりすることができるようになります。そのため、クロスサイトスクリプティングという名前が付けられました。

当時は、XSSはあるサイトの悪意のあるコードが別のサイトに影響を及ぼすということを意味していました。しかし、最近ではこれだけではなく、ブラウザがデータとしてではなく、実行可能なコードとして認識してしまうような形式のコード(Javascriptだけとは限らない)の挿入という、全般的なHTMLコードインジェクションを意味します。

クロスサイトスクリプティングはどのよう実行されるのですか?

このビデオでは、悪意のある訪問者がXSSを使用してユーザーのパスワードを変更できるという、不適切なサイトの例を示しています 。次に、Security Reviewモジュールを使用して、サイト内のXSSの脆弱性を特定し、修正する方法を示します。Security Reviewモジュールは完全な解決策ではありません。一般的な脆弱性を発見するだけです。

クロスサイトスクリプティングを特定するにはどうすればよいですか?

次に、クロスサイトスクリプティングの脆弱性を特定するいくつかの方法を見てみましょう。 基本的な問題としては、ブラウザ内でコードを実行できることです。 セキュリティレビューではJavaScriptの脆弱性がよく見受けられますが、他の攻撃手段も無視すべきではありません。
これまでの経験から、3つの方法を利用するとセキュリティーレビューを効率化する事ができます。

  • JavaScriptのalert() メソッドで表示されるボックスなど、見逃しにくいポップアップするものを使用してください。
  • インジェクションが行われた場所に固有の警告の内容を作り、そららを辿る事ができるようにします。
  • フィールドにより、フィルタリングする情報のタイプが異なる可能性もあるので、複数のメソッドを試してみましょう。

具体的には、これらの2つの文字列をインジェクションしようとします。

"><script>alert('blog-node-title');</script>
"><img src="u.png" onerror="alert('blog-node-title');"</script>

"> で始まる文字列を入力することで、その文字列がHTML属性の中に展開される場合にインジェクションを発生させることができます。これらの文字列を投稿してサイトを閲覧すると、JavaScriptのポップアップボックスが表示されることがあります。

アラート内のメッセージ(前の例のblog-node-titleなど)を調べて、それがインジェクションしたコードのaltertで指定した文字列に由来することを確認してください。その後、ページのHTMLを調べて、JavaScriptが漏れている箇所を見つけ、コードをトレースして適切なフィルタ関数を追加することができます。

終わりに

XSSはDrupalに限らずWebシステムやWebサイト全般で脅威になる問題です。

Drupalの場合、Form APIInput Filter を適切に利用すれば何も問題ありませんが、これらを使わずに直接フォームを制御したりJavascriptを埋め込んだりすると脆弱性に繋がる可能性があります。

独自にカスタマイズした機能を作成する場合は、filter_xsscheck_plain などのAPIを利用して適切にエスケープを行ってください。

サニタイズ用に用意されているAPIは Sanitiation functions で確認することができます。

この記事を書いた人 : Yoshikazu Aoyama

ANNAI株式会社の出社しないCTO。
昔は回線交換やL2/L3のプロトコルスタックの開発をしてました。その後、組み込みLinuxやJava/Ruby on RailsなどのWebシステム開発などを経て現職。
インフラからDrupalのモジュール開発、Drupal以外の開発までなんでもやります。
普段は札幌で猫と一緒にリモートワークしています。 好きなモジュールは Restful Web Services と Rules

関連コンテンツ