第2回 SQL インジェクション
Download
Report
Transcript 第2回 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