SQL インジェクション

第2回
SQL インジェクション
その攻撃と対処
NECラーニング
山崎 明子
SQLインジェクションとは?

悪意のあるSQL文やその一部を入力することで、
データベースに不正にアクセスする攻撃
不正なアクセス
どのような問題が発生?

なりすまし




権利がないのにシステムにログイン
情報の不正取得
データの改ざん・データの削除
コマンドの実行
:
どのような場所で発生?

すべてのデータベースにおいて


すべてのタイプのアプリケーションにおいて



特定のデータベースで発生するわけではない!
SQLを利用するすべてのアプリケーションで発生の可能性があ
る
実際には、特にWebアプリケーションで問題が発生
ユーザーの入力

SQL文の全部または一部として利用
SQL文
攻撃のシナリオ (1)

存在するユーザー名、パスワードを入力
Tanaka
P@ssw0rd1
SELECT * FROM UserList Where UserName=‘
Tanaka
UsesrListテーブル
Yamada
pass
Tanaka
P@ssw0rd1
Akiko
PWD
:
:
’ AND Password=‘
P@ssw0rd1 ’
一致しているときに・・・
システムにアクセ
スOK!
攻撃例(1)

ユーザー名、パスワードがわからなくても・・・
ここに何を入力したとしても・・・
‘ OR ‘A’=‘A
SELECT * FROM UserList Where UserName=‘
と入力すると・・・
’ AND Password=‘
’
SELECT * FROM UserList Where UserName=‘XX’ AND Password=‘‘ OR ‘A’=‘A’
常にTrue
常にTrue
システムにアクセ
スできてしまう!
攻撃のシナリオ(2)

存在する検索データをユーザーが入力
1003と、入力・・・
strSQL =
“SELECT * FROM OrderDetail WHERE OrderID = ‘ “ +
strSQL =
“ SELECT * FROM OrderDetail WHERE OrderID = ‘ 1003 ‘ “;
ターゲットデータを
取得!
+ “ ‘ “;
攻撃例(2)-1

検索データとして悪意のあるデータを入力
1003‘ OR 1=1 -- と入力・・・
strSQL =
“SELECT * FROM OrderDetail WHERE OrderID = ‘ “ +
+ “ ‘ “;
‘ を無効に
strSQL =
“ SELECT * FROM OrderDetail WHERE OrderID =‘1003‘ OR 1=1 - - ‘ “;
True
すべてのデータを
取得できてしまう!!
True
攻撃例(2)-2

検索データとして悪意のあるデータを入力
1003‘; DROP TABLE OrderDetail -- と入力・・・
strSQL =
“ SELECT * FROM OrderDetail WHERE OrderID =‘1003‘
DROP TABLE OrderDetail -- ‘ “;
テーブル丸ごと
削除!!
;(セミコロン)があるため、
検索後に次のコマンドを実行
;
攻撃例(2)-3

検索データとして悪意のあるデータを入力
1003‘; exec xp_cmdshell('fdisk.exe') -- と入力・・・
strSQL =
“ SELECT * FROM OrderDetail WHERE OrderID =‘1003‘
exec xp_cmdshell('fdisk.exe') --‘ “;
やりたい放題!!
;(セミコロン)があるため、
検索後に次のコマンドを実行
;
効果的な対策

入力された特殊文字を制御文字ではなく、文字列定
数として扱うようにする

具体的な対策(1または2のいずれかを行う)
推奨
1. パラメータ化クエリまたはストアド プロシージャを使用
SELECT * FROM UserList Where UserName=@UName AND Password=@Pwd
SELECT * FROM UserList Where UserName= ? AND Password= ?

アドホッククエリ(動的 SQL) を使用しない
プレースフォルダ
2. 特殊文字のエスケープ処理

ただし、すべての特殊文字をエスケープすることは困難
高度な対策

LIKE句のワイルドカード

%


_


任意の数の任意の文字
1文字の任意の文字
LIKE句にプレースフォルダがある場合、これら
は特殊な意味を持つ

ただの文字として扱いたい場合は、エスケープする必
要がある


% → \%
_ → \_
基本的な対策

ユーザー入力を信頼しない
 入力データのうち不要なものを削除する
 有効であることがわかるまでは、利用しない



必要最低限の権利で実行する
 管理者レベルのアカウントを使用してデータベースに接続し
ない
 不必要な権限を与えない


直接入力ではなく、できる限り選択式にする
開発におけるセキュリティの基本
これにより多くの問題を解決できる
エラーを表示しない
 最小限の例外情報のみを明らかにする

あらたな攻撃の糸口をつかまれないように・・・
効果的でない対策

基本的な対策だけを行うこと


多層防御が重要
クライアントサイドのみのチェック

入力されたデータをクライアントサイドでチェックしても、
サーバーへ送信される際に改ざん
SQLインジェクションのまとめ

その攻撃を知り、適切に対処することが重要



すべてのデータベースアクセスで起こる
すべてのアプリケーションタイプで発生する
効果的な対策


パラメータクエリまたはストアドプロシージャを利用
基本的な対策との多層防御も大切
リファレンス

開発者のためのセキュリティサイト


MSDNデベロッパーセキュリティセンター
 http://www.microsoft.com/japan/msdn/security/
開発者向け セキュリティ オンライン セミナー
 http://www.microsoft.com/japan/msdn/security/seminars/
 アプリケーションセキュリティの基礎
 実践! セキュアなコード記述 Part 1
 実践! セキュアなコード記述 Part 2