特に技術的に新しいものではないので公開せずに放置していたが、XSS Auditorをバイパスする方法はいろいろあるので気をつけましょうという話。 XSS Auditorをバイパスする方法は、Chrome XSS Auditor - SVG Bypass - Hack 2 Learnを参考にした(最新版ではすでにこの手法は塞がれた)。
実演と解説
見た方がわかりやすいと思うので、動画にしたので見てほしい。
これはある大学のログイン画面に存在するXSSで、
login.php?fromURL=xxx">Please complete the captcha before proceeding.<br><svg width=242px height=65px><a><image href=https://i.imgur.com/6W1W2jE.png/><animate attributeName=href values=javascript:alert('hi-this-is-fake')>
こんな感じのURLを入れるとfromURLに入れた値がそのままHTMLに表示されてしまっているせいで
<input id=“resumePath” name="resumePath” type=“hidden” value=“xxx">Please complete the captcha before proceeding.<br><svg width=242px height=65px><a><image href=https://i.imgur.com/6W1W2jE.png/><animate attributeName=href values=javascript:alert('hi-this-is-fake')>
このように出力されてしまう。単純なXSSであるが、セッション管理に問題があるため、fromURLがサーバーに保存されてしまっていて、一度不正なパラメータを付加したURLにアクセスするとcookieが存在している限り次回からはlogin.phpに直接アクセスしてもXSSが発生している点でSemi Permanent XSSである。
ブラウザによって実装に差はあるが、Google Chromeに限った話をするとXSSを発生させても、
?fromURL=xxx"><script>alert(1)</script>
のようなURLはXSS Auditorによってブロックされてしまい、URLをアクセスしても警告が出てしまうのでコードを実行させることは難しくなっている。 しかし、上記のようにSVGによってリンクを表示した上でクリック時にhrefをjavascriptプロトコルに変更するような特殊なアニメーションを仕込むと、XSS Auditorに検知されずにクリックによってサイトのドメイン上でJavaScriptを実行させるXSSを作り出すことができるのである。
クリックしないと発生しないXSSというのは、アクセスしただけで発生するXSSと比べると危険度が低いように思えるかもしれないが 例えば動画でデモしたように、フェイクのreCAPTCHAの認証画面のようなものを表示させると、かなり自然な形でクリックを誘導することができると思う。
まとめ
HTTPヘッダで
X-Frame-Options: DENY X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff
を設定しているサイトが増えているのはいいことだが、ブラウザのセキュリティ機能というのはあくまで二次的なものである。 XSS Auditorが高機能化しているせいで、セキュリティにある程度関心を持っていないとXSSを実行させるのはあまり手軽ではなくなっているが、XSSの脅威がなくなった訳ではない。 やる気のあるハッカーはXSS Auditorを突破してくるので、サーバーアプリケーション側にXSS脆弱性が発生しないよう気をつけることが第一である。