XSSがあるとどんな被害が出るのか?

というツイートがありましたので、もう少しわかりやすいサンプルをちょっと考えてみました。

サンプルコード

まず、上記のブログにあるコードを用意します。文字化けしないようにdefault_charsetの指定のみ追加しました。

index.php

<?php ini_set('default_charset', 'UTF-8'); ?>
<!DOCTYPE html>
<html>
<?php
if (isset($_REQUEST['in'])):
  echo "あなたが入力したのは「{$_REQUEST['in']}」だよ!!";
else:
?>
入力してね!
<form action="./" method="get">
  <input type="input" name="in">
  <input type="submit">
</form>
<?php
endif;
?>
</html>

PHPのビルトインサーバを起動します。

$ php -S localhost:8000

これで、http://localhost:8000/にアクセスすると、「入力してね!」という文字とフォームが表示されます。

これで、準備完了です。

攻撃のサンプル

今回は攻撃のサンプルを以下に用意しました。

Firefoxで上記URLにアクセスすると、5秒後に http://localhost:8000/ に自動的にPOSTします。もちろん、これは何をするかがわかりやすいように5秒待っているだけです。本当の攻撃者ならこんな親切なことはしません。

5秒も待てないという人は「Go」ボタンを押してください。

攻撃がうまくいくと改竄されたページが表示されます。

ページのURLを確認してください。ちゃんと http://localhost:8000/ になっているはずです。しかし、ページのコンテンツは書き換えられています。

つまり、上記の攻撃URLにユーザを誘導できれば攻撃は成功します。

このように、元のサイトのページを改竄することがXSSを利用するとできたりします。

ちなみに、単純な反射型のXSSなので、ChromeなどのXSS保護機能があるブラウザだと攻撃が成功しません。XSSフィルタを無効にするか、Firefoxを使って試してみてください。

XSS脆弱性の可能性はあなたが考えるよりも大きい

「任意のコード(スクリプト)が実行できる」というのは結構いろいろなことができるのです。JavaScriptでできることはすべてできるということです。

JavaScriptで何ができるでしょうか?相当いろいろなことができますよね。

今回のようにページを書き換えるDOM操作はJavaScriptの主要な機能ですし、Cookieを読み込むことも(Cookienの設定によっては)できるでしょう。入力されたパスワードを盗んでどこかにこっそり送信するということもできるかも知れません。

ページを改竄できるということは、ログインページのID/パスワードの送信先のURLを書き換えることもできるということです。正規のサイトのログインページで送信先だけが改竄されていたらユーザがそれに気付くことは相当困難でしょう。

また、今回は反射型のXSSなので、攻撃するためにはユーザを攻撃URLに誘導する必要がありました(受動的攻撃)。しかし、XSSは反射型だけに限られません。蓄積型のXSSの場合は、実際のサイトにXSSのスクリプトが蓄積されるため、サイトにアクセスしただけでスクリプトが実行されます。

また、XSS脆弱性と他の脆弱性を組み合わせて、さらにすごい攻撃にするということも考えられます。

実際、攻撃というのはいろいろなパターンの組み合わせであり、自分がうまく攻撃方法を想像できないからと言って本当に攻撃できないかどうかは全く分かりません。

それから、<script>alert("まだPHPとか使ってんの?ww")</script>というような攻撃の例はJavaScriptが実行できますよという証明をしているだけで、決してユーザにメッセージを表示できるということや、メッセージにより心理的な攻撃ができる、ということを示したいわけではありません。

まとめ

  • XSS脆弱性の可能性はあなたが考えるよりも大きい
  • 自分がうまく攻撃方法を想像できないからと言って本当に攻撃できないかどうかは全く分からない
  • 「任意のスクリプトが実行できる = 脆弱性」なのできちんとXSS脆弱性のないコードを書きましょう

参考

関連

Date: 2015/05/18

Tags: xss, security