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