私たちの開発者は、ユーザーログインの処理に驚きを残しました。つまり:
// 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とフォームの両方で、チェックアウトします。
たとえば、ユーザーのハッシュ/パスワードを列挙できます。
次をユーザー名として挿入します。
admin' AND substring(password,0,1) == char(64) AND '1' = '1
「パスワード」列の最初の文字が小文字かどうかを確認します。