web-dev-qa-db-ja.com

SQLインジェクションは可能ですが、選択したクエリが機能しません

私は、バックエンドでJava Spring FrameworkとMySQLを使用するアプリケーションをブラックボックスでテストしています。

一重引用符を挿入すると(')テキストボックスフィールドで、サーバーはHTTPステータスコード500の内部サーバーエラーを返し、以下のエラースタックトレースが表示されます。

org.springframework.jdbc.BadSqlGrammarException:StatementCallback;不正なSQL文法[UPPER(コード)LIKE UPPER( '%'% ')LIMIT 0,10である自動車からコード、名前、num_codeを選択];

したがって、これは完全にSQLインジェクションです。

そのため、以下のペイロードで同じDBにある別のテーブルの行を削除しようとしました。

%'); DELETE FROM p_test WHERE t_id=1#

これにより、クエリが次のように変更されます。

select code, name, num_code from car where UPPER (code) LIKE UPPER('%%'); DELETE FROM p_test WHERE t_id=1# %') LIMIT 0,10

これで、行がテーブルから削除される必要がありますp_test with t_id = 1ですが、以下のスタックトレースでHTTPステータスコード500を返します。

[http-bio-8080-exec-7]エラーc.q.j.e.r.CommonHandlerExceptionResolver-doResolveExceptionが次の例外を解決しようとしています:org.springframework.jdbc.BadSqlGrammarException:StatementCallback;不正なSQL文法[upper(コード)LIKE UPPER( '%%'); DELETE FROM p_test WHERE t_id = 2#% ')LIMIT 0,10];ネストされた例外はcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptionです:SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、「DELETE FROM p_test WHERE t_id = 2#%」付近で使用する正しい構文について、1行目でLIMIT 0,10 'を確認してください。

誰かアイデアがあれば返信してください。

2
william cage

MySQLクライアントライブラリは、デフォルトでは複数のスタックされたクエリを許可しないため、この注入だけで任意のステートメントを実行することはできません。

これは単純な自動化された攻撃に対する便利な軽減策ですが、特定のアプリケーションの知識があれば、選択したインジェクションでできることはまだたくさんあります。クエリの出力が表示されたら、知りたいテーブルで別の選択を使用してUNIONを実行できます(そうでない場合は、そのデータを取得するためのより面倒な手法については、「ブラインドインジェクション」を参照してください)。あなたが持っている場合 SELECT INTOパーミッションは、実際に損害を与える可能性があります(任意のファイルの書き込みにより、任意のコードの実行にエスカレートする可能性があります)。

3
bobince