SQLインジェクションと呼ばれる,Webアプリケーションに対する不正アクセスに注意する必要がある。意識して対策をとっているサイトはまだ少ない。いくつかの条件が重なると,情報漏えいやデータベース改ざんにつながる恐れがある。米国ではアパレル大手のサイトがこの問題で提訴された。

図1●SQLインジェクション
入力されたデータをもとにSQL文を組み立てて実行するアプリケーションでは,データにSQL文やその一部を入力することで,意図しないSQL文を実行される可能性がある。図は,SQL文中のパスワードを判定する部分に,常にTRUEとなる条件文を入力することで,パスワードを知らなくてもログインできてしまう例。SQL文の区切りを示す「;」を使うことで,全く別のSQL文を入力するという攻撃方法もある。
SQLインジェクションに限らず,システムのアクセス制限を不正に回避する操作は,不正アクセス禁止法による処罰の対象になる可能性がある。自分の管理下にないマシンに対し,管理者の許可を得ずに侵入を試みてはならない
図2●SQLインジェクションが成立する条件と対策
 SQLインジェクションとは,Webアプリケーションの入力データとしてSQL文を流し込み,実行させる不正アクセス方法。意図しないSQL文を実行され,他のユーザーの個人情報を取得されたり,データを書き換えられたりしてしまう可能性がある(図1[拡大表示])。

 SQLインジェクション自体は,以前から知られていた問題である。しかし,あらためてその危険を指摘するセキュリティ専門家が増えている。

 システム構築やセキュリティ関連サービスなどを手がけるエムディエス 代表の田辺一雄氏は「SQLインジェクションを意識した対策を施していないサイトが多い」と指摘する。エムディエスが,所在地である福井県の公的サイトを調査したところ,34サイトのうち16サイトが,SQLインジェクションに使われる「'」などの特殊文字を無効化していなかった。

 特殊文字が無効化されていないと,必ずSQLインジェクションが可能になるわけではないが,福井県 総務部 情報政策課では,指摘に対し「虚偽の情報を書き込まれる可能性がまったくないとは言い切れず,早急に検討していくべき課題と考えている」と話している。

 特殊文字を無効化していなかったことが確認された,県所轄のあるサイトでは,2003年5月にホームページが改ざんされた。この際に改ざんされたのは静的HTMLファイルではなく,データベース内に格納された情報から動的に生成されるページだった。つまり,本来告知情報の見出しが表示されるべき部分に「SCRIPTX LOOK YOUR SECRET!」という,クラッカーのメッセージが表示されていた。

 改ざんがSQLインジェクションによるものかどうかは不明だ。福井県 総務部 情報政策課は,「Webサーバーのログをとりアクセスや処理状況などを把握しているが,現時点では改ざんの原因はわからない」としている。

カード番号が閲覧可能に

 米国では,実際にSQLインジェクションによる情報漏えい問題が発生している。

 2003年6月,アパレル大手の米Guessと,米FTC(Fair Trade Commision,日本の公正取引委員会にあたる)の間で和解が成立した(FTCのプレス・リリース)。米GuessがWebサイト上で「消費者の個人情報は安全に保護されています」と記述していたにもかかわらず,2002年2月,SQLインジェクションにより顧客のクレジット・カード番号が閲覧可能なっていたことに関し,FTCがGuessを提訴していた。和解の条件として,Guessはセキュリティに関する不当表示を行なわないだけでなく,毎年セキュリティ監査を受けることになった。

テーブル構造が不明でも攻撃

 SQLインジェクションを行うためには,特殊文字が無効化されていないだけでなく,いくつかの条件が整う必要がある(図2[拡大表示])。

 まず,文法的に正しいSQL文が組み立てられるように入力データを作成しなければならない。それには,アプリケーション中のSQL文やデータベース構造などを知っている,あるいは推定する必要があり,エラー・メッセージ中にテーブル構造を表示するといったヒントを与えなければ,実際に被害が発生するようなSQL文を作成するハードルは高いと見られていた。

 しかし,インターナショナル・ネットワーク・セキュリティ 技術本部 コンサルタントの佐名木智貴氏は「テーブル構造がわからなくともSQL文を注入することは可能」と指摘する(詳細は米WebCohortのドキュメント「Blindfolded SQL Injection」,http://www.webcohort.com/Blindfolded_SQL_Injection.pdf)を参照。

 また,前出のエムディエス田辺氏は「管理者権限でデータベースに接続しているWebアプリケーションも見かけるが,管理者権限があればシステム・テーブルにもアクセスできる。同じRDBMS製品であればシステム・テーブルの構造は同じ。データベース内の情報がすべてアクセスできてしまう」と指摘する。

 以上のように,データベースの中身が分からないからといって,安心はできない。SQLインジェクションが可能になるための残りの2条件が成立しないよう「入力データ中の,『'』,『;』,『-』といった,SQL文を改変するための特殊文字を無効化する」「Webアプリがデータベースに接続する際のアクセス権限は必要最小限にする」といった対策を施しておくことが望ましい。

 SQLインジェクションを防止するための具体的なプログラミング方法については,情報処理振興協会セキュリティ・センター(http://www.ipa.go.jp/security/)が公開している資料「セキュアプログラミング講座」などが参考になる。特殊文字の無効化は,アプリケーション中に記述するほかに,IISのURLscanなどのフィルタリング・ツールを使用する方法もある。
 SQLインジェクションに限らず,アクセス制限を不正に回避する操作は,不正アクセス禁止法による処罰の対象になる可能性がある。管理者の許可を得ずに侵入を試みてはならない。

(高橋 信頼=nob@nikkeibp.co.jp)