水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > ASP.NET に XSS?

ASP.NET に XSS?

2005年2月17日(木曜日)

ASP.NET に XSS?

更新: 2005年2月20日

セキュリティホールmemo (www.st.ryukoku.ac.jp)から、XSS vulnerabilty in ASP.Net [with details] (www.st.ryukoku.ac.jp)というお話。

タイトルだけ見たら ASP.NET 自体にミドルウェアの欠陥として XSS が存在するかのように思えたので焦りましたが、そうではないみたいですね。

ASP.NET には、危険なリクエストを受けると例外をスローする validateRequest という機能があります。これはデフォルトで有効になっていて、プログラマがサニタイズを怠っていても問題が起きにくいようになっています。たとえば、POST されてきたクエリに <script> という文字列が含まれていると、こんなメッセージが出たりするわけです。

危険な可能性のある Request.Form 値がクライアントから検出されました。

説明 : 要求の検証により、危険性のあるクライアント入力値が検出されました。要求の処理は中止されました。この値は、クロス サイト スクリプト攻撃などのアプリケーションのセキュリティ問題を引き起こす可能性があります。ページ ディレクティブか、 構成セクションの validateRequest=false を設定することによって要求の検証を無効にできます。しかしこの場合、アプリケーションですべての入力を明示的に確認することをお勧めします。

ところが、< のかわりに全角の(U+FF1Cの)「<」を使用すると、この検証を通り抜けます。さらに、responseEncoding を windows-1251 (キリル文字) にしていると、これが正規化されて < に変化し、結果的に貫通してしまうという話のようです。

というわけなのですが、プログラマが外部入力値をサニタイズしていれば問題ありません。ASP.NET の機能に甘えず、きっちりサニタイズしておきましょうということで。

※ちなみに、ここではそもそも validateRequest を無効にしてあります。経緯については 掲示板の #138 あたりを参照。

※2005-02-20 追記: これは validateRequest に限った問題ではなく、responseEncoding が windows- 系の場合は全角のものもサニタイズしないといけないですね。CultureInfo.InvariantCulture の話というのは、こういう局面で生きてくるのでしょう。

関連する話題: セキュリティ / ASP.NET / クロスサイトスクリプティング脆弱性

最近の日記

関わった本など