Top > SQL Injection

Web Application

SQLインジェクション

不正なSQL文を注入して重要情報の取得や改竄(かいざん)を行うことが可能となる脆弱性、または攻撃のことです。

検証

ウェブアプリケーションのログイン画面において、以下のような実装(Java)がされているとします。

String userId="admin"; //フォーム[user_id]で入力したと想定
String passwd="hoge";  //フォーム[passwd]で入力したと想定

String sql = "";
sql += "SELECT * FROM m_user";
sql += " WHERE user='" + userId + "'";
sql += " and   pswd='" + passwd + "'";

そして、このSQLの結果が1件でもデータベースから返ってきたらユーザ認証OK、という仕様だとします。
ここで、次のような文字列を[user_id]に設定します。[passwd]には何も入力する必要がありません。

[' or 1=1--]

すると、生成されるSQLは以下のようになります。

SELECT * FROM m_user WHERE user='' or 1=1--' and pswd=''

RDBMS*1によりSQL文法に違いはありますが、[' or 1=1;--]といった文字列を埋め込むことで条件句を必ず真にすることが出来た場合、ユーザIDやパスワードを知らなくてもログイン後の画面に遷移することが可能となってしまいます。

 

対策

以下のような対策が必要です。

  • SQLに使用可能な記号を受け付けない
    • SQLに使用可能な文字を排除する*2のではなく、許可する文字を定義し、それのみを受け付ける*3のが理想です。
  • 適切なエスケープ
    • ブログやWikiなどといった、性質上SQLに使用可能な記号を受け付ける必要があるアプリケーションの場合、入力値を適切にエスケープしてください。
      エスケープ方法は参考サイトに詳細な解説があります。
      (丸投げゴメンナサイ)
  • 入力値を直接SQL生成に使用しない
    • アプリケーションの仕様上、SQLで使用可能な記号をデータベースに登録する必要があって排除することが出来ない場合、入力した値をそのままSQL文の構築に使用せず、いわゆる「バインド*4」機能を使用してください。

ブラインドSQLインジェクション

 

 

リテラル表現形式

文字列(テキスト・リテラル、文字リテラルなど)

データベースシステム括り文字
Oracle 10g リリース2(10.2)' (シングルクォーテーション)
MySQL 4.1' または " (ダブルクォーテーション)
PostgreSQL 8.3.0' (シングルクォーテーション)
DB2 Version 9' (シングルクォーテーション)
 

 

参考サイト



*1 リレーショナルデータベースマネジメントシステム(Relational Database Management System)
*2 ブラックリスト方式
*3 ホワイトリスト方式
*4 Javaならjava.sql.PreparedStatementなど

Reload   New Lower page making Edit Unfreeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: (627d)