1 / 16

第 2 回 SQL インジェクション

第 2 回 SQL インジェクション. その攻撃と対処. NEC ラーニング 山崎 明子. SQL インジェクションとは?. 悪意のある SQL 文やその一部を入力することで、データベースに不正にアクセスする攻撃. SQL 文やその一部の入力. 不正なアクセス. どのような問題が発生?. なりすまし 権利がないのにシステムにログイン 情報の不正取得 データの改ざん・データの削除 コマンドの実行      :. どのような場所で発生?. すべてのデータベースにおいて 特定のデータベースで発生するわけではない! すべてのタイプのアプリケーションにおいて

idola
Download Presentation

第 2 回 SQL インジェクション

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第2回SQL インジェクション その攻撃と対処 NECラーニング山崎 明子

  2. SQLインジェクションとは? • 悪意のあるSQL文やその一部を入力することで、データベースに不正にアクセスする攻撃 SQL文やその一部の入力 不正なアクセス

  3. どのような問題が発生? • なりすまし • 権利がないのにシステムにログイン • 情報の不正取得 • データの改ざん・データの削除 • コマンドの実行      :

  4. どのような場所で発生? • すべてのデータベースにおいて • 特定のデータベースで発生するわけではない! • すべてのタイプのアプリケーションにおいて • SQLを利用するすべてのアプリケーションで発生の可能性がある • 実際には、特にWebアプリケーションで問題が発生 • ユーザーの入力 • SQL文の全部または一部として利用 SQL文

  5. 攻撃のシナリオ (1)  • 存在するユーザー名、パスワードを入力 Tanaka P@ssw0rd1 SELECT * FROM UserList Where UserName=‘      ’ AND Password=‘        ’ Tanaka P@ssw0rd1 UsesrListテーブル 一致しているときに・・・ システムにアクセスOK!

  6. 攻撃例(1)  • ユーザー名、パスワードがわからなくても・・・ ここに何を入力したとしても・・・ ‘ OR ‘A’=‘A  と入力すると・・・ SELECT * FROM UserList Where UserName=‘   ’ AND Password=‘   ’ SELECT * FROM UserList Where UserName=‘XX’ AND Password=‘‘ OR ‘A’=‘A’ 常にTrue システムにアクセスできてしまう! 常にTrue

  7. 攻撃のシナリオ(2)  • 存在する検索データをユーザーが入力 1003と、入力・・・ strSQL = “SELECT*FROMOrderDetail WHERE OrderID = ‘ “+ + “ ‘ “; strSQL = “ SELECT*FROMOrderDetail WHERE OrderID = ‘ 1003 ‘ “; ターゲットデータを取得!

  8. 攻撃例(2)-1 • 検索データとして悪意のあるデータを入力 1003‘ OR 1=1 --  と入力・・・ strSQL = “SELECT*FROMOrderDetail WHERE OrderID = ‘ “+ + “ ‘ “; ‘ を無効に strSQL = “ SELECT*FROMOrderDetail WHERE OrderID =‘1003‘ OR 1=1 - - ‘ “; True すべてのデータを取得できてしまう!! True

  9. 攻撃例(2)-2 • 検索データとして悪意のあるデータを入力 1003‘; DROP TABLE OrderDetail -- と入力・・・ ;(セミコロン)があるため、 検索後に次のコマンドを実行 strSQL = “ SELECT*FROMOrderDetail WHERE OrderID =‘1003‘; DROP TABLE OrderDetail --‘ “; テーブル丸ごと 削除!!

  10. 攻撃例(2)-3 • 検索データとして悪意のあるデータを入力 1003‘; exec xp_cmdshell('fdisk.exe') -- と入力・・・ ;(セミコロン)があるため、 検索後に次のコマンドを実行 strSQL = “ SELECT*FROMOrderDetail WHERE OrderID =‘1003‘; exec xp_cmdshell('fdisk.exe') --‘ “; やりたい放題!!

  11. 効果的な対策 • 入力された特殊文字を制御文字ではなく、文字列定数として扱うようにする • 具体的な対策(1または2のいずれかを行う) • パラメータ化クエリまたはストアド プロシージャを使用 • アドホッククエリ(動的 SQL) を使用しない • 特殊文字のエスケープ処理 • ただし、すべての特殊文字をエスケープすることは困難 推奨 SELECT * FROM UserList Where UserName=@UName AND Password=@Pwd SELECT * FROM UserList Where UserName= ?AND Password= ? プレースフォルダ プレースフォルダ

  12. 高度な対策 • LIKE句のワイルドカード • % • 任意の数の任意の文字 • _ • 1文字の任意の文字 • LIKE句にプレースフォルダがある場合、これらは特殊な意味を持つ • ただの文字として扱いたい場合は、エスケープする必要がある • % → \% • _  → \_

  13. 基本的な対策 • ユーザー入力を信頼しない • 入力データのうち不要なものを削除する • 有効であることがわかるまでは、利用しない • 直接入力ではなく、できる限り選択式にする • 開発におけるセキュリティの基本 • 必要最低限の権利で実行する • 管理者レベルのアカウントを使用してデータベースに接続しない • 不必要な権限を与えない • これにより多くの問題を解決できる • エラーを表示しない • 最小限の例外情報のみを明らかにする • あらたな攻撃の糸口をつかまれないように・・・

  14. 効果的でない対策 • 基本的な対策だけを行うこと • 多層防御が重要 • クライアントサイドのみのチェック • 入力されたデータをクライアントサイドでチェックしても、サーバーへ送信される際に改ざん

  15. SQLインジェクションのまとめ • その攻撃を知り、適切に対処することが重要 • すべてのデータベースアクセスで起こる • すべてのアプリケーションタイプで発生する • 効果的な対策 • パラメータクエリまたはストアドプロシージャを利用 • 基本的な対策との多層防御も大切

  16. リファレンス • 開発者のためのセキュリティサイト • MSDNデベロッパーセキュリティセンター • http://www.microsoft.com/japan/msdn/security/ • 開発者向け セキュリティ オンライン セミナー • http://www.microsoft.com/japan/msdn/security/seminars/ • アプリケーションセキュリティの基礎 • 実践! セキュアなコード記述 Part 1 • 実践! セキュアなコード記述 Part 2

More Related