企業とホワイトハッカーを結ぶ 日本初のバグ報奨金プラットフォーム BugBounty.jp

サイバーセキュリティエンジニアブログ

bugbounty.jp

ホワイトハッカー入門

脆弱性を見つけよう クロスサイトスクリプティング編

Dec 28, 2016 08:00 by 角田 朱生

第5回目からはWebアプリケーションの様々な脆弱性の見つけ方を紹介していきます。

各脆弱性の詳しい説明や脅威、対策方法については、IPAから提供されている「安全なウェブサイトの作り方」を参照ください。また、以下の書籍も参考になります。

体系的に学ぶ 安全なWebアプリケーションの作り方』SBクリエイティブ

検証環境の構築

Webアプリケーションセキュリティの普及・啓発活動を行う非営利団体「Open Web Application Security Project」(OWASP)から、脆弱性の検証や学習向けに仮想環境「OWASPBWA」が提供されています。これには脆弱性が作り込まれたWebアプリケーションがいくつも盛り込まれています。ローカルにこの環境を構築し、様々な脆弱性を実際に見つけていきましょう。

OWASPBWAのセットアップは簡単です。OWASP Broken Web Applications Projectのリンクからovaファイルをダウンロードして、VMwareやVirtualBoxなどの仮想マシンから開くだけです。以下の図ではVMwareから仮想環境を起動しています。起動後に表示されるURLをブラウザーから開くことでOWASPBWAにアクセスできます。

図1. OWASPBWAを起動してブラウザーからアクセス

今回はOWASPBWAの中から「BodgeIt」を対象に調査を行います。このサイトでは課題が用意されていて、脆弱性を用いて課題をクリアするとスコアを獲得できます。

図2. 課題をクリアするとスコアが緑に変わる

クロスサイトスクリプティング脆弱性の検出方法

今回はクロスサイトスクリプティング脆弱性を取り上げます。クロスサイトスクリプティング(XSS)とは、サイト上で入力値をHTMLやJavaScriptなどへ不適切に出力していた場合、攻撃者の仕掛けたスクリプトがサイト利用者のブラウザーで実行されてしまう問題です。攻撃手法によってReflected XSS、Stored XSS、DOM Based XSSに分類されます。まずはリクエストに含まれる値がレスポンスに出力される箇所で起こるReflected XSSを見つけましょう。

Reflected XSSを見つけるには以下の手順でサイトの挙動を確認します。

  1. 入力値がレスポンスに出力されるか
  2. 特別な意味を持つ記号がエスケープされずに出力されるか
  3. サイト上で任意のスクリプトを実行できるか

一部のブラウザーではXSSから利用者を保護する機能が内蔵されていて、スクリプトが実行できない場合があります。ここでは保護機能が内蔵されていないFirefoxを使ってサイトの挙動を確認します。

BodgeItのぺージや機能を見ていくと、検索ぺージで検索したワードが画面に表示されています。レスポンスを見るとHTMLタグの間に出力されることがわかります。

図3. testと検索した際の挙動

入力値が出力される箇所を見つけたら、記号がエスケープされるか確かめます。HTMLタグの間に出力されるような場合は、適当なHTMLタグを入力して、表示のされ方を確認しましょう。<s>test</s>と入力して検索すると、画面には「test」のように線が引かれて表示されました。

図4. <s>test</s>と検索した際の挙動

この線は<s>タグによる効果です。検索ワードに含まれた記号はエスケープされず、HTMLタグとして有効な状態で出力されています。<script>タグを使ってスクリプトも実行できそうです。BodgeItでは<script>alert("XSS")</script>というパターンでスクリプトを実行することで、XSS脆弱性を見つけたことになります。このパターンを入力するとalert()メソッドが動作して、画面にポップアップが表示されると思います。課題はクリアとなり、スコアも変わるはずです。

クロスサイトスクリプティング脆弱性の検出パターン

検索ぺージの他に、お問い合わせぺージでも入力した内容が画面に表示されています。<s>タグも有効に出力されたので、<script>alert("XSS")</script>を入力したところ以下のように出力されました。

図5. <script>alert("XSS")</script>と入力した際の挙動

これではスクリプトを実行できません。<script>"など、特定の文字列や記号を出力しないことでXSS対策を講じているようです。しかし、このようなブラックリスト方式のXSS対策は実装が不十分になりやすく、回避できる可能性が高いです。このような対策の回避方法は、OWASPの「XSS Filter Evasion Cheat Sheet」にまとめられています。また、JPCERT/CC(一般社団法人 JPCERTコーディネーションセンター)から日本語訳も公開されています。

このチートシートにはスクリプトを実行できる様々なパターンが紹介されています。<script>タグを使わないパターンなどを入力することで、お問い合わせぺージでもスクリプトを実行できると思います。しかしスコアは変わらないので、他にもXSS脆弱性があるようです。サイト内にはアカウント登録ぺージもあるので、登録した値がレスポンスに出力される箇所で起こるStored XSSも狙ってみてください。

BodgeItではalert("XSS")というスクリプトを実行することでクリアとなりますが、実際にバグバウンティへXSS脆弱性を報告する際はもう少し確認しましょう。例えばalert(location.origin)を実行して、スクリプトが対象のサイト上(オリジン)で実行されることを確かめましょう。また、その脆弱性を悪用してサイト利用者に不正なスクリプトを実行させる方法も考えてみてください。

次回も一つ脆弱性を取り上げ、その見つけ方を紹介します。良いお年を。

この記事をシェアしませんか?

  • 1

この記事のライター

角田 朱生

角田 朱生

同じカテゴリーの記事