专栏首页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 删除。

登录 后参与评论
0 条评论

相关文章

  • 智能合约安全审计之路-访问控制漏洞

    核心问题:publi c的恶意使用(本次案例合约为例) ) )

    字节脉搏实验室
  • 智能合约:访问控制缺陷

    访问控制缺陷是因为编写 solidity 智能合约的时候,对于某些判断的定义不严谨或者笔误,导致的某些敏感功能的访问验证被绕过问题。攻击者可以恶意使用某些敏感功...

    yichen
  • 智能合约安全——重入漏洞

    众所周知,以太坊的转账不仅可以在钱包地址之间进行,合约与钱包地址之间、合约与合约之间也可以,而合约在接收到转账的时候会触发 fallback 函数执行相应的逻辑...

    fingernft
  • 智能合约安全——selfdestruct攻击

    selfdestruct函数(自毁函数)由以太坊智能合约提供,用于销毁区块链上的合约系统。当合约执行自毁操作时,合约账户上剩余的以太币会发送给指定的目标,然后其...

    fingernft
  • 智能合约安全性

    以太坊智能合约是极为灵活的。它能够存储超过非常大量的虚拟货币(超过十亿美元),并且根据先前部署的智能合约运行不可修改的代码。 虽然这创造了一个充满活力和创造性的...

    fingernft
  • 智能合约安全——delegatecall (1)

    在之前的内容中,学习到了storage中是使用插槽存储数据的。而delegatecall函数有个有趣的特点:当使用 delegatecall 函数进行外部调用涉...

    fingernft
  • 智能合约安全——溢出漏洞

    算术溢出(arithmetic overflow)或简称为溢出(overflow)分为两种:上溢和下溢。所谓上溢是指在运行单项数值计算时,当计算产生出来的结果非...

    fingernft
  • 智能合约安全——delegatecall (2)

    这次的攻击目标依然是获得 HackMe 合约中的 owner 权限,我们可以看到两个合约中除了 HackMe 合约中的构造函数可以修改合约的 owner 其他地...

    fingernft
  • 在以太坊私有链上部署智能合约

    上节简单介绍了基于以太坊搭建私有链以及挖矿和交易,在部署智能合约之前请确保私有链上的账户有余额,因为部署智能合约需要消耗 Gas ,而 Gas 需要 ether...

    字节流动
  • 智能合约安全——随机数

    智能合约的开发中常常会用到随机数,例如 Lottery 和现在流行的 NFT 数字藏品的属性等都需要用到随机数。目前来说常见的随机数获取有两种:使用区块变量生成...

    fingernft
  • 智能合约安全之笔误安全问题

    当已定义操作的意图是将一个数字与变量求和(+=),但意外地使用了错误的操作(=+)就会出现笔误,而这恰好是有效的操作符,这不是计算总和,而是再次初始化变量,一元...

    Al1ex
  • 联盟链智能合约安全浅析

    随着区块链技术的发展,越来越多的个人及企业也开始关注区块链,而和区块链联系最为紧密的,恐怕就是金融行业了。然而虽然比特币区块链大受热捧,但毕竟比特币区块链是属于...

    Seebug漏洞平台
  • 智能合约安全审计之路-条件竞争

    描叙:程序在运行过程中,因为多个事件的次序异常而造成对同一系统资源的竞争访问,可能导致程序运行出错。

    字节脉搏实验室
  • 智能合约安全审计之路-重入攻击

    描述:漏洞合约中某个函数中,使用call()方法发送eth,若eth的接收者为一个合约地址,则会触发该合约的fallback()函数。若该合约是攻击者的恶意合约...

    字节脉搏实验室
  • Solidity开发的智能合约安全建议

    调用不受信任的外部合约可能会引发一系列意外的风险和错误。外部调用可能在其合约和它所依赖的其他合约内执行恶意代码。因此,每一个外部调用都会有潜在的安全威胁,尽可能...

    rectinajh
  • 智能合约安全之算术精度问题

    Solidity作为一门编程语言也具备和普通编程语言相似的数据结构设计,比如:变量、常量、函数、数组、函数、结构体等等。

    Al1ex
  • 101项智能合约安全检查清单

    "清单宣言.如何把事情做对[4] "是Atul Gawande[5]的一本书,他是著名的外科医生、作家和公共卫生领袖。马尔科姆-格拉德威尔[6]在对这本书的评论...

    Tiny熊
  • 智能合约安全审计之路-随机误用漏洞

    智能合约开发中,在程序中使用随机数较好的伪随机数是很难的。很多看似无法被预言的随机数种子或变量,实际被预言的难度很低。

    字节脉搏实验室
  • 智能合约安全审计之路-整数溢出漏洞

    描述:变量在参与运算的过程中,运算结果超出了变量类型所能表示的范围,导致实际存储的计算结果出错

    Gcow安全团队

扫码关注腾讯云开发者

领取腾讯云代金券