本記事では、インターネット上の脅威のうち、最も悪名高い攻撃のひとつ「SQLインジェクション」について解説します。
SQLインジェクションとは?
「SQLインジェクション」は、Webサイトの攻撃手段のひとつで、日本では2005年ごろから被害が確認されるようになりました。
インターネット上のセキュリティに関する情報を発信しているJPCERT/CCが、「SQLインジェクションによるWebサイト改ざんに関する注意喚起」を発信したにも関わらず、多数のWebサイトへの被害が拡大し続けました。
どのような攻撃なのか?
「SQLインジェクション」は、Webアプリケーションに存在するぜい弱性を悪用して、外部からデータベースの内容を不正に操作する攻撃を指します。被害を受けた企業のWebサイトにマルウェアを埋め込んで、サイトを閲覧したユーザーのPCに感染させたり、ユーザーのクレジットカード番号などの個人情報を不正に表示させて情報を盗み出してしまうなどの攻撃が可能となります。
ショッピングサイトなどの多くは、データベースを操作するためのコンピュータ言語であるSQL(Structured Query Language)を利用して、登録者の個人情報を管理しています。
ユーザーがWebアプリケーションを利用するとき、ユーザー自身が入力した情報を元にして、WebサーバーがSQL文を組み立てます。そして、SQL文がデータベースにデータを追加したり、検索やテーブルの更新などを行います。
このとき、Webアプリケーションのセキュリティ対策が不十分な場合、「悪意のあるSQL文」をそのままブラウザへ入力することが可能となり、入力された不正なSQL文は、そのままデータベース操作に注入(Injection)されてしまうのです。
情報漏えい
セキュリティ対策が不十分なWebアプリケーションのデータベースに「悪意のあるSQL文」が注入されてしまうと、管理サーバではどのような操作が行われるのでしょうか?
WEBアプリケーション側は、「悪意のあるSQL文」が入力されたとしても、不正アクセスの意図があるとは分かりません。このため、外部から送信された不正なSQL文を正規のSQL文と誤解してしまうのです。WEBアプリケーションの多くは、ユーザーが入力した情報をSQLに変換することで動作しています。攻撃者は仕組みを悪用して、「カード情報を開示しろ」とSQL形式で命令を送ります。
その結果、上述の管理サーバが正規の命令だと認識する「誤解」が生じてしまい、情報が流出してしまうのです。
Webサイトの改ざん
不正な命令を含むSQL文がWebアプリケーションで実行可能ということは、同様に、Webサイト/アプリケーション自体の改ざんも容易にできることになります。
攻撃者はぜい弱性を抱えるWebアプリケーションを標的として改ざんも行いました。「WebAttacker」などの攻撃ツールを使い、データベースで管理されているWebコンテンツへ不正なスクリプトを注入したのです。
この結果、正規のサイトが改ざんされることとなりましたが、Webサイトの改ざん自体が目的である事例は多くありません。改ざんされたこれらのWebサイトは、他の攻撃のための踏み台としてリダイレクタの役割を担わされた事例が多数確認されました。
SQLインジェクションの対策方法
Webアプリケーション/サイトの管理者は、このSQLインジェクションに対して、どのような対策を講じれば良いのでしょうか?
半角英数字のみ入力可能にする
対策の1つが、フォームへの入力可能文字を半角英数字のみに限定することです。SQLインジェクションでは、以下のようにパラメータにSQLの演算子を挿入して、 不正な操作を実行します。
ログイン画面で以下のようなユーザID、パスワードを入力したとします。
- ユーザID 「‘ OR (”=’」
- パスワード 「‘) OR ”=’」
これらの文字列はユーザID、パスワードとしては成り立っていませんが、Webアプリケーション側は正規の文字列として認識し、ログインできてしまいます。
ユーザーがフォームに入力後に変換されるSQL文は次のとおりとなります。
SELECT ID,NAME FROM TODO_USER WHERE ID='' OR (''='' AND PASSWORD='') OR ''=''
WHERE節以降の条件が常に成立してしまうために、このSELECT文が常にユーザ情報を返してしまうのです。
この問題を回避するためには、 SQL文に設定するパラメータが不正なものでないかをチェックします。ユーザID、パスワードとも半角英数字のみを許容すると、このような不正なユーザIDやパスワードの入力が防げます。
特殊文字をエスケープする
2つ目の対策は、サニタイジング(エスケープ)処理です。「データベースの操作において特別な意味を持つ文字が解釈されないように保護する」処理を指しますが、例を挙げて見てみましょう。Webフォームなどに、次の文字列が埋め込まれた場合、HTMLではスクリプトと判断してスクリプトが実行されます。
<script>alert(“こんにちは”);</script>
このスクリプトが実行されるとWebサイト上には本来なかった「こんにちは」というアラート画面が表示されてしまいます。
サニタイジング処理を施し、スクリプトを書くときに用いる「>」や「<」などのプログラム用の文字を、単なる文字列に変換する処理をします。例えば「<」は「< ;」と変換します。これにより、「<script>」が「< ; script > ;」となるため、Webサーバ側ではこれはプログラム用の言葉ではなく単なる文字列として判断されるため、不正な操作は実行されません。
WAFを導入する
ウェブアプリケーションファイアウォール(WAF)を利用するのも、有効なSQLインジェクション対策のひとつです。WAFは、Webアプリケーション上のデータの送受信を把握・管理することで、不正侵入を防御するファイアウォールです。従来のファイアウォールがネットワークレベルでの管理であるのに対し、WAFはWebアプリケーションのレベルで管理を行います。
WAFでは、アプリケーションプログラムに渡される入力内容を検査し、不正と判断したアクセス要求を遮断します。SQLインジェクションの不正な要求を「攻撃」と見なして、アプリケーションとの通信を遮断することで、攻撃から守るしくみです。
SQLインジェクションの被害例
「PlayStation Network」で約7700万人の個人情報が漏えい
2011年に発生した、「PlayStation Network」サービスを標的とした、SQLインジェクション攻撃。この攻撃による情報漏えいの中では最大規模の被害となりました。
漏えいした情報は、氏名、住所、Eメールアドレス、生年月日、パスワード、オンラインID、購入履歴、請求先住所、パスワード再設定用のデータ、サブアカウントに関する情報などです。
「PlayStation Network」サービス以外にも、同時期にソニーグループに対するさまざまな攻撃が集中的に発生したことから、ソニーグループに対する標的型攻撃と考えられています。
お菓子メーカー「シャトレーゼ」で個人情報が漏えい
菓子メーカーのシャトレーゼのWebサーバへの不正アクセスが原因で会員情報が流出した被害。この攻撃もSQLインジェクション攻撃によるものと分析されています。
ユーザーIDと暗号化しているパスワード、メールアドレス、電話番号、誕生日を含む、20万9999件分の情報が 漏えいしたとされています。不正アクセスが発生した翌日、シャトレーゼは同社Webサイトを停止する自体に追い込まれました。
まとめ
SQLインジェクションは、一度攻撃を受けると個人情報の漏えいなど被害が深刻であることから、一刻も早い対応が迫られます。Web管理者は、国内外での攻撃事例も合わせて熟知し、被害に遭う前に対策を講じる必要があります。