前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >智能合约安全——私有数据访问

智能合约安全——私有数据访问

原创
作者头像
fingernft
发布2022-07-30 11:08:19
4980
发布2022-07-30 11:08:19
举报
文章被收录于专栏:nft市场

这次我们将了解如何访问合约中的私有数据(private 数据)。

目标合约

话不多说,直接上代码

这次我们的目标合约是部署在 Ropsten 上的一个合约。

合约地址:

0x3505a02BCDFbb225988161a95528bfDb279faD6b

链接:

https://ropsten.etherscan.io/address/0x3505a02BCDFbb225988161a95528bfDb279faD6b#code

漏洞分析

由上面的合约代码我们可以看到,Vault 合约将用户的用户名和密码这样的敏感数据记录在了合约中,我们知道合约中修饰变量的关键字仅限制其调用范围,这也就间接证明了合约中的数据均是公开的,可任意读取的,将敏感数据记录在合约中是不安全的。

读取数据

首先,让我们来学习一下solidity的 storage存储方式:

1)storage 中的数据被永久存储。其以键值对的形式存储在 slot 插槽中。

2)storage在插槽中数据从右向左排列,空间不足时,打包当前插槽,开启下一个插槽存储数据;存储定长数组(长度固定)时,数组中每一个数据占据一个插槽。

3)存储变长数组(长度随元素的数量而改变)比较特殊,在遇到变长数组时,会先启用一个新的插槽 slotA 用来存储数组的长度,其数据存储在另外的编号为 slotV 的插槽中。

slotA 表示变长数组声明的位置,同时也存储着变长数组的长度length:

length = sload(slotA)

用slotV表示变长数组数据存储的位置(即key),index 表示 value 对应的索引下标:

slotV = keccak256(slotA) + index

用 value 表示变长数组某个数据的值:

value = sload(slotV)

下面我们就带大家来读取这个合约中的数据。

首先我们先看 slot0 中的数据:

由合约中可以看到 slot0 中只存储了一个 uint 类型的数据,我们读取出来看一下:

我这里使用 Web3.py 取得数据,首先写好程序

运行结果:

“7b”是16进制数,转换成10进制数就是123。

这里我们就成功的去到了合约中的第一个插槽 slot0 中存储的 uint 类型的变量 count=123 ,下面我们继续:

slot1 中存储三个变量:u16, isTrue, owner

运行结果:

从右往左依次为

owner = f36467c4e023c355026066b8dc51456e7b791d99

isTrue = 01 = true

u16 = 1f = 31

slot2 中就存储着私有变量 password 我们读取看看

运行结果:

slot 3, 4, 5 中存储着定长数组中的三个元素

运行结果:

slot6 中存储着变长数组的长度

运行结果:

返回的结果显示变长数组的长度为3。

我们从合约代码中可以看到用户的 id 和 password 是由键值对的形式存储的,下面我们来读取两个用户的 id 和 password:

user1

运行结果:

user2

运行结果:

这样我们就成功的将合约中的所有数据读取完成。

由此可见,合约中的私有数据也是可以读取的

总结

大家可以看到,合约中的私有数据也是可以读取的,所以一定不要将任何敏感数据存放在合约中哦。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目标合约
  • 漏洞分析
  • 读取数据
  • 总结
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档