收下這張小貼士,填補(bǔ)那些年在HQL注入留下的坑
前言
SQL注入是一種大家非常熟悉的攻擊方式,目前網(wǎng)絡(luò)上有大量存在注入漏洞的DBMS(如MySQL,Oracle,MSSQL等)。但是缺少針對hibernate查詢語言的相關(guān)資源,以期本文能給在滲透測試時(shí)能給各位多提供一條路。
HQL查詢并不直接發(fā)送給數(shù)據(jù)庫,而是由hibernate引擎對查詢進(jìn)行解析并解釋,然后將其轉(zhuǎn)換為SQL。為什么這個(gè)細(xì)節(jié)重要呢?因?yàn)橛袃煞N錯(cuò)誤消息來源,一種來自hibernate引擎,一種來自數(shù)據(jù)庫。
如果在HQL語法中發(fā)現(xiàn)了注入點(diǎn),我們是不能直接使用平時(shí)的SQL利用方法來應(yīng)對的,HQL有屬于它自己特定的語法,相對SQL而言限制更多一些,比如說HQL就沒有方法可以直接查詢未映射的表單,沒有聯(lián)合,沒有函數(shù)來創(chuàng)建簡單延遲,沒有系統(tǒng)函數(shù)。好在俄羅斯程序員在幾年前尋找到一個(gè)方法,將HQL context轉(zhuǎn)義成SQL context,進(jìn)而實(shí)現(xiàn)直接與數(shù)據(jù)庫通信。接下來進(jìn)入正題,此外各位需要注意,不同的數(shù)據(jù)庫轉(zhuǎn)義方法不盡相同,以下案例使用的是MySQL數(shù)據(jù)庫。
開胃菜:HQL轉(zhuǎn)義
最初的請求/響應(yīng)信息(注意POST body中的GWT格式)
在參數(shù)后面加上單引號,在返回的響應(yīng)信息中可以看到服務(wù)器拋出一個(gè)錯(cuò)誤。
像是豎線(‘|’)、反斜杠(‘\’)這類特殊符號會(huì)打亂GWT結(jié)構(gòu),我們得對這些數(shù)據(jù)進(jìn)行編碼。GWT格式對特殊字符的處理:
- | => !
- \ => \
在將HQL context進(jìn)行轉(zhuǎn)義之前,我們還需要對涉及到的數(shù)據(jù)庫進(jìn)行一些測試:
在MySQL, MSSQL, Oracle等常用數(shù)據(jù)庫中進(jìn)行測試,最終選定的最后一條payload卻只能在MySQL下執(zhí)行,接下來我們就將HQL context進(jìn)行轉(zhuǎn)義。
將字符串\'',由HQL context轉(zhuǎn)換為MySQL context。在HQL查詢上下文中,單引號會(huì)被附加另一個(gè)單引號來進(jìn)行轉(zhuǎn)義,反斜杠依舊是平常的反斜杠。這里與MySQL全然不同,MySQL使用反斜杠來轉(zhuǎn)義單引號,而不是另一個(gè)單引號。因此,當(dāng)Hibernate框架解析到一個(gè)查詢語句,剛好底層使用的數(shù)據(jù)庫又是MySQL的時(shí)候,就變得十分有趣了:
Hibernate解析到的語句:
- 'orderInGroup'||'\''|| (select 1)) -- ' // as a string
加上payload之后的MySQL:
- 'orderInGroup'||'\''|| (select 1)) -- ' // string '\'', logical 'or', select query
以下截圖顯示了payload成功執(zhí)行
吃完字符串轉(zhuǎn)義這口開胃菜之后,胃口不妨打開一些,從數(shù)據(jù)庫中檢索信息
正餐:布爾型盲注
我們這個(gè)案例中的注入點(diǎn)在'order by'查詢部分,由于應(yīng)用無法顯示查詢的數(shù)據(jù),這時(shí)我們就使用布爾型盲注的思路,MySQL函數(shù)updatexml就是一個(gè)非常不錯(cuò)的選擇,如果它的第二個(gè)參數(shù)不是有效的XPath查詢字符串就會(huì)報(bào)錯(cuò),如果XPath查詢是正確的就不返回值。
- updatexml(xml_target,xpath_expr,new_xml)
重要的是,只會(huì)在計(jì)算完第二個(gè)參數(shù)后才會(huì)拋出錯(cuò)誤(其中包含有if子句),也就是根據(jù)if判斷子句,應(yīng)用確定是否返回錯(cuò)誤。和SQL下的布爾值盲注思路一樣,之后通過逐個(gè)字符的提取數(shù)據(jù)即可。
獲取到的完整值:
最后解碼得到[…]PROD_SELF[…]
強(qiáng)烈推薦ORM2Pwn: Exploiting injections in Hibernate ORM
參考文獻(xiàn)
Эксплуатация инъекций в Hibernate ORM
GWT RPC data format
SQL布爾型盲注思路分析
ORM2Pwn: Exploiting injections in Hibernate ORM
HQL Injection Exploitation in MySQL
Exploiting a HQL injection
HQL for pentesters Hibernate:深入HQL學(xué)習(xí)