Blog2014/10/02ブラウザのXSS保護機能をバイパスする(5)先月に続いてIEのXSSフィルターをバイパスする記事です。応用を思いついたので紹介したいと思います。紹介した手法は、シンプルな反射型XSSが存在するとき、以下のような条件でIEのXSSフィルターをバイパスできることを示すものでした。charset指定がある場合でもバイパスできることがわかりました。以下にその方法を示します。次のようなページがあるとします。charset=>でcharset指定があり、シンプルなXSSがあるページです。この条件でXSSフィルターをバイパスしてみます。:http://vulnerabledoma.in/xssable2?q=http-equiv=%20%3Cmeta%20charset=utf-7%3E%3Cimg%20src=x%20o%2BA-nerror=alert%281%29%3E&%3Cmeta%20charset%3D%22utf-8%22%3E%0A%3Ctitle%3EXSS%20TEST%3C%2Ftitle%3E%0A%3C%2Fhead%3E%0A%3Cbody%3E%0A%3Ch1%3EXSS%20TEST%3C%2Fh1%3E%0Ahttp-equiv%3DIEでアクセスすると、アラートが動作するのが確認できると思います。IEのXSSフィルターがどんな文字列に反応して<meta>タグを破壊しているのかに着目すると、この手法が見えてきます。セットになってあるときです。いう文字列が含まれていなかったからです。charset=>のmetaだって破壊してくれるのでは、と考えて試したところうまくいったのが今回の手法です。ひとつなぎであるかのようにみせかけて、XSSフィルターを反応させます。o+A-nerror=alert(1)></body></html>これで既存のcharset指定のmetaタグはme#aのように破壊され、charset指定がない状態になります。あとは、以前の手法と同じことをすればいいです。参考にしながらIEが無視してくれるバイト値をもったエンコーディングを使って、XSSフィルターが反応する文字列の間に無視されるバイト値を挟んでしまえば完了です。