作者:
Nebula
·
2014/12/02 9:09
0x00 前言
前幾天,有幾個屌絲高帥富給我看一個這樣的漏洞型別:
地址:http://blog.emaze.net/2014/11/gemfire-from-oqli-to-rce-through.html
GemFire記憶體資料庫是來自雲端計算公司Pivotal(未來我最看好的雲端計算產品提供商,由EMC、VMware、通用電氣這三家公司合資等方式組成,這裡有我們熟悉Spring技術團隊支撐的就是這家公司雲端計算前端開發框架)的產品.
0x01 記憶體資料庫基礎
那什麼是記憶體資料庫,為什麼需要它?給大家舉個簡單的例子:
在百度中搜尋: GemFire,排在第5位的結果就是我們的答案
我們知道中國是個人口大國,由於地域經濟差異大,外出打工掙錢的人特別多.逢年過節買火車票一直有個頭痛的問題,就是關鍵時候這個網站就打不開了.無論它體驗及效能有多爛,我們還是要去上它,因為要回家(這是剛需),隨著國人網上預訂越來越多,存在併發訪問量爆表的問題,慶幸的是它一直在透過技術手段解決這個問題.
併發訪問與資料庫技術的演變簡單描述可能是:開始使用關聯式資料庫,如:Oracle,併發量大會掛;然後使用資料在記憶體做快取,如:memcached (因為讀寫記憶體要比讀寫硬碟快很多,可極大提升訪問效能),還是有效能問題;所有後來就乾脆使用雲端計算資料庫解決產品GemFire(充當一下國外新產品的小白鼠),不知道今年過年買票能否不掛?拭目以待!
但GemFire記憶體資料庫在資料儲存中並非簡單的字串,如:"123456";而是Java物件,所以它也是個物件資料庫,比如:我們在J2ME開發中使用的DB4o也是。學過J2EE持久層框架的人都知道,如: Hibernate; ibatis等,就是把關聯式資料庫中的每張表對映到記憶體中(ORM,表的欄位對應記憶體中Java物件的屬性),另外還有一個特點,Java物件中可以放更為複雜的物件結構(如:迭代物件,資料集合).再進行資料傳輸操作,就非常方便了,拋棄傳統關聯式資料庫操作概念.而GemFire記憶體資料庫支援更為強大的物件操作API,OQL(Object Query Language)
那什麼是OQL?百度就簡單幾句話,大家很難理解:
http://baike.baidu.com/view/2554236.htm?fr=aladdin
這裡舉個例子就清晰了:它類似SQL
如,sql查詢表user的欄位name為test的資料,sql語句是:
sql ="select * from where name ='test' ";
而oql可能就是這樣:
oql=" select referrers(u) from xxx.xxx.User u where u.name = 'test' ";
這裡簡單解釋一下語法及語義:xxx.xxx為物件包路徑,在返回引用物件xxx.xxx.User中name物件為test的引用物件。是不是更為強大?OQL還有更多更為強大的API.
而形成的新漏洞型別對比SQL隱碼攻擊漏洞就更好理解了,sql注入是外部引數汙染sql語句,OQL注入是外部引數汙染oql語句。這裡更要命的是oql語句是支援java程式碼語義及語法解析的(可以理解為我們之前熟悉的OGNL表示式注入),所以這個漏洞型別為:OQL注入漏洞(Object Injection),最大的利用就是遠端程式碼執行,最大危害就是執行系統命令了。
0x02 例項分析
說了這麼多,大家肯定會說給個例子吧,別光YY! 我們知道學習技術也是要成本的,GemFire記憶體資料庫,對於我這樣的窮人現在是用不起的!但不影響我們去學習OQL這門物件查詢語言。
它其實就在我們的JDK中:
首先,我們啟動任何一個Java程式,我這裡是個Tomcat,再找到它的PID,如圖:
然後使用jmap命令生成堆轉儲快照,如圖:
然後使用堆分析命令jhat,它是個http服務,預設埠7000,如圖:
我們就可以使用瀏覽器檢視堆資訊了,它還提供我們前面需要的OQL查詢功能,如圖:
查詢長度大於100的字串:
Java程式碼執行系統命令也不需要老外說的那麼複雜,還使用反射?(當然,看語句拼接情況):
未來使用物件資料庫會越來越多,而漏洞型別已經不是我們之前熟悉的SQL隱碼攻擊漏洞了,而是OQL注入,危害就更為嚴重了(不僅限於Java)。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!