[英]Hibernate HQL injection example
昨天在Github上搜索了一些存儲庫,我發現了一些有趣的東西:一個Java項目(我不會提到存儲庫的名稱,但我已經通知過它的所有者)包含對HQL查詢的錯誤處理,這可能導致SQL / HQL注射。 代碼如下:(請注意, username
和password
來自用戶)
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
那如果
clients.get(0)
方法調用引發IndexOutOfBoundsException
黑客可以針對中的每個x和z重復查詢
SUBSTR(password, x, x + 1) = z
在上面的查詢中,直到結果始終是第2種情況。 這樣,他可以找出用戶admin
的密碼哈希,並可能能夠破解他的密碼。
其他漏洞利用也是可能的,我將不列出所有漏洞...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.