web-dev-qa-db-ja.com

HQLインジェクションの例

私たちの開発者は、ユーザーログインの処理に驚きを残しました。つまり:

// Java
List users = hibernate.find("from Users where username = '"+formUsername+"'";
if (users.length==0) { return BAD_USER; }
if (!checkPassword(users.get(0).getPassword(), formPassword)) {
  return BAD_USERNAME_PASSWORD_COMBO;
}
// continue to mark session as authenticated

さて、明らかに、クエリに注入することが可能です。しかし、それはHQL言語です。それがSQLであり、データベースの構造がわかっている場合は、「ユニオン」操作をハングして、任意のアカウントにログインできます。しかし、本当に何か悪いことを起こすために、私がここでどんな悪意のあるHQLにぶら下がることができるのか、私にはよくわかりません。

はい、パラメーターを使用するようにこのコードを既に置き換えましたが、その状況で何ができるかについては興味があります。私が見たHQLの例は「OR」演算子の追加に関するもので、この場合は役に立ちません。

また、基盤となるデータベースはpostgresであるため、postgresの関数はどれも公平なゲームです。

追伸.

組合がどのように役立つかについての質問があった。 (id、username、password)のテーブル構造と次のSQLクエリが与えられます:

select id, username, password from users where username = ...

私は注射することができます:

' union select 1, 'root', 'synthetic_password

完全に実行されるSQLは次のようになります。

select id, username, password from users where username = '' union select 1, 'root', 'synthetic_password'

最初の選択はレコードを返さず、2番目の選択はJavaコードがBeanを読み込んでそこからデータを入力します。次に、パスワードを比較しますが、パスワードデータを提供したため、注入されたSQLとフォームの両方で、チェックアウトします。

15
Pawel Veselov

たとえば、ユーザーのハッシュ/パスワードを列挙できます。

次をユーザー名として挿入します。

admin' AND substring(password,0,1) == char(64) AND '1' = '1

「パスワード」列の最初の文字が小文字かどうかを確認します。

7
Chris Dale