Cookieポイズニング(Cookie Poisoning)
「Cookieポイズニング」とは、Cookieに埋め込まれた内容を操作する手法である。Cookieとは、クライアントから送られるリクエストの中に情報を埋め込み、またその埋め込まれた情報を抜き出すメカニズムのことを指す。Netscape Communication 社によって開発された技術であるが、現在のWebブラウザでは標準機能となっている。一方、Poisoningには「有毒化する」というような意味がある。
簡単にCookieの動作について説明する。サーバがHTTPオブジェクトを応答する際、Set-CookieヘッダをHTTPレスポンスの中に含ませる。この動作は、一般的にCGIスクリプトによって実行される。Set-Cookieヘッダのフォーマットは以下のとおりである。
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
このCookieが渡されると、クライアントはCookieをローカルディスクに保持する。そしてクライアントからの次のリクエストと、Set-Cookieで示された有効期限、パス、ドメイン名などの条件が一致した場合、クライアントは保存済みのCookieを以下のフォーマットにてサーバに送信する。
Cookie: NAME=VALUE
Cookieのメカニズムについては、Netscape Communication社のWebサイトで詳しい情報が公開されている。必要があれば参照してほしい。
Cookieポイズニングが発生するのは、クライアント側のWebブラウザからどのようなCookieが送信されるかというメカニズムがクライアント側に依存しているからだ。Webアプリケーションは、自らが最初にSet-Cookieで送信した内容が、示された属性の情報に従って送り返されてくるものと想定しているが、実際は必ずしもそうではない。
Set-Cookieで送られたCookieは、クライアントのローカルにファイルとして保存される(expires属性が存在しない場合は保存されず、メモリに一時的に格納される)。Windows XPであれば、“C:\Documents and Settings\
このファイルはテキストファイルとして保存されているため編集可能である。クエリストリングのようにユーザーにも見えるように常に露出しているわけではないが、Cookieの内容を書き換えるのは容易なのだ。
expires属性を使用しなければローカルに保存されないと書いたが、expires属性を使用していなくてもCookieの内容を書き換えることは可能である。例えば、誰にでも手に入るフリーのツールとして「Paros」がある。Parosはプロキシサーバとして動作させることによってWebブラウザからのリクエストを途中で拾い上げ、自由に編集してサーバに送信することができる。
Cookieに限らず、Webブラウザから送信されるすべてのデータは、クライアント側で編集可能だと心得なければならない。以下、Cookieポイズニングの例である。
あるショッピングサイトにて、購入手続きを行った際に「buy.asp」というオブジェクトに以下のリクエストを送信したとする。
GET /buy.php?checkout=yes HTTP/1.0 Host: phpauction.fubar.jp Accept: */* Cookie: SESSIONID=3341EDVG7HIL98; amount=3; Item1=3000; Item2=2100; Item3=5980; Shipping=3150
このリクエストの内容から、各商品の金額および送料(商品1が3000円、商品2が2100円、商品3が5980円、送料が3150円)がCookie情報として扱われていると推測できる。この内容を自分のPCにインストールした前述のツールから得た悪意のあるユーザーは、同ツールを用いてCookieを任意の値に編集することができる。
この後、sendボタンをクリックすればあらゆる商品を自分の好きな金額で購入することができる。ここでは商品1から3まですべて100円に書き換えている。
この攻撃からサイトを守るには以下の方法がある。
- 金額など、改ざんによる誤った処理がされる可能性のある内容をCookieとして格納しないようサーバプログラムの仕組みを変える
- サーバなどでCookieを暗号化し、人間が判読できないようにする
Copyright © ITmedia, Inc. All Rights Reserved.