http://masatokinugawa.l0.cm/2013/10/referrer-xss.html
が、その後のブラウザのアップデートで、紹介したdata: URLからReferrerをつける手法は使えなくなってしまいました。現在は、data: URLに<meta name="referrer" content="always">指定があっても、Referrerを送信しないように変わったようです。
ということで今回は、今も使える別のReferrerによるXSS手法を紹介したいと思います。
Safari( 最新の7.0.4で確認 )のみ動作します。以前はChromeでも動いていたのですが、33あたりから使えなくなりました。
以下からSafariでどうぞ:
http://l0.cm/xss_blob_and_referrer/
以下のようなコードで実現しています。
<meta name="referrer" content="always">Safariでは、<meta name="referrer" content="always">が書かれたページで、history.replaceState() を使ってblob: を先頭につけたURLへ自身のURLを変更したあとにリダイレクトすると、blob: URLをReferrerに含めることができるようです。blob: URLでは、パス以降にエンコードせずに <> などの文字列を保持できるようなので、history.replaceState()する際にパス部分などにスクリプトを書いたものを含めておけば、Referrerを経由したXSSが可能です。
<script>
history.replaceState('','','blob:http://l0.cm/<script>alert(1)<\/script>');
location.href="http://vulnerabledoma.in/location/"
</script>
http:// から blob:http://[同一ドメイン]/ なURLにhistory.replaceState()できるのがちょっと驚きですよね。Chrome/Safariはできるみたいです。また、Chromeは filesystem:http://[同一ドメイン]/path みたいなURLにもhistory.replaceState() できるようです→ TEST
URLを変更できるのは同一ドメインから生成されたように見えるblob:やfilesystem:のみなので、今すぐ危険なかんじはしませんが、想定した動作なんですかね。
以上、XSS小ネタでした。
追記
Safari(7.0.4)でdata: URLからReferrer使ったXSSがまだ動作するというご報告を受け、確認したところまだ動作しますね。勘違いしていました。
まあ、blob: でもできるよということで。
2014/9/22 追記
Safari(7.1)で確認したところ、動かなくなりました。