2016-03-26 12 views
1

セキュアコードコースの一部として、文字列のconcatintionなどを使用してクエリが構築される脆弱なJavaシステムが提供されています。私はログインしてデータ取得するためにSQLを注入するために持っているそれぞれのコード行を以下に示します。SQL(HSQLDB)内の文字列に完全な結果セットを変換する

String comment; 
int articleID; 
//... 
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")"); 

commentは、任意のテキストに設定することができ、それだけでテキストボックスからプレーンテキストを読まされます。したがって、私は(表userが列loginpasswordを持っている)、完全なログインデータを読み込み、SELECTステートメントにテキストボックスのテキストを設定することについて考えた:

クエリ

INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4) 
を生じるはずである全体の中
' || (SELECT login || password FROM user) || ' 

カーディナリティ違反

はまだ、これは

org.hsqldb.HsqlExceptionになり

質問:

私は(SELECT login || password FROM user)が単一の文字列ではなく、結果セット、したがって||を用いて連結されなくてもよいためであると仮定する。

このSQLインジェクションシナリオ(HSQLDBで動作する標準SQL/SQL)で使用できる方法で、完全な結果セットを1つの文字列に変換できますか?

答えて

1

明らかに複数のユーザーが存在し、複数の行がSELECTから返されるため、正しいです。

LIMIT 1をSELECTに追加して、最初の行を取得することができます。内側のSELECTから文字列配列を作成することもできます。ガイドを参照してください。

HSQLDBでは、各データベースユーザーはテーブルへのアクセス権が異なります。実際の配備では、コメントを挿入するユーザーは、パスワードを含む表の存在を確認することさえできません。

関連する問題