青モップとOperaの関係

青モップについて調べてみました。

青モップって?

青モップとは、Cookie Monsterのこと。Cross-Domain Cookie Injection*1とも呼ばれます。
セカンドレベルドメインをDomain属性に指定することで、ぱくっとCookieを食べてくれるブラウザの仕様のことです。

2008/01/16 追記:ヤマガタさんが正解です>csrf mlから来た方へ

ちなみに、IEだとtokyo.jp等の地域型ドメインに対してCookieを発行が可能で、FireFoxだと、co.jp等の属性型ドメインに対してCookieが可能なんです。

怖いですよね。万が一、

Set-Cookie: cookie=ahahan; domain=co.jp;

なんてされたら、.co.jpのサイトにアクセスするたびに、「あははん」って言い続けることになるんです。
お手軽に試したい場合は、.co.jpのサイトにFireFoxでアクセスして、以下ののをばしっと。Cookieの一覧見るとバッチリ.co.jpにCookieが保存されてます。

javascript:document.cookie="cookie=ahahan; domain=.co.jp;"

.co.jpを管理してる人がそうそうそんなことはしないでしょ?とか思ったらダメです。XSS脆弱性のある.co.jpのサイトを見つけてくればさくさくっとCookieを食べてもらえます♪

そんな青モップですが、Operaではすんなり極まりません。結構不思議なことしてるんです。

Operaは不思議さん

Operaの挙動は特殊で、セカンドレベルドメインに対してSet-Cookieしようとすると、HEADメソッドでリクエストを飛ばすんです。詳しく挙動を確認したい人は、Proxyタイプのインターセプトツール(私は勝手に検査補助ツールって呼んでます)っぽいののをダウンロードして眺めてみてください。私はBurpProxyが好きです。

■用意するもの

■設定
BurpProxyをデフォルトで起動すると8080で待ち構えてくれるので、Operaのプロキシ設定を「localhost8080」にしましょう。
localhostでWebサーバを立ち上げているとして、hostsファイルに以下の記述を足しましょう(サクラエディタはここで使います)。

127.0.0.1 www.example.co.jp

Cookieを与える
Operaでwww.example.co.jpにアクセスします。そして、以下のJavascriptでも実行させてみてください

javascript:document.cookie="cookie=ahahan; domain=.co.jp;"

1秒くらいもったりした後に、BurpProxyに反応があります。その時に飛んでるリクエストは↓。

HEAD / HTTP/1.0
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ja) Opera 8.54
Host: co.jp
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ja, en
Accept-Charset: shift_jis, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Proxy-Connection: close

「co.jp」に対してHEADメソッドでリクエストを飛ばしています。「co.jp」なんて居ないのですが、Operaは果敢に数回チャレンジします。
応答が無いのがわかると、Operaはあきらめてしまいます。

#一度あきらめるとOperaを立ち上げなおさない限り再チャレンジしないみたいです。

あきらめた後にCookieをセットするのですが、.co.jpドメインではなく、www.example.co.jpに対してCookieをセットします。無念・・・。

#青モップには有効ですが、これはこれで困る場合があるような無いような?

では、あきらめない場合はどうなるのか?(↑をやった後に↓をやる場合、Opera、Burp、その他にキャッシュが残るとうまく行かないので、立ち上げなおしたりしてください)

hostsにこんな感じで一行追加します。

127.0.0.1 co.jp

そーすると、HEADリクエストに対して応答が発生します。OperaCookieを見てみるとあら不思議。

こんな感じです。

ちなみに

Set-Cookie2という代物があるみたいです。使い方は↓な感じ

Set-Cookie2: cookie2=ahahan;domain=.example.co.jp;Version=1;

そーすると、「Cookieヘッダ」に以下のような感じではいるっぽい。

Cookie: cookie2=ahahan; $Domain=example.co.jp;

これならWebアプリ側でも変なDomain属性かどうかがわかりますにぇ。青モップも怖くない。

Operaでは動作確認できましたが、IEFireFoxSafariでは見たい王のようです。


・・・というか、こんなことしてないで、FFXIIやらないと。

*1:4/6 11:55訂正 Cross-Site Cookie Injectionって書いちゃってました。Crossなんとかって紛らわしいよ・・・。