<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/4115

            0x00 前言


            前幾天,有幾個屌絲高帥富給我看一個這樣的漏洞類型:

            地址:http://blog.emaze.net/2014/11/gemfire-from-oqli-to-rce-through.html

            GemFire內存數據庫是來自云計算公司Pivotal(未來我最看好的云計算產品提供商,由EMC、VMware、通用電氣這三家公司合資等方式組成,這里有我們熟悉Spring技術團隊支撐的就是這家公司云計算前端開發框架)的產品.

            0x01 內存數據庫基礎


            那什么是內存數據庫,為什么需要它?給大家舉個簡單的例子:

            在百度中搜索: GemFire,排在第5位的結果就是我們的答案

            enter image description here

            我們知道中國是個人口大國,由于地域經濟差異大,外出打工掙錢的人特別多.逢年過節買火車票一直有個頭痛的問題,就是關鍵時候這個網站就打不開了.無論它體驗及性能有多爛,我們還是要去上它,因為要回家(這是剛需),隨著國人網上預訂越來越多,存在并發訪問量爆表的問題,慶幸的是它一直在通過技術手段解決這個問題.

            并發訪問與數據庫技術的演變簡單描述可能是:開始使用關系數據庫,如: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,如圖:

            enter image description here

            然后使用jmap命令生成堆轉儲快照,如圖:

            enter image description here

            然后使用堆分析命令jhat,它是個http服務,默認端口7000,如圖:

            enter image description here

            我們就可以使用瀏覽器查看堆信息了,它還提供我們前面需要的OQL查詢功能,如圖:

            enter image description here

            查詢長度大于100的字符串:

            enter image description here

            Java代碼執行系統命令也不需要老外說的那么復雜,還使用反射?(當然,看語句拼接情況):

            enter image description here

            enter image description here

            未來使用對象數據庫會越來越多,而漏洞類型已經不是我們之前熟悉的SQL注入漏洞了,而是OQL注入,危害就更為嚴重了(不僅限于Java)。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线