目次
そもそもSQLってなに?
SQLとは、リレーショナルデータベースの操作を行う言語です。コンピューターで扱う言語ですが、プログラミング言語とは異なります。
SQLでは、データベースに対しデータを問い合わせ(検索)したり、データベースそのものの構造を作成・変更が可能です。また、蓄積されているデータを条件に応じて抽出できるほか、データを蓄積するテーブルを丸ごと削除してしまうような操作もできてしまいます。
SQLインジェクションとは
SQLインジェクションは、Webサイトの入力フォームにSQL文を含む文字列を入力し、アプリケーションとして想定していないSQL文を実行させる攻撃です。
例えば、アプリケーションで使用しているデータベースの値を改ざんされたり、必要なテーブルを削除されたりする危険性があります。さらに、IDとパスワードがなくてもグインできてしまうこともあります。
ここではSQLインジェクションの仕組みや種類を紹介します。
仕組み
Webサイトの入力フォームに入力された文字列はサーバーに渡され、データベースの検索条件や登録されるデータの要素として使われます。
攻撃者は、Webアプリケーションサーバーで実行されるSQL文を想定し、入力フォームから実行可能なSQL文を含む文字列を入力します。
そのため、Webサイトとしては入力された値によりアプリケーションのSQLが無効化されたり、入力されたSQL文が実行されたりしないよう対策が必要です。
種類
代表的なSQLインジェクションの種類として「インバンドSQLインジェクション」と「ブラインドSQLインジェクション」があります。
インバンドSQLインジェクションは、簡単にできる攻撃なので多く見られます。SQL文を実行してエラーメッセージを生成させることもでき、テーブルを結合させてアプリケーションテーブルすべてを参照することさえ可能です。
ブラインドSQLインジェクションは、直接データを盗み出すのではなく、データベースの管理情報を盗み出します。
クロスサイトスクリプティングとの違いとは?
クロスサイトスクリプティングは、Webサイトやメールを利用して不正なコードを実行させ、Webのプログラムコードを書き換えたりCookie情報を盗んだりする攻撃です。
SQLインジェクションもクロスサイトスクリプティングもセキュリティの脆弱性を攻撃する点では同じですが、前者は不正なSQL文を実行させる攻撃であり、後者はプログラムコードを用いる攻撃である点で異なります。
SQLインジェクションが引き起こす3つのリスク
SQLインジェクションはWebアプリケーションが利用しているデータベースを直接操作できるので、実行されてしまうと多大な影響や被害を受けることになりかねません。
SQLインジェクションを使った攻撃の中でも、アプリケーション管理者に致命的な結果となるリスクを3つ紹介します。攻撃の方法ともたらされる結果や影響から、SQLインジェクションの怖さをイメージしてみてください。
SQLインジェクションのリスク1:情報改ざん
ショッピングサイトでよく見かける「商品名」を入力して該当商品の検索を行うページでは、検索ボタンをクリックするとSQL文が発行される仕組みになっています。
入力された商品名は「’(シングルクォーテーション)」で囲んでSQL文のキーとして使われ、SQL文の最後は「;(セミコロン)」で閉じます。
SQL文の構成を知っている攻撃者が「’;攻撃に使うSQL文」を入力すれば、脆弱性のあるサイトでは攻撃に使うSQL文が実行されてしまいます。管理者が意図しない更新用SQLを攻撃用のSQL文として発行することも可能です。
SQLインジェクションのリスク2:機密・個人情報の漏洩
SQL文はデータベースからデータを抽出するときにも使われる言語なので、SQLインジェクションの脆弱性があるサイトから情報を抜き取るのは簡単な作業です。
会員登録フォームのようにデータベースへのデータ登録を目的とするフォームで、データ抽出のSQL文を含む文字列を入力します。データベースにはSQL文を含んだデータが登録され、次回該当データを検索するときに、攻撃としてのデータ抽出SQL文も実行されてしまいます。
SQLインジェクションのリスク3:データの消去
SQLインジェクションの攻撃によりデータを消去する方法は、データ改ざんの方法とほぼ同じです。
SQL文の構成を知っている攻撃者が「’;攻撃に使うデータ削除用のSQL文」を入力すれば、脆弱性のあるサイトではデータ削除のSQL文が実行されてしまいます。
そして、データ削除文が無条件で実行されれば該当テーブルにある全データが削除されてしまいます。さらに悪質の場合は、テーブルそのものを削除してしまうことも可能です。
SQLインジェクションの対策方法7選
SQLインジェクションはよく知られている攻撃であり、対応策も豊富です。管理するWebサイトに適した対応策を採用することが大切ですが、対応策は1種類だけでなく、可能な限り網羅した方がリスクを減らせます。
ここで紹介する対策方法は、Webサイトの構成やアプリケーションのプログラムで対応する必要があります。なお、Webサイト構築後はSQLインジェクションに関するテストが必須です。
SQLインジェクションの対策1:サーバーを使う
SQLインジェクションはWebアプリケーションのプログラムに問題があることによって起きるといわれています。
SQLインジェクションを使ってSQL文を入力された場合、アプリケーションはそれを命令文として認識していまいます。そのため入力エリアの文字や文字数などに入力制限を設け、SQL文を成立させないようにします。
SQLインジェクションの対策2:WAFを導入する
WAFはWebアプリケーションファイヤーウォールという技術で、アプリケーションそのものに組み込むことなく、脆弱性を突いた攻撃を検出できます。
後付けで行える対策なので、Webアプリケーションの改修が難しい場合や脆弱性が明らかになっていてもどう改修したらよいか不明な場合に有効です。WAFを導入すれば、SQLインジェクションだけでなく、クロスサイトスクリプティングによる攻撃も防御・低減できます。
SQLインジェクションの対策3:エスケープ処理
SQLインジェクションによる攻撃の対策として、入力フォームで入力された文字列を特殊な文字に変換したうえでデータベースに渡すエスケープ処理も有効です。
エスケープ処理はサニタイジングとも呼ばれ、SQLインジェクションやクロスサイトスクリプティング対策として有効です。環境により異なりますが、「<」を「<」に置き換えたり、空白を「 」に置き換えたりします。
SQLインジェクションの対策4:Webの脆弱性を確認する
管理しているWebサイトに脆弱性があるかを確認してくれるサービスがあります。これはセキュリティ会社が疑似攻撃をしかけてくれるもので、無償のサービスもあります。
無償のサービスは、セキュリティに関する知識を必要とするものもあるので、サイトの安全性を確実に確認しておきたい場合は、有償サービスを利用した方が確実です。また、診断方法も手動とツールがあるので、予算に応じて選択可能です。
SQLインジェクションの対策5:バインド機能を使う
SQLインジェクションを避けるため、実装の際はSQL文に入力フォームの入力値を直接使うのではなく、プレースホルダを使うのが一般的です。
プレースホルダとは、プログラム内で実行されるSQL文で外部パラメータを使う部分を「?」で表記しておき、実際に入力された値はSQL文とは別にバインドされるものです。
バインド機能を使っておけば、バインド機構に不具合がない限り、SQLインジェクションは不可能とされています。
SQLインジェクションの対策6:データベースサーバーの監視・解析を活用
地道な作業ですが、データサーバーへのアクセスログやクエリーログを監視し、解析しておくこともSQLインジェクションの有効な対策になります。
アクセスログからは不正なアクセスを検知でき、クエリーログからは想定したSQL文とは異なる不正なSQL文の実行を検知できます。また、監視や解析を行っていれば、攻撃が開始された時点で検知することもでき、被害や影響を最小限に抑えることも可能です。
SQLインジェクションの対策7:開発言語を使う
SQLインジェクションを防ぐ対策として、プログラムでSQL文を生成するのではなく、ロジックと合わせてSQL文を記述できる開発言語を使うことも有効です。
.net LinqやPL/SQLなどは、ロジックの中にSQL文を記述できる開発言語です。すでにほかの開発言語でプログラム開発を行っている場合、SQL文部分のみ抜き出してほかの開発言語に置き換えるのは、時間も費用もかかりすぎるので難しいでしょう。
SQLインジェクションの痕跡を見つける
SQLインジェクションはデータベース接続を利用した不正アクセスです。例えば、このような事例があります。
ある会社は自社製品を販売するショッピングサイトを作ったのですが、その会社にはIT関連に精通した社員がいませんでした。業者にホームページの製作とシステム構築を依頼し、サイトを公開、販売を始めました。
しかしそのページに目をつけた人物が、ログインページに「SQLインジェクション」を試みます。特殊な文字列を入力することで、パスワードを入力しなくても会員ページにログインできてしまいました。
そのため会員の氏名、電話番号、クレジットカード番号まで漏洩しまったのです。
iLogScanerを使って痕跡を見つける
このような被害を防ぐためには、まずSQLインジェクションの標的となるページの対策を採らなくてはいけません。例えばiLogScaner(SQLインジェクション検出ツール)を使って痕跡を検出しましょう。
ログを解析することで、攻撃の痕跡を確認できます。また攻撃が成功した可能性を見ることも可能です。さらにSSHやFTPサーバーのログを見て、攻撃と思われるような痕跡を検出する機能もあります。
SQLインジェクション対策でデータベースを守りましょう
SQLインジェクションは、自社のデータベースや顧客情報などを危険にさらす脅威です。
ホームページを製作する際には、SQLインジェクション対策を行い、大切なデータベースを守るようにしましょう。
インフラエンジニア専門の転職サイト「FEnetインフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。