第5章 暴露対策
コンテンツ間パラメータ対策

コンテンツ間パラメータ

Webサイトには通常、複数のWebページがある。ひとつのWebページの中には別のページのURLが埋め込まれていて、これが次々と連鎖してゆく。Webアプリケーションの場合、連鎖するURLのそれぞれには、いくつかのパラメータが伴う。呼び出されたWebプログラムはこれらのパラメータを読み込んで柔軟な情報処理を行う。

あるWebページから別のWebページに移り変わる際HTTPリクエストに添えられるパラメータを、ここでは「コンテンツ間パラメータ」と呼ぶことにする。

コンテンツ間パラメータには次の3種類がある。

  1. URLパラメータ(クエリストリングパラメータ)
    Webプログラム呼び出しのURLの中に含まれるパラメータ。
  2. POSTパラメータ
    Webプログラム呼び出しのHTTPリクエストのボディ部に含まれるパラメータ。フォームへの入力と送信のオペレーションによって作り出される。
  3. Cookie
    Webサーバ側がブラウザに預けておくことのできる小さなデータ。
    Cookieは、Webサーバ側が必要と認めたとき、Webページを返すHTTPレスポンスヘッダの中に含められブラウザに送られる。Cookieを受け取ると、ブラウザは一定期間それを預かり、その間ブラウザが当該Webサーバにアクセスするときには毎回このCookieの値がHTTPリクエストヘッダに含められる。すなわち、Cookieは自動でWebプログラムに向けて送りつけられるパラメータとしてふるまう。毎回自動でブラウザから送られてくる性質を利用して、CookieはWebクライアントの一意な識別やユーザのプロフィールの記憶等に利用される。

コンテンツ間パラメータに生まれる脆弱性

コンテンツ間パラメータは、第三者への漏えい・改ざん、ユーザ本人によって改ざんされうる無防備な存在である。

無防備なコンテンツ間パラメータ
図17:無防備なコンテンツ間パラメータ

第三者への漏えい

(1) 平文通信による漏えい

  1. 平文通信(http:)を用いているためにURLパラメータ、POSTパラメータ、Cookieが第三者に傍受される

(2) 暗号通信(https:)を使用していたとしても起こり得る漏えい

  1. URLパラメータがキャッシュやログに残留し、そこから漏えいする
    次のような箇所
    • ブラウザのキャッシュ
    • プロキシサーバのキャッシュ
    • ファイアウォールのログ
    • Webサーバのアクセスログ
  2. URLパラメータがReferer:ヘッダを通じて別Webサーバに傍受される
    • ハイパーリンクに埋め込んだパラメータが第三者に傍受される
    • フォームデータがURLパラメータで送信され、傍受されるケースもある
    • <form> タグにmethod="post"属性を明示しなかった場合
  3. Cookieが別サーバに傍受される
    • Cookie発行の際のdomain属性の値が広いドメイン範囲を指しているとき起こる
  4. Cookieが別アプリケーションに傍受される
    • Webサーバに複数のアプリケーションが同居しており、Cookie発行の際のpath属性の値が / 等の広すぎる範囲であるとき起こる
  5. 平文通信が混在していてCookieが第三者に傍受される
    • Webアプリケーションの中に暗号通信を使っていない部分(http:)が混在していてかつ、Cookie発行の際secure属性があたえられていないとき起こる

ユーザ本人による改ざん

  1. URLパラメータ、POSTパラメータ、Cookieのいずれかに含まれる個人識別に関わるパラメータを改ざんして別人になりすまし、Webアプリケーションを不正にオペレーションする
  2. 同じくユーザの権限に関わるパラメータを改ざんして本来許可されないコンテンツにアクセスする
  3. 同じくリソースの識別に関わるパラメータを改ざんして本来許可されないコンテンツにアクセスする

対策

コンテンツ間パラメータに関わる問題を回避するには次のようにWebアプリケーションを実装する。