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