2013/10/29

Referrer文字列によるXSS

リファラを使ったXSSの小ネタです。

今回取り上げるのは、ターゲット自身が、細工したページを経由することでつけられたリファラによって攻撃を受けるケースです。このような攻撃の場合は、現実に経由可能なページからでしか攻撃文字列を送りこむことができません。

例えば、以下のように、document.referrerをそのままdocument.write()しているページがあるとします。

http://vulnerabledoma.in/location/


リファラを書き出している部分でXSSできるでしょうか。

IEでは単純です。
IEはURLのクエリに、エンコードせずに「"<>」などを含めることができるので、これらを含むURLから、リファラを書き出しているページへ遷移させれば、XSSが起きます。

http://l0.cm/xss_referrer.html?<script>alert(1)</script>


Firefox・Chrome・Safariなどのブラウザの場合は、「"<>」はクエリ中でエンコードされるのでこのPoCではスクリプトは実行されません。

IE×リファラ でXSSが可能なことは、知ってる人は知っているのではないかと思いますが、 今回は、ChromeやSafari(6.1で確認)でも攻撃が可能だということを紹介します。今日言いたいのはここです。たぶん、まだ誰も公開していない手法だと思います。

はい:

data:text/html,<meta name="referrer" content="always"><script>if(location.protocol!='data:'){alert(1)}else{location.href="http://vulnerabledoma.in/location/"}</script>


「<meta name="referrer" content="always">」という、リファラ送信を制御するタグ( http://wiki.whatwg.org/wiki/Meta_referrer )をつけると、通常はリファラを送信しないdata: URLからでもリファラを送信してくれるようです。こうすると、ChromeやSafariで「"<>」をリファラに含められます。
Firefoxでも今後、 <meta name="referrer">をサポートしたら攻撃が可能になるかもしれません。

以上、XSS小ネタでした。

2014/6/30 追記
この手法は2014/6/30時点で最新のChrome(35.0.1916.153)/Safari(7.0.4)で動かなくなっています。
Safariで動作する別の手法について新しい記事を書きました。(基本的にはdata: からblob: にしただけ)

Referrer文字列によるXSS part2
http://masatokinugawa.l0.cm/2014/06/referrer-xss-part2.html

2014/9/22 追記
Safari(7.1)で確認したところ、動かなくなりました。