他社および他組織のWebサイトなどへのポートスキャンおよびデータの取得などの行為で得た情報を侵入などに悪用するか、または同じ目的を持つ第三者に提供した時点で違法となります。ご注意ください。
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。
また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。
前回はWebアプリケーションの検査とはどういったものなのか、ということについて説明した。今回からは、実際にWebアプリケーションの検査に入っていく。前回説明した検査用ツール「Achilles」のインストールは済んでいるだろうか。今回はAchillesを実際に使用するので、まだという方は、前回の説明を見ながらインストールし、使い方に慣れておいていただきたい。
※注
検査について説明していくには、検査対象のWebサイトが必要である。しかし、当然のことながら実際のWebサイトを用いるわけにはいかないので、筆者の手元にあるデモサイトを用いて説明していくことにする。
まずは、今回検査対象とするWebサイトについて説明しておこう。このWebサイトではオンラインショッピングを提供している。主要な機能は以下のとおりである。
全体の画面遷移はこのようになっている。
さて、Webサイトを検査するわけだが、何から手を付ければよいだろう? クロスサイトスクリプティング?SQLインジェクション?前回までの説明で、不正な入力として何を入れればよいかは理解しているかと思うが、実際に入力するのはもうちょっと待ってほしい。最初に行うのは、Webサイト全体の構成をしっかりと把握することだ。
広義の意味では、Webサイトを構成するすべてのコンポーネントのことを指すが、範囲が広すぎるため、本稿での「Webサイト構成」とは、ディレクトリ、HTMLファイル、CGI、PHP、JSPなどのアプリケーションのことを指す。
把握する項目としては以下のようなものがある。
今回はこの中から「画面遷移図」「セッション管理方法」「画面遷移条件」について説明する。
検査を行ううえで、画面遷移図を作ることは非常に重要である。画面遷移図を作るとWebサイト全体を把握することができ、検査の漏れが少なくなる。今回の検査対象Webサイトの画面遷移図は先ほど挙げたとおりである。もし画面遷移図が存在しない場合は、Webサイトを巡回しながら作成していく。
Webアプリケーションの検査を行ううえでセッション管理の方法を調べる作業は非常に重要である。なぜ最初にセッション管理について調べるのか。前回、自動検査ツールの欠点について説明した。自動検査ツールの巡回機能は、すべての画面を巡回できるとは限らないし、ステータスも考慮してくれない。この欠点を補うために、手動によりセッション管理の方法を調べるわけだ。この情報を使って、すべての画面を巡回し、すべてのステータスで検査を行う。
セッション管理の方法としては以下の3種類にほぼ分類できる*1。
*1
ほかに、BASIC認証やクライアント証明書を使ったものがある
この中のどの方法が使われているのか調べるところから始める。方法は簡単だ。クライアントとサーバの間で、どのようなデータがやりとりされているか見ればいい。ただし、やみくもにデータを見ればいいわけではなく、セッションの状態を見ながら、そのステータスを維持しているパラメータを見つける。一般的に、
で、パラメータを調べるとよいだろう。
画面遷移条件とは、次の画面に進むための条件のことをいう。例えば、
などである。今回の検査対象Webサイトでは、ショッピング機能のところで、商品の選択を行った後に商品送付先の住所を入力している。そのため、住所入力のところを検査する場合は、あらかじめ商品を選択しておく必要がある。
さて、理論的な説明はここまでにして、実際にデモサイトを使って話を進めることにしよう。読者はスクリーンショットを見ながら読み進めてほしい。
まずはWebサイトにアクセスして、全体を触ってみるところから始める。デモサイトが提供している機能はすでに紹介済みだが、このフェイズでは実際にブラウザでアクセスして、それらの機能を試してみる作業を行う。実際に使ってみることで、どのあたりに脆弱性がありそうか分かってくる。このフェイズで画面遷移図を作っていくといいだろう。
ここで見ておくべきポイントをいくつか挙げておこう。
では、取りあえず巡回してみよう。Achillesを起動して、
にチェックを入れて、プロキシをスタートさせる。この状態では、AchillesはすべてのHTTPリクエスト/レスポンスを中継する。
プロキシの準備が整ったら、Webサイトにアクセスする。最初にアクセスするのは、トップページ(図1:http://www.example.com/index.cgi)だ。
リクエストを送ると、サーバから次のようなレスポンスが返ってくる。
HTTP/1.1 200 OK Date: Sun, 28 Sep 2003 16:04:31 GMT Server: Apache/2.0.40 (Red Hat Linux) Pragma: no-cache Set-Cookie: ss=312901200304091387 Connection: close Content-Type: text/html; charset=euc-jp <html> ……(省略)
ここで、
Set-Cookie: ss=312901200304091387
この行に注目する。どうやらこのWebサイトではCookieを使っているらしい、ということが分かる。しかし、これがセッション管理用のパラメータであるかどうかはまだ分からない(「ss」という名称は、明らかに怪しいが)。ただ、セッション管理機能を持つ多くの言語(JSP/Servlet、PHP、ASPなど)は、ログイン前からセッション管理を開始する場合があるので、もしかしたらこのデモサイトもセッション管理を開始したのではないか、と考える。ログイン前の状態で「GUESTさんようこそ」(図1)と表示されている点が怪しい。
ほかのメニュー、例えば、
などにアクセスしても、ログイン前では「GUESTさん ようこそ」と表示される。この時点で、以下のことが分かる。
以上のことより、もし「GUEST」というステータスを維持しているのであれば、セッション管理方法はCookieであり、パラメータ「ss」がセッション管理用のパラメータである、ということが分かる。
現在はログインしていない状態なので、取りあえずログインしてみる。アカウントは、あらかじめ登録しておいた「nakanaka」を用いる。
IDとパスワードをログインフォームに入力して送信する。
このとき送信されるリクエスト/レスポンスは以下のようになる。
POST /login.cgi HTTP/1.0 Content-Type: application/x-www-form-urlencoded Host: www.example.com Content-Length: 26 Cookie: ss=312901200304091387 loginid=nakanaka&password=nakanaka
HTTP/1.1 200 OK Date: Sun, 28 Sep 2003 16:16:31 GMT Server: Apache/2.0.40 (Red Hat Linux) Pragma: no-cache Connection: close Content-Type: text/html; charset=euc-jp<html> ……(省略)
ログイン後の画面では「nakanakaさんようこそ」と表示されている(図23)。
しかし、レスポンスヘッダを見ると分かるように、新規Cookieは発行されていない。また、ログイン後のほかのメニューへのアクセスは、ログイン前と同じく何のURLパラメータも付いていないただのリンクとなっている。よって、セッションを維持するためのパラメータはCookieしかないことが分かるので、セッション管理の方法はCookieということになる。
もう1つ、セッション管理パラメータを特定する方法があるのでそれを試してみよう。その方法とは、セッションを維持していると思われるパラメータを取り除いてアクセスする、というものだ。もし取り除いたパラメータがセッションを維持しているパラメータだった場合、サーバは未認証状態と認識して、ログイン前の状態、つまり「GUESTさんようこそ」というページを返してくるはずだ。
今回はCookieが怪しいので、これを消してアクセスしてみる。Cookieを消すといってもブラウザの機能を使って消すのではなく、Achillesを使って行う。
WebブラウザでTOPページ(図1:http://www.example.com/index.cgi)にアクセスするとAchillesにブラウザからのHTTPリクエストが表示される。ここで、
Cookie: ss=312901200304091387
この行を消してから「Send」ボタンを押して、サーバにリクエストを送る。すると、サーバから以下のようなレスポンスが返ってくる。
HTTP/1.1 200 OK Date: Mon, 29 Sep 2003 15:20:20 GMT Server: Apache/2.0.40 (Red Hat Linux) Pragma: no-cache Set-Cookie: ss=213000200320091388 Connection: close Content-Type: text/html; charset=euc-jp <html>……(省略)
Set-Cookieヘッダで、新しい「ss」がセットされている。また、ブラウザに表示されるページも「GUESTさんようこそ」となっている(図24)。
以上のことから、このWebサイトではセッション管理にCookieを使用しており、パラメータ「ss」がセッション管理用のパラメータである、ということが分かる。
セッション管理方法が分かったら、今度はセッションIDの強度を調べてみよう。セッションIDの強度を調べるには、セッションIDを数多く入手する必要がある。セッションIDが発行される場所、タイミングについては先ほど説明したとおりである。Cookieがない状態でTOPページにアクセスすれば発行される。セッションIDを集めるには、セッションIDが発行される個所に繰り返しアクセスすればいい。
数個ならともかく、数十個、数百個集めるには、手動では非常に時間が掛かってしまう。このような単純な作業は自動化してしまおう。Perlを使って書くとリスト1のようになる。PerlにはHTTP関連の処理を扱うモジュールがたくさんあるので、それらを使うとほんの数行で済んでしまうので、自由に使えるようになると非常に便利だ。
use HTTP::Request; use LWP::UserAgent; my $ua = LWP::UserAgent->new; my $request = HTTP::Request->new(GET => 'http://www.example.com/index.cgi');while(1){ my $response = $ua->request($request); print $response->header('Set-Cookie'),"\n"; sleep 1; }
以下はこのスクリプトを使って得られたセッションIDである。
ss=440100200329101469 ss=450100200329101470 ss=460100200329101471 ss=480100200329101472 ss=490100200329101473 ss=500100200329101474 ss=520100200329101475 ss=530100200329101476 ss=540100200329101477 ss=560100200329101478 ss=580100200329101479 ss=590100200329101480 ss=000100200330101481 ss=010100200330101482 ss=020100200330101483 ss=040100200330101484 ss=050100200330101485 ss=060100200330101486
これを見て、すぐに規則性が分かるだろうか。各セッションIDの左2けたの数字を見てほしい。59から00に変わっているのが分かるだろうか。
秒以外にも日時が隠されているので、探してみてほしい。ちなみに、このセッションIDを発行した日時は「2003年10月1日 0時30分」である。
正解は次のとおりだ。
[秒] [日] [時] [年] [分] [月] [通し番号]
セッションIDの生成方法が分かってしまえば、他人のセッションIDを推測し、なりすましを行うことが可能になる(セッションハイジャック)。
今回はWebサイトのセッションまわりを調べる方法について説明した。検査を行うに当たって、今回説明した部分は非常に重要であるのでしっかりと理解していただきたい。
←「第5回」へ
「第7回」へ→
中村隆之(なかむらたかゆき)
三井物産セキュアディレクション勤務。 セキュリティコンサルタントとして主にWebアプリケーションのセキュリティ検査に従事しており、大手ポータルサイト、オンラインバンキングなどの数多くの 検査実績を持つ。また、セキュアネットワーク及び暗号関連の研究に携わり、大手製造、官公庁、金融機関へのセキュリティシステム導入など数多くの実績を持つ。
主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。
Copyright © ITmedia, Inc. All Rights Reserved.