Hibernate是一種ORMapping框架,內部可以使用原生SQL還有HQL語言進行SQL操作。
所謂的HQL注入,就是指在Hibernate中沒有對數據進行有效的驗證導致惡意數據進入應用程序中造成的。
請看這段代碼:
Input參數即可造成注入。
不過在Hibernate中,一般都是在createQuery中使用PDO,使用setString填充佔位符進行sql語句的拼接,如果是這樣的話,自然就不存在SQL注入,但是不排除有人像上面的圖片中的寫法。
正常情況下:
Sqlin參數存在注入漏洞,於是:
由於Hibernate的HQL中,大多數情況下不支持union,更不支持數據庫的meta data的查詢,所以如何弄清楚實體名稱和列名稱才能繼續提取有用的數據,遺憾的是,沒有找到一種方法爆出當前的列名。
看了http://blog.h3xstream.com/2014/02/hql-for-pentesters.html, 上面說提交一個不存在的列名即可,但是本地測試沒有成功,目測是try-catch了事物提交,然後e.getSql()方法。
比如,源碼中進行錯誤處理,輸出了e.getSQL()以及e.getXSQLException(),結果就和上面老外說的trick一樣了:
不過我認爲這樣的“友好”錯誤存在的機率很小。
目前來看,HQL注入除了萬能密碼、知道表名列名的情況下進行盲注外,我沒有想到比較好的方法來進行漏洞利用,個人認爲Hibernate中的注入比較雞肋。