2009-07-12 8 views
2

私はINSERT文の一部としてSQLインジェクションを持つWebアプリケーションを持っています。それは次のようになります。複数のクエリを使用する場合のJavaとMySQLでのSQLインジェクション

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

私は、このようなJavaの+ MySQLは上記の注射がもたらすであろうように、複数のクエリを積み重ねることはできませんそれを使用しているという事実に');truncate table1;--としてではなくによる定期的な複数のクエリ注射を挿入することができます2番目のクエリは決して実行されません。

基本的には、前述のアーキテクチャーでこのような注入で達成できるのは、注入なしで可能な「ジャンクデータ」を注入しているようです。

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

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

答えて

2

もちろん、データベース/ドライバの組み合わせを現在の実装から複数の要求をサポートするものに変更すると、人々が忘れてしまった休止中のセキュリティホールが有効になります。 (/ esapedなど清めていない限り)

単に、極悪な、悪質なシナリオを無視する上記のあなたの引用符を含む定期的なデータを挿入すると問題を引き起こすだろうなどすなわち上記は、データの特定のセットのためを動作しません。 。私は機能的な目的のためにそれを単に修正するでしょう。

あなたは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()メソッドは、エスケープ/注入せずに任意の文字列をサポートしています問題。

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レベルでのアクセス許可を制限するのではなく、完全な権限ですべてを実行することを前提としています。

0

としてはthis postで説明した、古典的なテーブルDROPよりアプリケーションに発生する可能性がより悪いことがあります。

  • すべてのデータベース接続がビジー状態になるように、したがって、あなたのアプリケーションを作る、スリープ機能を呼び出しますDB
  • bypassing the user authentication

から機密データを抽出

  • 使用不能結論として、SQL文を作成するときには文字列連結を使用しないでください。専用のAPIを使用してください。