cookie経由のXSSの話 脆弱性"&'<<>\ Advent Calendar 2016 (4日目)
この記事は脆弱性"&'<<>\ Advent Calendar 2016の4日目の記事です。
前日の記事はHack Patch!: CyVDB-1118関連です。
今回の記事は、eval(document.cookie)
になるようなことは避けましょうという内容です。
cookie 経由でのXSSについて。
cookieに値を入れるにはサーバサイドからのレスポンスヘッダーかjavascriptからの操作になります。XSSなどがない限り攻撃者が値を入れることはできなそうですが、以下のような条件により可能です。
特にHTTP通信から攻撃する方法は徳丸先生の記事によるものが詳しく(HTTPSを使ってもCookieの改変は防げないことを実験で試してみた | 徳丸浩の日記)、これを防ぐためにはHSTSをサイト全体に設定する他ない状況となっています。
eval(document.cookie)
と等価になるような実装がされていることはあまり多くないのですが、たまーに見かけるのが現状です。
別サブドメインからのXSS事例
レアケースかと思われますが、数年前に別サブドメインからcookieを経由してXSSが可能だったケースを見つけたことがありました。
某植物系レンタルサーバさんのあるサーバ管理画面にてこんなコードが有りました。(変数名などは念のため変えています。)
var param = $.cookie('cookie_name'); ... ... $('.class_'+param).attr('checked', true);
一見すると問題があるようには見えませんが、XSSが可能です。というのもjQueryの古いバージョンでは$(.class_<img onerror=alert(1) src=.>)
で、DOM Based XSSが発火するためです。(jQuery Migrate Plugin なんてなかった件 - ほむらちゃほむほむ)
ここ数年はjQuery 1.10以上が使われることが多いためjQuery由来の問題は減ってきていますが、画面の作成時期によっては古いjQueryがそのまま使われています。
さて、このままでもMITMによって攻撃可能ですが他の攻撃方法がないかを探してみました。その結果、サーバ管理画面のドメインxxx.jp
の別サブドメイン、blog.xxx.jp
にてDOM Based XSSを見つけました。こちらもjQuery由来の問題でprettyPhoto
というjQuery pluginが脆弱性がある状態で使用されており、細工したURLにアクセスするとXSSが可能な状態でした。
組み合わせると、以下の手順でサーバの管理画面に攻撃することができました。
blog.xxx.jp
にXSSを含むURLをターゲットにアクセスさせる- javascriptから
cookie_name=<img onerror=alert(location.href) src=.>
のようなクッキーを発行する xxx.jp
にリダイレクトさせるxxx.jp
で$(.class_<img onerror=alert(1) src=.>)
が評価されてXSSが発火
eval(document.cookie)
と等価な部分があると別ドメインのXSSにひきずられることがあり、普通のXSSよりも気づにくい状態となります。cookieのセキュリティーポリシーがscheme+domain+portではないことに由来する問題ですね。
幸いサーバ管理画面の方は報告後すぐに修正されていました。
攻撃を受けにくくするために
この攻撃を発見して以降、念のため重要度が高いドメインではそのときだけシークレットウィンドウを開いて操作することを推奨しています。cookieやlocalStorageによる攻撃、CSRF、ブラウザ拡張機能による影響を受けにくくなります。