PR

 注意したいのは,データベースが以下の機能や仕組みを備えていれば,原理的にどんな種類のデータベースに対しても攻撃が可能であることである。
・動的プロシージャ実行
・既知のデータベース管理構造
・何らかの配列処理

 今回のケースも,これまでと同様Microsoft SQL Server特有のものと考えられがちだが,そうではない。今まで報告された攻撃ではSQL Server特有のxp_cmdshellシステム・ストアド・プロシージャが悪用されてきたが,今回は特殊なシステム・ストアド・プロシージャは利用されていない。つまり,「他のデータベースを標的にした攻撃に移植しやすい」ことになる。

最も重要なのはWebアプリケーションでの対策

 SQLインジェクションの対策は表1のような方法が挙げられる。なかでも重要なのがWebアプリケーションへの対策である。外部からの攻撃では,不正なデータがWebアプリケーションの入力として送信されることが多いためである。不正なSQLクエリーではあるが構文として間違っていない場合,一度データベースに送信されるとデータベース上で処理されてしまう可能性が高い。

表1●SQLインジェクションへの主な対策
表1●SQLインジェクションへの主な対策

不審な入力値は無効な文字列に変換

表2●特殊文字の種類と用途
表2●特殊文字の種類と用途

 今回の攻撃では,WebアプリケーションにPOSTされる文字列の中にDECLARE文やEXEC関数が含まれていた。このような本来入力値として渡される可能性がない入力値や文字列を厳格にチェックし,無効化すれば脅威は回避できる。

 入力値のチェックでは,まず,送られた文字が特殊文字でないかどうかを確認する(図4)。特殊文字はデータベース上で特別な意味を持つ。表2に,ほとんどのリレーショナル・データベースが準拠しているSQL-92で定義された特殊文字を示す。これらの文字が入力値として送られた場合には,適切に無効化処理を行う。ほかにも,各種データベースにはそれぞれ固有の特殊文字があるため,これらデータベース固有特殊文字にも対応する必要がある 。

図4●入力値チェックの例
図4●入力値チェックの例