手軽にできる!クロスサイトスクリプティング(XSS)の脆弱性テスト

「クロスサイトスクリプティングの対策方法はわかった」とお思いのあなた。「遠足は家へ帰るまでが遠足」と言います。セキュリティ対策は、脆弱性テストを行うまでがセキュリティ対策です。

前回は、「クロスサイトスクリプティング(以下:XSS)の対策」について触れてきました。対策を行ったものの、実際に脆弱性がなくなったかどうかは実感がないかもしれません。

今回は、「XSSの脆弱性が起こる原因」と、「XSSの脆弱性をテストする方法」について触れていきたいと思います。

クロスサイトスクリプティング(XSS)の脆弱性が起こる原因

XSSの脆弱性が起こる原因は、主に以下の項目です。

  • サニタイズ処理を行っていない
  • 入力値の制限漏れ
  • スキームの確認漏れ
  • ヘッダにセキュリティ用のパラメータを設定していない
  • その他

では、順を追って解説していきます。

サニタイズ処理を行っていない

プログラムやスクリプトの書き方には、ルールがあります。「<」と「>」の中に命令を書き込み、「'」や「"」で文字列や数字を囲みます。

サニタイズ処理

プログラムに欠陥がある場合、「aaa">'>」というシンプルな文字列でも挿入できます。もともと書かれていたプログラムは無効化され、本来の役割を果たすことができません。

ですので、外部から害あるスクリプトを挿入されないよう、「<」「>」「"」「'」といった記号をサニタイズする必要があります。

サニタイズ処理のしくみ

サニタイズ処理をしていない場合

  1. 「<input type="hidden" value="">」に「"><script>alert(document.cookie);</script>」を挿入
  2. Webブラウザーが「<script>alert(document.cookie);</script>」をスクリプトとして認識
  3. WebブラウザーにCookie情報が記載されたアラートが表示される

サニタイズ処理をしている場合

  1. 「<input type="hidden" value="">」に「"><script>alert(document.cookie);</script>」を挿入
  2. 特殊文字が変換される(「&quot;&gt;&lt;script&gt;alert(document.cookie);&lt;/script&gt;」)

特殊文字が以下のようにサニタイズ処理されていない場合、Webブラウザーが攻撃スクリプトを認識してしまうおそれがあります。

サニタイズ処理

XSSの脆弱性の原因として一番多いのが、サニタイズ処理を行っていないことにあります。攻撃者は、テキストノードや属性値にサニタイズ漏れがないかどうか、確認を行う必要があります。

サニタイズ処理

ホームページを作成したあとは、サニタイズ処理が行えているかどうか、念入りに確認するとよいでしょう。

入力値の制限漏れ

たとえば、入力フォームに郵便番号を入力してほしいとき。対策としては「半角数字」を「7ケタ」までしか入力できないようにしておくとよいです。

しかし、制限がなければ、どんな文字種をいくらでも入力できます。つまり、攻撃スクリプトを挿入することも簡単に行えるのです。

注意点はサーバサイドにリクエスト送信する場合などサーバサイドにリクエストする前にフォームでチェックや制限してもダメです。フォームを使わずにリクエストを送ることができるかです。入力内容を受け付ける部分、使う部分でしっかりチェックするようにしましょう。

スキームの確認漏れ

攻撃スクリプトの挿入を許してしまう理由のひとつとして、「スキームの確認漏れ」があります。以下は、JavaScriptスキームによる、攻撃スクリプトを含ませたソースコードです。

<html>
<body>
<a href="javascript:alert(123456789)">click</a>
</body>
</html>

これは「擬似URLスキーム」と言われるもので、JavaScriptスキーム以外にも、さまざまなものが存在します。

サニタイズ処理と併せて、スキームを確認するプログラムを書いておくとよいでしょう。「http」「https」以外は読み込まないようにしておくと安全です。

ヘッダにセキュリティ用のパラメータを設定していない

「セキュリティ用のパラメータ」とは、「HPを守る!クロスサイトスクリプティング(XSS)の脆弱性対策」にも登場した、「X-XSS-Protection」や、「X-Frame-Options」などのパラメータのことです。

攻撃者は、さまざまな観点から情報を収集し、攻撃を行います。もちろん、ヘッダに目を通すことも情報収集のうちに含まれます。

そんなとき、ヘッダにセキュリティ用のパラメータが設定されていないと、「このホームページはセキュリティが甘い」と攻撃者は判断します。それから本格的に脆弱性調査を行い、攻撃を加えます。

その他

文字コードのしくみに関しては、「HPを守る!クロスサイトスクリプティング(XSS)の脆弱性対策」で説明しました。
このようにプログラムの不具合を利用して攻撃が行われる場合があります。
経験値が必要な部分でもありますが、攻撃に利用されそうな事象がないか「モンキーテスト(自由に操作し、不具合を見つける)」してみてください。

たとえば、サーバサイドの文字変換の不具合などないでしょうか。セッションを使いまわしている際に誤変換が生じるなど。

<input name="test001" value="test002">

「test001」と「test002」に、それぞれ以下のような値を与えます。

test001:%F1
test002:onmouseover%3dalert(123456789);//

<input name="%F1" value="onmouseover=alert(123456789);//">

この場合、「%F1」と、あとに続く「"」が、合わさって一文字と見なされます(「●」で表します)。

<input name="● value="onmouseover=alert(123456789);//">

結果、Webブラウザーがスクリプトを認識してしまい、「123456789」と書かれたアラートが表示されます。

クロスサイトスクリプティング(XSS)の脆弱性テストをしてみる

XSSの脆弱性テストを行ってみましょう。本記事では、気軽に行えるテスト方法を紹介します。ここで守るべきルールとしては、「自身のホームページ以外でテストを行わないこと」です。

注意点
第三者のホームページを対象にし、許可なく脆弱性を探したり、攻撃を行ったりすると、法律違反になる可能性があります。

過去に脆弱性を発見した者が逮捕され、有罪判決を受けてしまった例があります。

実際にWebページの脆弱性を探したり、攻撃を行ったりする場合、必ずご自身のホームページを対象にしてください。

入力フォームでXSSの脆弱性をチェックする

XSSの脆弱性チェック

入力フォームを探します。本記事では、テスト用に「test.php」「test_result.php」を作成しました。

「test.php」に入力フォームを設置してあります。「test_result.php」は入力結果画面です。「test.php」から「test_result.php」へアクセスできます。

XSSの脆弱性チェック

入力欄に「aaa">'>」と記入します。「aaa」はあとで検索しやすくするための文字列なので、「bbb」でも、「ccc」でも構いません。検索しやすい文字列を記入しておくとよいでしょう。

入力内容を送信します。「test.php」では、「確認」ボタンをクリックし、「aaa">'>」を送信します。

XSSの脆弱性チェック

アクセス先を確認します。この地点で、Webページの表示が崩れ、ソースコードの一部が露出してしまっている場合は、XSSの脆弱性があると思ってよいでしょう。

「test_result.php」では、特に異常は見られませんでした。

XSSの脆弱性チェック

ソースコードを確認します。「test_result.php」のソースコードを確認すると、「">'>」の部分がサニタイズされていないことがわかります。

よって、XSSの脆弱性があると判断できます。

URLパラメータでXSSの脆弱性をチェックする

XSSの脆弱性チェック

URLパラメータを探します。

XSSの脆弱性チェック

URLの末尾に「aaa">'>」と入力し、アクセスします。この地点で、Webページの表示が崩れ、ソースコードの一部が露出してしまっている場合は、XSSの脆弱性があると思ってよいでしょう。

「test_result.php」では、特に異常は見られませんでした。

XSSの脆弱性チェック

ソースコードを確認します。「test_result.php」のソースコードを確認すると、「">'>」の部分がサニタイズされていないことがわかります。

よって、XSSの脆弱性があると判断できます。

実際に自分のホームページを攻撃してみる

XSSの脆弱性が発見できたところで、実際に攻撃を加えてみます。「test001">'>」のあとに、攻撃スクリプトを続けて書いてみましょう。

どうやって攻撃したらよいかわからない場合、以下の3つを参考にしてください。コピー&ペーストですぐに使うことができます。

<script>alert(document.cookie);</script>

Cookie情報が記載されたアラートが表示されます。

— ! test001 — <h1 style="font-size:200px;lineheight:300px"><a onmouseover="alert(document.cookie);location.href='http://example.com/'">無料招待</a></h1>

改ざんページが表示されます。「無料招待」の上にカーソルを置くと、Cookie情報が記載されたアラートが表示されます。

「OK」をクリックすると、強制的に別のサイトへアクセスします。ちなみにアクセス先は「example.com」です。本記事のように例を挙げる場合、このWebページを使用します。

害あるWebページではありませんのでご安心ください。

<iframe src="http://www.example.com/" width="300" height="300"></iframe>

<iframe>が有効になっている場合、外部のWebページを埋めこむことができます。

まとめ

本記事では、XSSの脆弱性の原因と、脆弱性をテストする方法について触れてきました。実際に自分のホームページをさまざまな観点で見てみますと、意外な穴があるかもしれません。

セキュリティ対策は、自宅の戸締まりを確認するようなもので、身近かつ重要ですので、ぜひ習慣づけていきたいですね。