SQLインジェクション

SQLインジェクションとは


SQLインジェクションとは、Webアプリケーション上の脆弱性を意図的に狙って、アプリケーションが想定していないSQL文を実行させて、データベースシステムを悪用しようとするサイバー攻撃です。近年のWebサイトはデータベースと連動してページを生成するものが多いため、SQLインジェクションはWebサイトに対する有名な攻撃のひとつとなっています。

そもそもSQL(Structured Query Language:構造化問い合わせ言語)とは、リレーショナルデータベースの定義や操作、管理を行うためのデータベース言語です。たとえば条件に当てはまるデータを取り出すSELECT文、設定変更を行うALTER文、トランザクション処理を開始するためのBEGIN文、取り消すROLLBACK文などがそれに該当します。

SQLインジェクションを行おうとする攻撃者は、データの削除、追加、改ざん、取得などの目的で予期されていないSQL文を挿入(injection)し、自らがリレーショナルデータベースを自由に操作できるようにします。そうすると、攻撃者がリレーショナルデータベースに格納されている個人情報を入手、改ざんできる状態になります。

最も基本的な攻撃パターンがシングルクォート(')挿入です。例えば、ログインするときのパスワード認証に「pass = '入力値'」という条件式判定を含むサイトにおいて、入力値を「' OR 'A' = 'A」として「pass = '' OR 'A' = 'A'」というSQL文を発行すると、「OR」以降の部分が常に正となりパスワードを求める部分が無効化されます。その結果、自由にログインできるようになります。

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


SQLインジェクションを防ぐ最も有効な方法は、Webアプリケーションへの入力をSQL文として解釈させないことです。
例えば、プリペアドステートメント(Prepared Statement)を利用しSQLを入力値と一緒に組み立てないという方法があります。プリペアドステートメントではあらかじめ定められたSQL文のみを利用するため、外部から手が加えられる心配がありません。

その他、入力に対してエスケープ処理を実施する方法もあります。エスケープ処理とはシングルクォート(')やセミコロン(;)などの特別な意味を持つ記号を普通の文字として解釈されるように処理することです。その結果、攻撃者がSQL文を発行しようとしても単なる文字列を挿入することにしかなりません。

それでも万一SQLインジェクションが功を奏してしまう場合に備えて、データベースアカウントの権限を見直し、すべての権限を備えたアカウントを作成しないようにすることが有効です。
難しい場合は、収集する情報を見直したり、データベースに格納する情報を必要最小限に抑えたりすると良いでしょう。

このような方法を組み合わせて行うことで、万が一のときにも被害を最小限に抑えることができます。

SQLインジェクションの事例


SQLインジェクションの対策不備に対して損害賠償が命じられた事例としては、2014年1月に東京地裁で判決された訴訟があげられます。
あるECサイトがSQLインジェクション攻撃を受け、利用者のクレジットカード情報を漏えいした事件に対するもので、東京地裁は、アプリケーション開発会社は専門家の責務としてSQLインジェクション対策を施さなければならないにも関わらずそれを怠ったとして、ECサイト運営者に対して約2,260万円を支払わなければならないとの判断を下しました。

また、2013年5月にはある国内通信機器レンタルサービス業者がSQLインジェクション攻撃を受け、約11万件のクレジットカード情報を流出した事件も起きています。

個人情報を盗用するだけでなく、個人情報を書き換えたり、ウイルス感染を引き起こすようWebサイトを改ざんする事例も多数報告されています。たった一文のSQL文がビジネスに甚大な被害をもたらすのです。