当前位置:网站首页>智能合约安全——私有数据访问
智能合约安全——私有数据访问
2022-08-04 05:27:00 【chainpip】
这次我们将了解如何访问合约中的私有数据(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
运行结果:
这样我们就成功的将合约中的所有数据读取完成。
由此可见,合约中的私有数据也是可以读取的。
总结
大家可以看到,合约中的私有数据也是可以读取的,所以一定不要将任何敏感数据存放在合约中哦。
如果想了解更多的智能合约和区块链知识,欢迎到区块链交流社区CHAINPIP社区,一起交流学习~
边栏推荐
猜你喜欢
随机推荐
phpexcel导出数据为xml
Unity开发类似Profile那样的数据分析工具
记录获取参赛选手信息过程
7.15 Day21---MySQL----索引
PHP解决字符乱码问题(多种编码转换)
自动化运维工具Ansible(3)PlayBook
关于 for in与for of 的差别以及如何使用
跨域问题的解决
解决JDBC在web工程中无法获取配置文件
对象存储-分布式文件系统-MinIO-3:MinIo Client(mc)
显式调用类的构造函数(而不是用赋值构造),实现一个new操作
将两个DataTable合并——DataTable.Merge 方法
webrtc中视频采集实现分析(一) 采集及图像处理接口封装
进入古诗文网站个人中心,绕过登录
C language -- operator details
[原创]STL容器map和unordered_map性能,创建,插入,随机访问速度对比!
8.03 Day34---BaseMapper查询语句用法
Summary of MySQL database interview questions (2022 latest version)
4.1 JdbcTemplate for declarative transactions
7.18 Day23 - the markup language