前幾天,有幾個屌絲高帥富給我看一個這樣的漏洞類型:
地址:http://blog.emaze.net/2014/11/gemfire-from-oqli-to-rce-through.html
GemFire內存數據庫是來自云計算公司Pivotal(未來我最看好的云計算產品提供商,由EMC、VMware、通用電氣這三家公司合資等方式組成,這里有我們熟悉Spring技術團隊支撐的就是這家公司云計算前端開發框架)的產品.
那什么是內存數據庫,為什么需要它?給大家舉個簡單的例子:
在百度中搜索: 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),最大的利用就是遠程代碼執行,最大危害就是執行系統命令了。
說了這么多,大家肯定會說給個例子吧,別光YY! 我們知道學習技術也是要成本的,GemFire內存數據庫,對于我這樣的窮人現在是用不起的!但不影響我們去學習OQL這門對象查詢語言。
它其實就在我們的JDK中:
首先,我們啟動任何一個Java程序,我這里是個Tomcat,再找到它的PID,如圖:
然后使用jmap命令生成堆轉儲快照,如圖:
然后使用堆分析命令jhat,它是個http服務,默認端口7000,如圖:
我們就可以使用瀏覽器查看堆信息了,它還提供我們前面需要的OQL查詢功能,如圖:
查詢長度大于100的字符串:
Java代碼執行系統命令也不需要老外說的那么復雜,還使用反射?(當然,看語句拼接情況):
未來使用對象數據庫會越來越多,而漏洞類型已經不是我們之前熟悉的SQL注入漏洞了,而是OQL注入,危害就更為嚴重了(不僅限于Java)。