2012/02/17

ブラウザのXSS保護機能をバイパスする

ChromeやSafariにはXSS Auditor、IE 8以上にはXSSフィルターという、XSSを検知してブロックする機能がそれぞれあります。
今回は、これを回避してみた記録です。

・Chromeでバイパス

はい!ついおととい報告したやつです!

XSS Auditor bypass with U+2028/2029
https://bugs.webkit.org/show_bug.cgi?id=78732


なぜかSafariではブロックされる(中の人も理由がわからないと言っていた)んだけど、Chromeでは動きます。以下で試してみてください。

 http://vulnerabledoma.in/char_test?charset=utf-8&xss=1&body=%3Cscript%3E//%E2%80%A8alert(1)%3C/script%3E

 http://vulnerabledoma.in/char_test?charset=utf-8&xss=1&body=%3Cscript%3E//%E2%80%A9alert(1)%3C/script%3E


JavaScriptのコメントがあるだけのスクリプトタグが挿入されても無害なので、「<script>//this is comment</script>」とかがURL中に含まれ、かつHTML内に挿入されてもXSS Auditorはこれに変更を加えずにスルーするようです。(別に特別スルーしなくてもいい気がするんだけど、無駄な検知をしたくないからかな

そんな中、U+2028/2029がJavaScript中で改行扱いになるのを考慮し忘れて、コメントアウトが続いてるものとみなしてこれまでスルーしてしまったかんじですね。非常にシンプル。

・IEでバイパス

IE8/9のXSSフィルターは、誤検知を減らすためにか、同じオリジンから同じオリジンへのページの移動は、通常ならばブロックするような、XSSと疑わしいリクエストであっても通過させるようです。Michael Brooks氏の以下の資料が参考になります。

 [PDF] Bypassing Internet Explorer's XSS Filter
 http://www.exploit-db.com/download_pdf/17875/


この資料によれば、同一オリジンにオープンリダイレクタか、自由にリンクを記述できるような機能があるなどすればXSSフィルターをバイパスできるとあります。

が、それってわざわざ探さなくても、資料の例のような典型的なrefrected XSSがあるのなら、自分自身をリンクにすればいいのではないか、というのが今これから書きたいことです。つまりこういうことです:

まず、XSSフィルターが有効な状態でこのページから以下のスクリプトが挿入されたリンクへアクセスすると、http://masatokinugawa.l0.cm/ から  http://vulnerabledoma.in/ へのアクセスになるので、XSSフィルターはきちんとブロックしてくれます。

http://vulnerabledoma.in/char_test?charset=utf-8&xss=1&body=%3Cscript%3Ealert%281%29%3C/script%3E

じゃあ、このXSSに脆弱な箇所自身に上のスクリプトを挿入したリンクを作ってみます。

http://vulnerabledoma.in/char_test?charset=utf-8&xss=1&body=%3Ca%20style=font-size:10in%3bposition:absolute%3btop:0%3bleft:0%20href=%22http://vulnerabledoma.in/char_test%3Fcharset%3Dutf-8%26xss%3D1%26body%3D%253Cscript%253Ealert%25281%2529%253C%252Fscript%253E%22%3EXSS%3C/a%3E

URL内に、aタグがあっても、文字を大きくするなどのスタイルを設定しても、またスクリプトタグを2重にパーセントエンコードしたものを挿入しても、IEのXSSフィルターは許容するようです。リンク先のリンクをクリックすると、 スクリプトが動作するはずです。 なぜならこれは http://vulnerabledoma.in/ から http://vulnerabledoma.in/ へのアクセスとなるからです。これでonclickイベントに任意のスクリプトを仕込めるのと同等のXSS攻撃が成立することになります。やったぜ!


はい、こんな具合にXSS保護機能はユーザーを確実にXSSから保護してくれる訳ではありません。
これからも改良はされていくと思いますが、ブラウザの保護を過信せずにきちんとXSS対策しましょう!おわり!


追記

さっきもう1個思いついた!

XSSAuditor bypass with <svg> tags and html-entities.
https://bugs.webkit.org/show_bug.cgi?id=78836


追記2
IEのバイパス方法は既に書いておられる方がいたようです。 Thanks @80vul !

IE XSS Filter Bypass_ccSec  |  cc@insight-labs.org_百度空间
http://hi.baidu.com/_ccsec/blog/item/d878e609a8360bfa37d12223.html

0 件のコメント:

コメントを投稿