web-dev-qa-db-ja.com

データベースへの読み取り専用アクセスはSQLインジェクションを防ぎますか?

読み取り専用接続を使用してSQL Serverに接続するWeb APIがあり、APIの技術に精通したユーザーがクエリ文字列にSQLのwhere句を入力できるようにしたいと考えています。基本的には、selectステートメントに入力されたものをタックしたいだけです。

最小限の特権(1つのテーブルでのみ機能を選択)、データベースへの読み取り専用接続で、すべての注入攻撃を防ぐことができますか?

51
Aaron

いいえSQLインジェクションとデータインジェクションを混同している可能性があります。読み取り専用テーブルはSQLインジェクションを妨げず、せいぜい少しだけその影響を制限します。

SQLインジェクションとは、単にSQLコードをインジェクトする機能を意味します。読み取り専用テーブルでは、dataをテーブルに挿入する機能が制限される場合がありますが、次の機能には影響しません。

  • 許可されていない場合、他のデータベースまたはテーブルから読み取る
  • システムテーブルから読み取るか、許可するのが難しい他のシステムクエリを実行する
  • DoSを実行する過度に複雑なクエリを作成する
  • DNSを使用してデータを抽出する
  • ローカルファイルへのアクセス(Oracleのutl_fileなど)
  • DBサーバーのネットワーク(Oracleのutl_httpなど)にアクセスします。
  • DB関数バッファオーバーフロー を介してサーバー上で任意のコードを実行します
  • Oracleデータベースでの高度なSQLインジェクション を参照して、心配する必要があるあらゆる種類の事柄を順を追って確認してください(他のデータベースにも同等の機能があることがわかります)。

もし、あんたが

基本的には、彼らがselectステートメントに入力したものをタックしたいだけです。

次に、攻撃者がこれらのいずれかを試すことを明示的に許可します。

今、あなたは確かにこれを制限するために何かをすることができます。引用符とSQLステートメントの区切り文字を禁止できます。 [A-Za-z0-9"=](またはデータベースと実質的に同等)ではない入力を拒否できます。しかし、このパスをたどり始めたら、アプリケーションを正しく記述したほうがよい:チェックするキーを提供する、よりリッチなクエリインターフェイスを公開します。次に、ユーザーが入力した値に対して適切な引用を実行します。

109
gowenfawr

いいえ、些細な例

EXEC ('SELECT COUNT(*) 
       FROM table 
       WHERE UserName =''''' + @UserName + ''''' AND Password = '''''+@Password+'''''')

@Passwordをa' OR 1=1;--に設定します

そして、あなたのパスワードはバイパスされます

13
Akash

最小限の特権(1つのテーブルでのみ機能を選択)、データベースへの読み取り専用接続で、すべての注入攻撃を防ぐことができますか?

SQLインジェクションは、攻撃者が既存のステートメントを変更して、意図しないアクションを引き起こす方法です。これらのアクションは、データベースでの変更またはシステムでのコード実行である可能性がありますが、必要のないデータを単に返すか、リソースを大量に消費する操作を実行することによりサービス不能を引き起こします。

クエリを特定のテーブルのみを選択するように制限すると、影響が制限される可能性がありますが、サービス拒否が発生する可能性があります。また、クエリの結果が使用される場所によっては、予期しない結果を返すことによってアプリケーションの動作を変更する場合があります。

12
Steffen Ullrich

どういたしまして。 SQLインジェクションの欠陥はSQLサーバーではなくWebアプリケーションレベルにあるため、WebアプリケーションがSQLインジェクションに影響を受けやすい場合は、データベースへのアクセスレベルに関係なく影響を受けます。

ただし、あなたが言及した最小特権の原則により、誰かがWebアプリケーションでSQLインジェクションを悪用しても、データベースコンテンツへの読み取りアクセス権しか取得できず、データベースコンテンツまたは構造を変更することはできません。 。

0
WhiteWinterWolf