SQLインジェクションの仕組みと対策について解説|サイバー攻撃

thumbnail

こんにちは。今回はWEBアプリケーションの代表的なサイバー攻撃の1つSQLインジェクションの仕組みと対策について解説します。

SQLインジェクションとは

SQLインジェクションとは、データベースを使用しているWEBアプリの脆弱性を悪用した攻撃です。データベースを不正に操作するSQL文を注入(Injection)され、情報漏洩やデータの不正利用等の被害が発生します。

仕組み

データベースの例としてメールアドレスとパスワードが保存されているusersテーブルがあるとします。

usersテーブル

emailpassword
example@example.compassword123
......

例として、WEBアプリのメールアドレスの入力欄に「example@example.com」が入力されると、以下のようなSQL文が実行される設計とします。

SELECT * FROM users WHERE email='example@example.com'

SQL文が実行されるとusersテーブルからemailが「example@example.com」のデータのみ表示されます。

SQLインジェクションの脆弱性があり、「1' OR 'a'='a」のように入力欄に入力すると、usersテーブルの全ユーザーデータが表示されてしまいます。

実行されるSQL文は以下のようになります。

SELECT * FROM users WHERE email='1' OR 'a'='a'

ORにより条件式「a=a」(全てTrue)というSQL文が挿入され、実行されることによりusersテーブルの全ユーザーデータが表示される仕組みです。

脅威

SQLインジェクション攻撃によって起こりうる脅威は以下のようなこと等が考えられます。

情報漏洩

データベースに格納されている非公開情報を盗まれてしまうと情報漏洩になります。クレジットカード情報を盗まれてしまうとカード情報を利用した商品購入、カードデータの売買等といったさらなる被害に繋がります。

情報改ざん

データベースに保存されている情報を改ざんされたり、データの削除、WEBサイトの改ざん等といった被害が考えられます。

不正ログイン

不正ログインにより、ユーザーになりすましたり、ユーザーに許可されている操作を行われる危険性があります。

OSコマンド実行

コマンドを実行され、システムを乗っ取られる等の危険性があります。

対策

プレースホルダーを利用する

SQL文はプレースホルダーを利用して作成する必要があります。SQL文のテンプレートの中に変数の場所を示すプレースホルダーを配置し、バインドと呼ばれる処理によりプレースホルダーに値を割り当てます。プレースホルダーを利用することで、不正なSQLを実行されなくなります。

エスケープ処理をする

特別な意味を持つ記号文字等を単なる文字列と識別されるようにエスケープ処理を行う必要があります。エスケープ処理を行うことで不正な文字列を挿入されても攻撃を成立させなくすることができます。

エラー内容をそのまま表示しない

ユーザーが入力した内容から表示されるエラーメッセージに、データベースやSQL文等の情報を含まないようにする必要があります。攻撃者に有用な手掛かりとなる情報を与えてしまいます。

適切な権限付与

WEBアプリで使用するデータベースを扱うアカウントの権限が必要以上に高いと、SQLインジェクションによる被害が大きくなる恐れがあります。そのため、アカウントの権限は必要最小限に抑える必要があります。

まとめ

SQLインジェクションについて解説しました。

SQLインジェクションの脆弱性が存在すると、深刻な被害が発生する恐れがあるため、設計段階から対策しておくことが必要です。

セキュリティは1つでも穴(セキュリティホール)が生じると攻撃者に狙われてしまいます。
可能な対策は全て行い安全性を強化しておくことが必要です。

参考:https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_1.html