簡體   English   中英

Hibernate HQL注入示例

[英]Hibernate HQL injection example

昨天在Github上搜索了一些存儲庫,我發現了一些有趣的東西:一個Java項目(我不會提到存儲庫的名稱,但我已經通知過它的所有者)包含對HQL查詢的錯誤處理,這可能導致SQL / HQL注射。 代碼如下:(請注意, usernamepassword來自用戶)

  Query query = session.createQuery("from Client where username = '" + username + "'");
  List clients = query.list();
  Client client = (Client) clients.get(0);
  if (!validPassword(client.getPassword(), password)) {
      return false;
  }
  //client is authenticated....

我認為很明顯,該查詢是可注入的。 我真的不知道如何利用這個易受攻擊的查詢,因為即使我們注入username ,仍然會檢查password 使用的數據庫是MySql (如果有幫助)。
所以我的問題是:該如何利用?

是的,因此...一旦啟動了休眠會話,就可以使用查詢來獲取數據。 現在,您已經編寫了Client表查詢。

例如,

用戶名=“ ABC”

1)您從用戶名='ABC'的客戶端查詢將從用戶名完全為ABC的客戶端獲取數據。 如果找到多個相同的用戶名,則還返回全部。

2)它將存儲在列表中。 0個或更多記錄將存儲在列表中。

3)然后,無論有什么記錄,它僅使用

客戶client =(Client)clients.get(0);

4)它使用客戶端對象記錄密碼和您期望的密碼進行檢查,該密碼可能被假定通過方法調用保存在某個變量中。

5)如果不匹配,則返回false布爾標志,否則代碼將繼續進行經過身份驗證的客戶端執行。

希望你能得到答案。

盡管HQL的限制比SQL更為嚴格,但仍然可以利用它。

https://blog.h3xstream.com/2014/02/hql-for-pentesters.html上說明了一些示例注入

之前已經在https://security.stackexchange.com/questions/24265/hql-injection-example提出了與此問題類似的問題

該問題的答案說明了如何掃描密碼(哈希)的字符。 例如,如果對於Oracle數據庫, username值為:

admin' AND SUBSTR(password, 0, 1) = 'A

那如果

  1. 密碼的第一個字符(哈希)不是'A'->客戶端列表為空,並且clients.get(0)方法調用引發IndexOutOfBoundsException
  2. 密碼的第一個字符(哈希)為“ A”,但提供的密碼為false->用戶未通過身份驗證
  3. 密碼的第一個字符(哈希)為“ A”,並且提供的密碼正確->用戶已通過身份驗證

黑客可以針對中的每個x和z重復查詢

SUBSTR(password, x, x + 1) = z

在上面的查詢中,直到結果始終是第2種情況。 這樣,他可以找出用戶admin的密碼哈希,並可能能夠破解他的密碼。

其他漏洞利用也是可能的,我將不列出所有漏洞...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM