ラックは10月2日,新手のSQLインジェクション攻撃を仕掛けるボットを確認したとして,Webサイトの管理者などに向けて注意喚起した(ラックの緊急注意喚起レポート)。同社では9月30日にボットを検知した。攻撃対象として確認されているのは,Microsoft Internet Information Server/Services(IIS)上のASP(Active Server Pages)/ASP.NETを使ったWebアプリケーション。今までとは異なる手口を使うため,IDS/IPS(侵入検知/防御システム)やWebアプリケーション・ファイアウォール(WAF)といった防御システムをすり抜けてしまう。既に,ページを改ざんされ,悪質サイトへのリンクを埋め込まれたWebサイトも確認済みだという。

■変更履歴
当初,攻撃対象となるシステムの説明としてASP.NETが抜けていましたので追加しました。 [2008/10/6 19:20]

 SQLインジェクションは,Webアプリケーションに不正な入力値を送ってSQLクエリーを実行させ,Webページに不正なコードや悪質サイトへのリンクを埋め込む攻撃。改ざんされたWebページにアクセスしたユーザーは,攻撃者の支配下にある悪質サイトに誘導される。

 今回確認された手口では,攻撃者はクッキー(Cookie)に不正なデータを埋め込んでWebサイトに送信する。従来のSQLインジェクションでは,HTTPのGETメソッドやPOSTメソッドを使って不正なデータを送信する。このため,URI部分に攻撃の内容が含まれ,IDS/IPSでも防御できる。これに対して新手の攻撃で利用するクッキーの内容はURIからでは分からないため,防御をすり抜けられることがある。ラックで検査したところ,4製品中,3製品でこの攻撃をパスしてしまったという。クッキーの内容はWebサーバーのアクセス・ログに残さないサイトが多く,状況も把握しづらい。

■変更履歴
「ラックで検査したところ,4製品中,3製品でこの攻撃をパスしてしまったという」は,当初,別の段落に記載していました。これはクッキーを使ってIDS/IPSをすり抜ける手口に関する説明です。意味が分かりやすくなるように,文章を移動しました。 [2008/10/8 19:15]

 この攻撃では,IIS/ASPの仕様を悪用して,IDS/IPS/WAFをすり抜ける方法を使う。IISでは%を16進数を表現できない文字の前に置いた場合,%を省略してWebアプリケーションに渡すという。例えば「%20」は16進数として認識されるので「スペース」となるが,「e%xec」は「%xe」が16進数とは認識されず,%を除いた「exec」として渡される(ASP.NETの場合は%を省略しないため,該当しない)。IDSやIPS,WAFでは文字列のパターン・マッチングで不正なSQL文を排除する場合が多いが,「%」を任意の個所に入れられることで,パターン・マッチングが難しくなる。

  Webサイトでの対策は,IISのWebアプリケーションでのパラメータ取得方法を変更すること。具体的には,Requestオブジェクトからパラメータを取得するように実装している場合,GETなら「QueryString」,POSTなら「Form」を明示的に指定し,クッキーに含まれるパラメータを取得しないようにする。暫定的な対策として,攻撃元IPアドレス「61.152.246.157」,「211.144.133.161」(いずれも中国)からの通信を拒否する方法や,データベース側に攻撃コードを排除するトリガーを入れる方法もある。まずは,Webサイトのアクセス・ログに攻撃元のIPアドレスが含まれていないか,データベースに悪質サイトへのリンクが埋め込まれていないかをチェックする方が良い。

■変更履歴
攻撃の方法や対策の解説が十分ではなかったため,追記しました。 [2008/10/2 23:15]
元の記事には「Webサイトでの対策は,IISのWebアプリケーションでのクッキーの取得方法を変更すること」とありましたが,誤りでしたので修正しました。 [2008/10/7 13:30]

 クライアント側での対策は,プロキシ・サーバーやファイアウォールの設定を,誘導先の悪質サイト(211.154.163.43)へのWebアクセスを遮断するように変更することである。