青モップとOperaの関係
青モップについて調べてみました。
青モップって?
青モップとは、Cookie Monsterのこと。Cross-Domain Cookie Injection*1とも呼ばれます。
セカンドレベルドメインをDomain属性に指定することで、ぱくっとCookieを食べてくれるブラウザの仕様のことです。
2008/01/16 追記:ヤマガタさんが正解です>csrf mlから来た方へ
ちなみに、IEだとtokyo.jp等の地域型ドメインに対してCookieを発行が可能で、FireFoxだと、co.jp等の属性型ドメインに対してCookieが可能なんです。
怖いですよね。万が一、
なんてされたら、.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:http://www.portswigger.net/proxy/
■用意するもの
-
- Opera:http://jp.opera.com/download/
- BurpProxy:http://www.portswigger.net/proxy/
- 自分の管理下にあるWebサーバ
- サクラエディタ:http://sakura_editor.at.infoseek.co.jp/(お気に入りのテキストエディタです)
■設定
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リクエストに対して応答が発生します。OperaのCookieを見てみるとあら不思議。
こんな感じです。
ちなみに
Set-Cookie2という代物があるみたいです。使い方は↓な感じ
Set-Cookie2: cookie2=ahahan;domain=.example.co.jp;Version=1;
そーすると、「Cookieヘッダ」に以下のような感じではいるっぽい。
Cookie: cookie2=ahahan; $Domain=example.co.jp;
これならWebアプリ側でも変なDomain属性かどうかがわかりますにぇ。青モップも怖くない。
Operaでは動作確認できましたが、IE、FireFox、Safariでは見たい王のようです。
・・・というか、こんなことしてないで、FFXIIやらないと。