2

INSERT ステートメントの一部として SQL インジェクションを含む Web アプリケーションを使用しています。次のようになります。

INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')

などの通常の複数クエリ インジェクションを挿入できます');truncate table1;--が、Java + MySQL が使用されているため、複数のクエリをスタックすることはできないため、上記のインジェクションは MySQL からエラーになり、2 番目のクエリは実行されません。

したがって、基本的には、前述のアーキテクチャでそのような注入から達成できるのは、「ジャンクデータ」を注入することだけであり、これは注入なしでも可能です。

を使用するなどの手法は他にもありますがload_file()、それでも探している範囲でデータベースを操作することはできません。

ここで何か不足していますか?データベースを制御するためにこの注入を使用する他の方法はありますか?

4

3 に答える 3

2

もちろん、データベースとドライバーの組み合わせを現在の実装から複数の要求をサポートするものに変更すると、(間違いなく) 人々が忘れているであろう休眠中のセキュリティ ホールがアクティブになります。

悪意のある悪意のあるシナリオを無視すると、上記は引用符などを含む通常のデータを挿入する際に問題を引き起こします。つまり、上記は特定のデータセットに対しては機能しません(クレンジング/エスケープされない限り)。単に機能上の理由から修正します。

PreparedStatementと、これに対するデータ挿入メソッド ( setString() ) などを確認する必要があります。

例えば:

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setString(2, "Insert what you like here")

setString() メソッドは、エスケープ/インジェクションの問題なしに任意の文字列をサポートします。

于 2009-07-12T10:30:07.353 に答える
1

SQL インジェクションでは、データベースから何かを削除する必要はありません。攻撃者は、アクセスしてはならない貴重なデータを取得したいと考えるかもしれません。

たとえば、次のポストインジェクション形式を考えてみましょう (私は MySQL の構文に精通していませんが、一般的にはこのようなことが可能なはずです - 必要に応じてキャストを追加してください):

INSERT INTO table1 VALUES ('str1', 1,
-- injected stuff --
'' || (SELECT valuable_info FROM admin_only_table WHERE id=1) || ''
-- end injected stuff --
))

現在table1、たとえば、公的にアクセス可能な情報が取得される場所である可能性があるため、誰でも値を確認できますが、おそらく安全なテーブルからの潜在的に機密性の高い値が含まれていますadmin_only_table

もちろん、これは、サーバーがユーザーの偽装などのトリックを実行したり、クエリの SQL レベルでのアクセス許可を制限したりせず、完全な特権ですべてを実行することを前提としています。

于 2009-07-12T10:47:03.263 に答える
0

この投稿で説明されているように、従来のテーブルよりも多くの悪いことがアプリケーションに発生する可能性がありますDROP

  • スリープ機能を呼び出して、すべてのデータベース接続がビジーになり、アプリケーションが使用できなくなる
  • DB からの機密データの抽出
  • ユーザー認証をバイパスする

結論として、SQL ステートメントを作成するときは、文字列連結を使用しないでください。そのために専用の API を使用します。

于 2016-11-08T14:54:36.933 に答える