SQLインジェクションによる個人情報漏洩

(1/1)
SQLインジェクション
SQLインジェクション(SQL injection)によるWebサイトからの個人情報の漏洩事故が増えています。
その背景には、SQLインジェクションという言葉は知っていても、具体的な対策を知らないサイト運営者やWeb技術者がいるためと考えられています。
御社のサイトは大丈夫ですか?

【事例】SQLインジェクションによる個人情報漏洩事件

2005年(平成17年)5月から6月にかけ、SQLインジェクションによる個人情報漏洩事件が発生し、社会問題となりました。
その後、対策がとられ、2009年(平成21年)4月の段階では21件と減少していましたが、その後増加に転じ、7月には534件とわずか4カ月で25倍まで膨れあがりました。
価格.com 価格比較サイト
2005年(平成17年)5月、ホームページが改竄され、一時閉鎖に追い込まれた。製品情報などを管理するデータベースが、SQLインジェクションによって乗っ取られたことが原因。また、22,511件のメールアドレスが盗まれていた。

アデコ 大手人材派遣会社
2005年(平成17年)1月18日~6月2日にサイトから仕事の申し込みなどをした約6万1000人の個人情報が流出した恐れがあると発表した。

@SOLAショップ オンラインショップ
2007年(平成19年)7月、2年にわたり外部より不正アクセスを受け、個人情報約1万3000件が流出していたことを発表。SQLインジェクション対策は実施されていたものの、脆弱性が存在したという。@SOLAショップは閉鎖され、再開の目処は立っていない。

サウンドハウス オンラインショップ
2007年(平成19年)3月11日から22日まで、中国からSQLインジェクションによる攻撃を受け、顧客の個人情報が9万7500件流出した可能性がある。流出したデータは、氏名や性別、生年月日、メールアドレス、パスワードだが、そのうち2万7743件については、カード名義やカード番号、有効期限など含まれていた。

ナチュラム・イーコマース オンラインショップ
2008年(平成20年)8月6日、SQLインジェクションによる攻撃を受け、65万3423件の個人情報(ID、パスワード、氏名、メール・アドレス、住所、電話番号など)が流出した可能性があると発表した。漏洩した顧客マスター・データベースには8万6169件のクレジットカード情報が登録されていたが、下4桁は登録されないようになっていたという。

ゴルフダイジェスト・オンライン
2008年(平成20年)9月、SQLインジェクション攻撃を受け、10日間にわたってサイトを閉鎖した。個人情報漏洩はなかったとされるが、メールマガジンに不正なURLが埋め込まれ、URLをクリックしたユーザーはマルウエアに感染する危険性があった。

SQLインジェクションとは何か

データベースはSQL文と呼ばれる命令を受け、登録/検索/閲覧を行い、その結果を呼び出したシステムに返します。
SQLインジェクションとは、特殊なSQL文を与え、データベースを不正に操作する攻撃、またはその攻撃を可能にする入力値の未チェックの脆弱性を指します。ダイレクトSQLコマンド・インジェクションと呼ばれることもあります。

たとえば、会員IDとパスワードによるログイン処理では、データベースがSQL文によって入力されたIDとパスワードを検索し、両方が一致するレコードが存在するかどうかを調べます。
ここで、会員IDを変数 $id、パスワードを変数 $pwdに入力し、以下のSQL文によって、テーブル USER_LIST を検索する場合を考えます。
$login = select * from USER_LIST where user='$id' and password='$pwd'
ここで、$idがpahoo、$pwdがpassならば、このSQL文は、以下のようになります。
$login = select * from USER_LIST where user='pahoo' AND password='pass'
ところが、$idを空にし、$pwdに ';delete from USER_LIST where '0'='0 と入力された場合、SQL文は以下のようになり、データベースの全レコードが選択、削除されてしまいます。(delete は削除する命令)
$login = select * from USER_LIST where user='' and password='';delete from USER_LIST where '0'='0'
また、そのサイトが利用しているデータベースの種類が明らかになれば、そのデータベースに固有のコマンドを使って、IDとパスワードをすべてダウンロードすることもできてしまいます。

SQLインジェクションへの対策は

多くの商用サイトは、データベースを利用したサービスを提供しています。とくにオンラインショップでは、会員や商品の情報を管理するために、データベースが必要不可欠です。
このため、事例で示したように、オンラインショップを狙うSQLインジェクションが増えています。オンラインショップが保有する個人情報の中にはクレジットカード番号が含まれている場合もあるので、犯罪者にとっては格好のターゲットなのです。

SQLインジェクションは、2004年(平成16年)秋ごろから急増しています。
これは、2004年(平成16年)10月ごろに、中国でSQLインジェクションを用いた攻撃用ツールが出回ったためです。SQLインジェクション攻撃が可能な、脆弱性を抱えたサイトを調べるツールや、そういったサイトを簡単に攻撃できるツールなどが公開されたのです。
ツールの使い方さえ分かれば、誰でもSQLインジェクションが実行できるようになってしまったのです。
裏を返せば、こうしたツールの攻撃パターンを防ぐ対策をとればよいことになります。

まずは、入力されたSQL文を実行する前に、その内容をチェックすることが基本です。
具体的には、SQL文として解釈される可能性がある特殊文字(シングルクォート、バックスラッシュ、等々)を他の文字に置換(エスケープ)することが必要最低限の対策となります。

さらに、入力値の性質に応じてチェックをかけましょう。
たとえば英数字のみからなるパスワード入力なら、正規表現 /[0-9|a-z|A-Z]+/ とマッチするかどうかチェックするのです。これ以外は不正な文字として再入力を促します。

また、Webサイトで他のスクリプト(Perl, PHP, VBScriptなど)を利用している場合、そのスクリプトとして実行される可能性がある文字列もエスケープさせておきましょう。クロスサイトスクリプティングの防止になります。

なぜSQLインジェクションを防げなかったのか

SQLインジェクションだけでなくWebアプリケーション全体に言えることなのですが、最近のWebアプリケーションは、C++やJavaではなくスクリプトで簡単に記述できるようになったため、経験の少ないプログラマが要件定義や設計も行わず「とりあえず動くプログラム」を書いてしまうケースが増えています。大手開発ベンダに発注したからといって安心はできません。
これは発注側にも問題があります。他社に先んじようと、安く早くサイトを立ち上げようとするあまり、セキュリティ対策が疎かになることが多いのです。

IPAの「ソフトウェア等の脆弱性関連情報に関する届出状況」(2009年4月~6月)によれば、SQLインジェクションは脆弱性報告の12.5%を占め、3番目に多いことが明らかになりました。ちなみに、一番多いのはクロスサイト・スクリプティングの44%、二番目はDNS情報の設定不備で28%でした。
また、脆弱性の原因として最も多いものはWebアプリケーションで、全体の67%と突出しています。また、任意のスクリプトが実行できるものは全体の49%もありました。

全体的な対策

SQLインジェクションをはじめとするセキュリティホールを防ぐには、セキュリティ設計とセキュリティ・テストに費用を惜しまないことです。できれば、プログラム製造会社に任せるのではなく、別のセキュリティ専門会社にセキュリティ・テストを依頼しましょう。
もしそれだけの予算がないなら、もう一度、2004年(平成16年)秋以降のアクセスログを検査してください。WebサーバやDBサーバのログを調べることで、SQLインジェクションの兆候がつかめることがあります。
SQLインジェクションがあると、SQL関連のアクセス量が一気に跳ね上がります。データベース名やテーブル名を直接指定したアクセスも急増しているはずです。有効な対策を取ることができないなら、データベースを利用したWebサイトは作らないことです。

会員登録が目的なら、Webフォームからメールで御社の担当者へ送信するようにすれば済む話です。
この際、フォームからはメール・アドレスだけ入力してもらい、後日、担当者からメールで連絡を取るようにすれば、相手の存在確認もできてスマートです。

前述の価格.com不正アクセス事件では、SQLインジェクションによって個人情報を抜き取られたため、警視庁は「利用者を特定の人に限り、部外者の侵入を防ぐ『アクセス制御機能』が不十分だった疑いが強いことが判明。不正アクセス禁止法の要件を満たさない可能性が高いと判断した」としています。このように、セキュリティが甘いと判断されると犯人の告訴は難しく、すべて会社の責任になります。くれぐれも注意してください。

参考サイト

(この項おわり)
header