访问私人数据| 破解 Solidity

访问私人数据| 破解 Solidity

639025b59c2cdd89b411a3758f109201.jpg

在开始之前,我们需要了解状态变量是如何通过SLOTS以稳定方式存储的。

Slot System

Solidity通过槽存储合约中定义的变量。

b22bb3b710ddb724f307a8fd8682a943.jpg 访问说明符(私有)

当为基于区块链的应用程序(dApps)编写代码时,你可以定义一个变量为公共或私有。定义私有变量的目的是防止其他合约修改它。但是,区块链应该是透明的,这意味着不管变量是私有的还是公共的,每个人都可以读取它。因此,存储像密码这样的敏感信息是一个非常糟糕的主意。

通过例子来理解

Vault Contract定义了各种各样的变量,但最有趣的是bytes32密码,存储id和密码的 struct Users数组。

630877d66bd8c60dc934a1bf608f6e0f.jpg

addUsers函数将其他用户推送到Users结构数组中。

c990d074da3c65df003c008ad27d3fae.jpg

合约已经部署在Ropsten TestNet地址:0x3505a02BCDFbb225988161a95528bfDb279faD6b

让我们使用truffle 来学习如何与插槽交互,并最终提取密码。

Truffle Demo

让我们连接到Ropsten并初始化到我们拥有的合约地址。

8b61fb3dc0e969e003f3e8311f4f61e7.jpg truffle — 连接到Ropsten

如果你正在查看上面的合约,我已经标记了哪些变量存储在哪些槽中。

//Syntax to access the data stored in the slots web3.eth.getStorageAt(contractAddress, slotIndex, console.log)

在下面的例子中,我们读取slotIndex=0的数据,然后将十六进制转换为十进制。

4bb55c6d2d837e0f3d6ae6eeb119276c.jpg

在本例中,我们试图读取slotIndex=2的内容,即密码变量。输出为bytes32,可以通过web3.utils.toAscii\转换为Ascii码。

b288def2997b1b9255be61a046cd5090.jpg 读取私有bytes32密码变量

最后,读取用户id和密码。第一个getStorageAt调用输出数组长度。soliditySha3返回第一个数组元素存储的哈希值。

访问下一个存储项。我们需要将哈希值增加1。因此,3f - >40。

f964d25b9c3f94f17a3774001eeac5c2.jpg 读取struct Users数组中的数据

解决方案

区块链在设计上是透明的,所以不要将敏感信息存储在区块链上。

Source:https://zuhaibmd.medium.com/accessing-private-data-hack-solidity-4-f94d479432c7

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

Layer 2道友 - 欢迎对Layer 2感兴趣的区块链技术爱好者、研究分析人与Gavin(微信: chinadefi)联系,共同探讨Layer 2带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”

本文首发于:https://mp.weixin.qq.com/s/6yvpWR_qn_T0VFOhgJn0-Q

点赞 0
收藏 2
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ChinaDeFi 去中心化金融社区
ChinaDeFi 去中心化金融社区
ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。