ASP.NET 1.1を使っているWebサイトに,新たなSQLインジェクション攻撃の可能性が潜んでいることが分かった。セキュリティ・コンサルティング会社であるHASHコンサルティングの徳丸 浩氏が見付けた(HASHコンサルティングが公開した情報)。

 同氏が発見したのは,不正なパーセント・エンコードを利用して,IDS/IPS(侵入検知/防御システム)やWebアプリケーション・ファイアウォール(WAF)による検知を回避する手法である。不正なパーセント・エンコードを利用した検知回避については,ラックが2008年10月に公開した「【CSL】CSL緊急注意喚起レポート~新手のSQLインジェクションを行使するボットの確認~」と題するホワイトペーパーで紹介されている。徳丸氏が発見したのは,その手口の応用版である。

 ASP(Active Server Pages)では,「DEC%LARE」のようにパーセント記号に続く2文字が16進数でない場合,パーセント記号を取り除く,すなわち,ASPスクリプト内部では,入力は「DECLARE」として処理される。

 アプリケーション側でSQLインジェクション対策を施している場合は問題は生じないが,IPSやWAFを用いて防御している場合,「DEC%LARE」をSQLキーワードとして検知できない場合がある。ただし,ASP.NETを利用している場合,パーセント記号は除去されないため,この問題は発生しないことがわかっていた。

 これに対して今回発見されたのは,ASP.NET 1.1を対象とするもの。HTTPリクエストの文字エンコーディングとしてUTF-8を利用している場合,ASP.NETでは,「不正なUTF-8シーケンス」を除去することが分かった。例えば「DEC%C0LARE」のように入力すると,ASP.NET 1.1はUTF-8として不正な「%C0L」のうち「%C0」だけを除去する。つまり,ASP.NETスクリプトが受け取る入力文字列は「DECLARE」となる。

 アプリケーション側でぜい弱性対策を施している場合は問題は発生しない。IDS/IPS/WAFは,不正なUTF-8シーケンスを見分けることが困難なので,SQLキーワードなどを見逃す可能性が高い。%C0はISO-8859-1では「Aにグレイヴ・アクセントを付した文字」,Shift_JISでは半角カタカナの「テ」である。つまり,%C0など挿入された文字は他の文字エンコーディングでは正当な文字であるので,単純に検知・削除するわけにはいかない。

 対策は,Webサイト側でASP.NET 2.0以上にバージョンアップすることと,アプリケーションでぜい弱性対策を施すことである。