リクエストをいじれば脆弱性の仕組みが見えるのだ!:もいちどイチから! HTTP基礎訓練中(2)(3/3 ページ)
第1回でHTTPを実際に体感したクウ。ブラウザが隠してくれていた作業を手で行うことで、エンジニアの魂に火がつき、好奇心はもう止められないようです。Webの基本、HTTPをひもとく、クウの長い長い探求の道、第2回をお送りします(編集部)
HTTPリクエストを利用する変数を調べる
HTTPリクエストに含まれる値を利用している、Perl、PHP、Java各言語における変数の一部を以下に示す。なお、検証環境はApache HTTP Server/2.0.61、Tomcat/5.5.25を利用した。Perl、PHPにおけるCGI/1.1の環境変数については、RFC3875で定義されているが、実際に取得可能な値については実装に依存する。
Perl | |
---|---|
Acceptヘッダ | $ENV{HTTP_ACCEPT} |
Refererヘッダ | $ENV{HTTP_REFERER} |
Accept-Languageヘッダ | $ENV{HTTP_ACCEPT_LANGUAGE} |
Content-Typeヘッダ | $ENV{CONTENT_TYPE} |
User-Agentヘッダ | $ENV{HTTP_USER_AGENT} |
Hostヘッダ | $ENV{HTTP_HOST}, $ENV{SERVER_NAME} |
Cookieヘッダ | $ENV{HTTP_COOKIE} |
Hostヘッダ内ポート番号【注6】 | $ENV{SERVER_PORT} |
PHP | |
---|---|
Acceptヘッダ | $_SERVER{HTTP_ACCEPT} |
Refererヘッダ | $_SERVER{HTTP_REFERER} |
Accept-Languageヘッダ | $_SERVER{HTTP_ACCEPT_LANGUAGE} |
Content-Typeヘッダ | $_SERVER{CONTENT_TYPE} |
User-Agentヘッダ | $_SERVER{HTTP_USER_AGENT} |
Hostヘッダ | $_SERVER{HTTP_HOST}, $_SERVER{SERVER_NAME} |
Cookieヘッダ | $_SERVER{HTTP_COOKIE} |
Hostヘッダ内ポート番号【注6】 | $_SERVER{SERVER_PORT} |
Java | |
---|---|
Acceptヘッダ | javax.servlet.http. HttpServletRequest#getHeader("Accept") |
Refererヘッダ | javax.servlet.http. HttpServletRequest#getHeader("Referer") |
Accept-Languageヘッダ | javax.servlet.http. HttpServletRequest#getHeader("Accept-Language") |
Content-Typeヘッダ | javax.servlet. ServletRequest#getContentType() |
User-Agentヘッダ | javax.servlet.http. HttpServletRequest#getHeader("User-Agent") |
Hostヘッダ | javax.servlet.ServletRequest#getServerName() |
Cookieヘッダ | javax.servlet.http. HttpServletRequest#getCookies() |
Hostヘッダ内ポート番号【注6】 | javax.servlet. ServletRequest#getServerPort() |
【注6】
Hostヘッダは「Host: サーバ名:ポート番号」と記述ができる
表1 各言語における、HTTPリクエストに含まれる値を利用している変数
これらの値は、HTTPリクエストを書き換えることで格納される値が変化することに注意したい。ただし、HTTPリクエストヘッダについては実際に攻撃が可能か否かについては、受動的攻撃か能動的攻撃かに依存し、また、FlashによるHTTPヘッダ書き換えの制限などにも影響される。入力可能な文字種については、ヘッダごとに異なる。
【関連記事】
星野君のWebアプリほのぼの改造計画番外編(2)
赤坂さん、Flashを攻める!
http://www.atmarkit.co.jp/fsecurity/rensai/hoshinoex02/hoshinoex01.html
上記表内で示される環境変数やメソッドにおいて、サーバ側の設定の値と同じ値が格納されているものなどがあるが、実際には、HTTPリクエストの情報から取得している場合があるため、利用する場合には想定外の値が格納されていないかに注意する必要がある。特にPerlやPHP(CGI/1.1)では、「環境変数」という呼称であるために、サーバ側の設定を読み込んでいるものと勘違いしやすいのではないだろうか。
また、これらの変数などから直接値を取得しない場合でも、利用している関数が内部的にHTTPリクエストから得られる情報を利用している場合、影響を受けてしまうことになる。
Apache-Tomcatの脆弱性としてすでに修正済みではあるが、例えばCVE-2007-1358などは、Strutsが提供するHTMLタグライブラリなどが、HTTPヘッダから取得したAccept-Languageの値をjavax.servlet.ServletRequest#getLocale()メソッド経由で取得し、HTMLエンコードせずに出力していたために、クロスサイトスクリプティングが動作するという現象が起きていた。
しかし、利用する関数のすべてのソースを確認することは現実的ではないので、実際にHTTPリクエストを操作して問題が起きないか、また、HTTPリクエスト内に含まれる文字列がそのまま利用されていないかなどをチェックすることで対応できる。
クウ (リクエストヘッダって結構どこで使われているか分かりづらいな……。いままで変なとこで使っていたりしてしないかな……)
GET/POSTパラメータは?
クウはHTTPヘッダの基本的な挙動について試したので、次にGET/POSTパラメータについていろいろ操作を行うことにしてみた。クウはテスト用のパラメータを送信するダミーページなどを使ってGET/POSTパラメータを操作したことがあるので、どういった操作を行うべきかある程度理解していた。
クウは、以前に自分が作ったWebアプリケーションを、ツールを経由したままで巡回してみた。
クウ 「おー! 画期的!」
ユウヤ 「どした? また何か見つけたの?」
クウ 「これすごいよ。POSTパラメータとか解析して表示してくれるの」
ユウヤ 「ふーん。何がすごいかよく分かんないけど、よかったね」
クウ 「もー。ユウちゃんはつれないなー……」
ユウヤ 「まあ、後で気が向いたらちゃんと見てあげるよ」
HTTPリクエスト書き換えツールでは、HTTPのリクエストを直接編集できるモードと、解析されたパラメータ(Header、GETパラメータ、POSTパラメータ、Cookieなど)ごとに編集するモードを備えているものもある。HTTPとして正しくないリクエストが送信されたときの挙動などを調べる際にはHTTPのリクエストを直接編集した方がよいが、多くのWebアプリケーションに対するテストでは、Webアプリケーションで使われる特有の値であるGET、POST、Cookieパラメータを操作することの方が多い。解析されたパラメータを一覧で閲覧・編集することで、よりテストをスムーズに行うことが可能となる。
クウ (こうやってきれいに整理してあれば、眺めているだけでおかしなパラメータとか見つけられそうだな)
実際に、このような形で送信されているパラメータの一覧を見るだけでも、基本的なミスはいくつか発見できることがある。例えば、ディレクトリトラバーサルの脆弱性のようなパラメータ値の形式だけである程度推測できるものや、クロスサイトリクエストフォージュリ(CSRF)のような送信されるパラメータの構成・性質で脆弱か否かを判断できるものが挙げられる。
こういったツールを利用しない場合でも、Webアプリケーションのテストにおいて実際にブラウザから送信されるパラメータの一覧を調べることをお勧めする。
クウ 「何となくHTTPの基本は分かった気がするから、今度はWebアプリを作るときに使ってみようっと!」
次回予告:
Ajaxなどを利用したWeb2.0アプリケーションのHTTP通信を理解し、Web2.0のセキュリティを考えよう!
(Illustrated by はるぷ)
Profile
株式会社ユービーセキュア 技術本部 テクニカルサービス部 セキュアオーディットコンサルタント
杉山 俊春(すぎやま としはる)
セキュリティコンサルタントとして、主にWebアプリケーションのセキュリティ検査やWebアプリケーション検査ツールの開発などに従事している。大手ショッピングサイトなどの検査実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.