2009-08-11 5 views
5

彼ら(悪意のあるユーザー)はテーブルを記述し、重要な情報を得ることができますか?ユーザーを特定のテーブルにロックダウンするとどうなりますか?私はSQLインジェクションが必要だと言っているわけではありませんが、古いコードについては気になりますが、dbユーザーはロックされています。ありがとうございました。データベースユーザーが読み取り専用の場合、SQLインジェクションについて心配する必要があるのはなぜですか?

編集:私はあなたが言っているのか理解が、私は他のデータのためのResponse.Writeをを持っていない場合、どのように彼らはそれを見ることができます。クロールとドッキングをもたらすことは理にかなっています。他の人も同様ですが、データを実際にどのように見ていますか?

答えて

7

誰かは立ち入り禁止であるべきものへのアクセスを得るために、真の同等の代わりに、偽を返すために認証チェックを引き起こすためにSQLを注入できます。

それとも、クロールにデータベースのパフォーマンスをもたらすために自分自身にカタログテーブルのジョイン20または30回を注入できます。

またはのデータを変更する別のデータベースユーザーとして実行されるストアドプロシージャを呼び出すことができます。あなたは全体データベースを読んで、任意のユーザーを気にしない場合にのみ、

7
'); SELECT * FROM Users 

はい、あなただけのデータ(テーブル/ビュー)にそれらをロックダウンする必要があり、彼らは実際にそれが公に直面しています場合は特に、見ることができるはずです。

+0

グレート漫画:http://stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon/84629#84629 –

+0

私は上記の編集しました。それらの列を印刷するものがない場合、ユーザーに実際にどのように表示されますか? – johnny

+0

Jacobの答えを参照し、http://unixwiz.net/techtips/sql-injection.html – outis

4

。例えば、ここでは簡単な、注射用ログインシーケンスです:

select * from UserTable where userID = 'txtUserName.Text' and password = 'txtPassword.Text' 

if(RowCount > 0) { 
    // Logged in 
} 

私はちょうどそのユーザとしてログインするために、任意のユーザー名とパスワード'または1 = 1を使用してログインする必要があります。

3

非常に注意してください。私はドロップテーブルを削除し、テーブルを変更し、テーブルを作成し、テーブルを切り捨てたと仮定しています。

基本的には、優れたSQLインジェクションとは、データベースに依存している何かを変更することができるはずです。これは、認可、権限、外部システムへのアクセス、...

はあなたがデータベースから取得されたディスクにデータを書き込むかだろうか?その場合、perlやperlファイルのような実行可能ファイルをアップロードし、実行してボックスにアクセスしやすくすることができます。

また、特定の戻り値が予想される状況を利用して、データが何であるかを判断することもできます。私。 SQLがtrueを返した場合は実行を継続し、そうでない場合は実行を停止します。次に、SQLでバイナリ検索を使用できます。 select count(*)ここで、user_password> 'H';カウントが0より大きい場合、カウントは継続します。これで、プレーンテキストのパスワードをスクリーンに印刷することなく正確に見つけることができます。

また、アプリケーションがSQLエラーに対して強化されていない場合は、結果ハンドラの実行中に結果がSQLまたはSQLに挿入され、結果が画面に表示される場合があります。最初のSQL文は、ユーザー名とパスワードの素敵なリストを収集します。 2番目のステートメントは、適切でないSQL条件でそれらを活用しようとします。 SQL文は、このエラー状態で表示されている場合は、...

ヤコブ

+0

を読んでください。私たちが持っているものの中には、データ入力の種類を守るものがあります。だから私たちは日付を持つかもしれないし、日付を記入しなければそれは拒否されますが、それが悪用されるかどうかまだ疑問です。 – johnny

+0

これはコードによって異なります。 SQLインジェクション攻撃の後に日付が見つかった場合でも、引き続き日付と見なされますか? "12/01/1999");ドロップテーブルのユーザーは "面白い試し日です。日付があることを確認するだけでなく、何も持っていないことを確認することを確認してください。 – TheJacobTaylor

0

はいは、SQLインジェクションを心配し続けています。悪意のあるSQL文は、書き込みに関するものではありません。

リンクされたサーバーがある場合、またはクロスdbリソースにアクセスするためにクエリが作成されたとします。すなわち

SELECT * from someServer.somePayrollDB.dbo.EmployeeSalary; 
0

あなたが悪いのパラメータを持つパブリック(しかし、文書化されていない)メソッドを呼び出すことで、インスタンスをクラッシュすることができオラクルのバグがありました。

1

エンドユーザが任意のSQLを実行できるようにする読取り専用ユーザーでSQL tutorial websiteを作成中だったので、この質問と回答を読んでいます。

これは明らかに危険で、私はいくつかの間違いを犯しました。ここで私が最初の24時間に学んだものがあります(これのほとんどは他の回答によってカバーされていますが、この情報はより実用的です)。

  • は、ユーザーテーブルまたはシステムテーブルへのアクセスを許可しない:

のPostgres:

REVOKE ALL ON SCHEMA PG_CATALOG, PUBLIC, INFORMATION_SCHEMA FROM PUBLIC 
  • あなたの読み取り専用ユーザーは唯一のあなたが必要なテーブルへのアクセス権を持っていることを確認します あなたが望むスキーマ:

のPostgres:

GRANT USAGE ON SCHEMA X TO READ_ONLY_USER; 
GRANT SELECT ON ALL TABLES IN SCHEMA X TO READ_ONLY_USER 
  • 長時間実行をドロップするようにデータベースを構成しますが

Postgresの照会:

Set statement_timeout in the PG config file 
/etc/postgresql/(version)/main/postgresql.conf 
  • 独自のスキーマ内

Postgresの機密情報を入れて考えてみましょう:

GRANT USAGE ON SCHEMA MY_SCHEMA TO READ_ONLY_USER; 

GRANT SELECT ON ALL TABLES IN SCHEMA MY_SCHEMA TO READ_ONLY_USER; 

ALTER USER READ_ONLY_USER SET SEARCH_PATH TO MY_SCHEMA; 
  • を任意のストアドプロシージャをロックダウンして、彼らは、読み取り専用ユーザーによって実行することができないように注意してください

編集:システムテーブルへのアクセスを完全に削除することで、ユーザーが許可されなくなりましたo cast()のような呼び出しを行います。だから、アクセスを許可するために、再度これを実行することもできます。

GRANT USAGE ON SCHEMA PG_CATALOG to READ_ONLY_USER; 
+0

正解はちょうど1つの単語です:はい。それ以上のことは無意味であると主張することができます。 私は、この質問を読んでいる多くの人が、読み取り専用アクセスをロックダウンする必要のあるユーザーとデータベースを持つ立場にあると考えています。だからこそ私はこの答えを加えました。 –

関連する問題