TOP設計・移行・活用> はじめに
脆弱なWebアプリケーション
脆弱なWebアプリケーション

第3回:パラメータからの情報流出
著者:セントラル・コンピュータ・サービス  長谷川 武
2005/5/11
1   2  3  4  次のページ
はじめに

   これまで、Webアプリケーションの脆弱性は大きく5つのカテゴリーに分けられることを説明し、第2回では第1のカテゴリー「ファイル流出」を紹介した。今回はカテゴリーの2番目「パラメータからの情報流出」を解説する。
※注意: この記事にはWebアプリケーションの脆弱性を解説する必要上、攻撃手口に関する情報が含まれています。これらの手口を他者が運営するWebサイトに向けて仕掛けると、最悪の場合刑事罰および損害賠償請求の対象となります。脆弱性の調査・検証は、必ずご自身の管理下のコンピュータシステムおよびローカルエリアネットワークで行ってください。この記事を参考にした行為により問題が生じても、筆者およびThinkIT編集局は一切責任を負いません。


パラメータからの情報流出

   「パラメータからの情報流出」とは、あるページから次のページへと場面を切り替える際に受け渡されるパラメータがもとで、別人の個人情報が読み出されるなどの問題が起こる脆弱性のカテゴリーである。「情報流出」と名づけてはいるが、ショッピングサイトでパラメータがいじられ不当な安値で買い物されてしまうような改ざん系の問題もこのカテゴリーに含まれる。

ページ間パラメータ
図1:ページ間パラメータ

   WebページとWebページの間でパラメータを受け渡す方法には大きく3つある。それは
クエリーストリングhiddenフィールドHTTP Cookieだ。これらはどれも情報流出と改ざんを招く危険な存在である。順に見ていこう。


クエリーストリング

   クエリーストリングとは、Webページを呼び出すURLの中のパラメータの部分を指す。例えば次のようなURLがあったとする。

http://domain/path/program.cgi?type=A&size=7

   この中の「?」記号よりも後ろの部分、「type=A&size=7」がクエリーストリングだ。クエリーストリングという呼び名は「検索文字列」を意味し、かつては検索キーワードなどをプログラムのパスの後ろに置いていたところからこの名がついた。今ではここに汎用的なパラメータを配置する。どのような形式でパラメータを記述するかは本来自由なのだが、「名前=値」の対の形で表されたパラメータを「&」記号で区切って並べることがおおむね慣習になっている。


クエリーストリングは丸見えで改ざんも容易

   人間は目で見たものには好奇心を持ち、それをいじってみたくなるものである。クエリーストリングはその格好の対象となる。ページ間のハイパーリンクのURLの内容は、ユーザがブラウザで視認できるだけでなく、簡単に一部を変更することができるからだ。

   Webページのハイパーリンクをクリックして次のページへ遷移すると、新しいページの呼び出しに使われたURLはWebブラウザのアドレスバーに表示される。長過ぎて欄からはみ出してしまうこともあるが、われわれはプログラムのパス名とそれに付随するパラメータを視認しながらWebページを歩き回っているのが日常である。

   そして、中には「切れている」リンクにも出会う。ページが消されたのではなくリンクの記述のほうが誤っている場合などに、ブラウザのアドレスバーのURLを直して目的のページにたどり着いた経験をお持ちの方も多いはずだ。これは善意にもとづいてリンクを修復した例だが、悪意を持ってページ間パラメータに干渉しようとする人物もいるので問題が起きる。

   例えば、ユーザが最近行ったショッピングの明細を確認するページへのハイパーリンクのURLが次のような形をしていたとする。

https://domain/shopping_detail?userid=hasegawa&item=32

   これは、現在のユーザ「hasegawa」が行ったショッピングの32件目の明細を表示するものだとしよう。このURLのパラメータの使い方の見当がつけば、次のようなURLをブラウザから次々と投入して、それ以前に行ったショッピングについても、31件目、30件目、29件目…のように呼び出すことができるだろう。

https://domain/shopping_detail?userid=hasegawa&item=31
https://domain/shopping_detail?userid=hasegawa&item=30
https://domain/shopping_detail?userid=hasegawa&item=29


   自分の過去のショッピング明細を呼び出す分にはさほど問題はないが、「userid=」のほうのパラメータを書き換えられることも気がつくだろう。

https://domain/shopping_detail?userid=tanaka&item=1
https://domain/shopping_detail?userid=suzuki&item=1
https://domain/shopping_detail?userid=koizumi&item=1


   上記のように試していくと、他人の買物履歴の覗き見に成功するかもしれない。そうなると大問題だ。

1   2  3  4  次のページ


セントラル・コンピュータ・サービス株式会社
著者プロフィール
セントラル・コンピュータ・サービス株式会社  長谷川 武
シニア・セキュリティ・スペシャリスト、IPA 非常勤研究員。2002年にはIPA ISEC『セキュア・プログラミング講座』の制作ディレクターをつとめた。これを契機に、現在は勤務先とそのパートナー企業を通じてセキュアプログラミングセミナー/実習/スキル評価テストといった教育サービスを「TRUSNET(R)アカデミー」として提供している。問い合わせE-mail:info@trusnet.com


INDEX
第3回:パラメータからの情報流出
はじめに
  システム全体に渡る連番
  hiddenフィールド
  HTTP Cookie