SQLインジェクション

当ページでは、「SQLインジェクション」と呼ばれるサイバー攻撃の概要、攻撃手順やその被害の例、対策方法について、図を用いて分かりやすく解説しています。
 
 

SQLとは

まず始めに、攻撃手法理解の前提知識となる「SQL」について説明する。 SQL(Structured Query Language)とは、データベース(DB)を操作するためのプログラミング言語の一種。
 
例として、DB内に以下のusersテーブルが登録されているとする。
IDPASSWORD
user1pass111
user2pass222
user3pass333
usersテーブルから「ID」の値が「user2」の「PASSWORD」の値を取得するには、以下のSQL文を実行する。
SQL文:
実行結果:

SQLインジェクションとは

SQLインジェクションとは、SQL文に挿入される値を操作して、本来のSQL構文を変更することで、データベースの不具合などを起こす攻撃手法のこと。

攻撃手順の例

Webサイトのログイン画面にてSQLインジェクション攻撃を実施し、パスワードを知らなくても不正にサイトへログインする例を紹介する。

攻撃対象と通常利用の流れ

まず、通常時に正規ユーザがログインする手順を示す。
通常のログイン処理
 
  1. ユーザがログイン画面でIDとパスワードを入力して送信する。
  1. Webサーバは、ユーザの入力値をSQL文に組み込んで、IDとパスワードが一致するデータが存在するかを確認する。 ソースコードの例:
    1. ID「admin」、パスワード「pass123」が入力された場合に実行されるSQL文:
 
  1. 一致するデータがあるのでログイン成功とみなされ、ログイン後のページが送信される。

攻撃手順

続いて、攻撃者が他ユーザ「admin」のアカウントにパスワードを知らない状態で不正ログインする手順を示す。
 
  1. 攻撃者はID「admin」、パスワードは不明なので「' OR '1'='1」を入力して送信する。
  1. Webサーバで実行されるSQL文は以下のようになる。
    1.  
      「ID」が「admin」かつ、「PASS」が「」か「'1'='1'」のデータを取得することとなる。 は常に真なので、PASSは本来の「pass123」を指定しなくても一致とみなされてしまう。
       
  1. 一致するデータがあるのでログイン成功とみなされ、ログイン後のページが送信される。

攻撃された場合の被害

SQLインジェクションによって攻撃された場合、以下のような被害が発生する可能性がある。

認証が回避される

ログイン機能などの、認証処理の部分にSQLインジェクションの脆弱性が存在した場合、本来必要な認証情報を所持していないユーザが不正に認証を突破する恐れがある。

DB情報の漏えい・改ざん・消去

DBに登録されているデータの漏洩・改ざん・消去が起こる可能性がある。

サーバでOSコマンドが実行される

DB接続ユーザの権限が高い場合、サーバ上で任意のOSコマンドを実行される可能性がある。

対策方法

SQLインジェクション攻撃を防ぐための対策方法は以下の通り。

バインド機構を利用する

バインド機構とは、予め定義したSQL文(プリペアドステートメント)を用意しておき、後から変動個所(プレースホルダ)に実際の値(バインド値)を割り当ててSQL文を生成する仕組み。
ユーザーの入力を直接SQL文に組み込むのではなく、あらかじめ定義したクエリに入力値を安全に埋め込むことができる。
以下のSQL文はバインド機構を使用した例となる。
ユーザの入力値が入る場所はプレースホルダと呼ばれ、以下のように記号「?」で仮置きされる。

関連情報・参考情報

その他のサイバー攻撃・セキュリティ関連記事も良かったらご参照ください!