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脆弱性のないコードを書きましょう

参考

関連

Tags: xss, security

NetBeans 8.0のCodeIgniterプラグイン

(2015-11-16 追記) プラグインの使い方を解説した「本当は相性がいいNetBeansとCodeIgniter」を書きました。

NetBeans 8.0用のCodeIgniterプラグインは以下にあります。最新版はバージョン0.4.1です。

ダウンロードしてインストールし、プロジェクトのプロパティでCodeIgniterを有効(Enabled)にすると、

プロジェクトのアイコンにCodeIgniterの炎のマークが付きます。

あと、本家でも開発中だったりします。

関連

Tags: netbeans, codeigniter

CodeIgniter 3.0のアプリをコードレビューしてください

CodeIgniter 3.0がMITライセンスでリリースされたことを記念して、『CodeIgniter徹底入門』に掲載されているアプリをCodeIgniter 3.0対応にアップデートしてみました。

なお、書籍に掲載されているソースをこのようにGitHubで公開したり変更したものを配布することができるのは、この書籍のコードがオープンソースライセンス(修正BSDライセンス)で公開されているからです。ライセンスに従う限り著作者の許可なく自由に再配布可能です。とくにそういうことになっていない書籍のコードは著作者の許可なく配布することはできませんので注意してください。

『CodeIgniter徹底入門』について

『CodeIgniter徹底入門』についてご存じない方は、以下のページをご覧ください。

『CodeIgniter徹底入門』のアプリ

もともとのアプリはCodeIgniter 1.6.1用に書かれたものでしたが、CodeIgniter 3.0への移行は完了し、テストもだいたい追加し、ある程度リファクタリングしました。

▼テストカバー率

コードレビューしてください

このアプリのコードレビューを、どなたでも興味のある方にお願いしたいと思います。コメントや修正すべき点などありましたら、GitHubのIssuesかPull Requestをお願いします。

おまけ

NetBeans 8.0用のCodeIgniterプラグインは以下にあります。

あと、本家でも開発中だったりしますが。

関連

Tags: codeigniter, book