访问私人数据| 破解 Solidity
source link: https://learnblockchain.cn/article/3417
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
访问私人数据| 破解 Solidity
访问私人数据| 破解 Solidity
在开始之前,我们需要了解状态变量是如何通过SLOTS以稳定方式存储的。
Slot System
Solidity通过槽存储合约中定义的变量。
访问说明符(私有)
当为基于区块链的应用程序(dApps)编写代码时,你可以定义一个变量为公共或私有。定义私有变量的目的是防止其他合约修改它。但是,区块链应该是透明的,这意味着不管变量是私有的还是公共的,每个人都可以读取它。因此,存储像密码这样的敏感信息是一个非常糟糕的主意。
通过例子来理解
Vault Contract定义了各种各样的变量,但最有趣的是bytes32密码,存储id和密码的 struct Users数组。
addUsers函数将其他用户推送到Users结构数组中。
合约已经部署在Ropsten TestNet地址:0x3505a02BCDFbb225988161a95528bfDb279faD6b
让我们使用truffle 来学习如何与插槽交互,并最终提取密码。
Truffle Demo
让我们连接到Ropsten并初始化到我们拥有的合约地址。
truffle — 连接到Ropsten
如果你正在查看上面的合约,我已经标记了哪些变量存储在哪些槽中。
//Syntax to access the data stored in the slots web3.eth.getStorageAt(contractAddress, slotIndex, console.log)
在下面的例子中,我们读取slotIndex=0的数据,然后将十六进制转换为十进制。
在本例中,我们试图读取slotIndex=2的内容,即密码变量。输出为bytes32,可以通过web3.utils.toAscii\转换为Ascii码。
读取私有bytes32密码变量
最后,读取用户id和密码。第一个getStorageAt调用输出数组长度。soliditySha3返回第一个数组元素存储的哈希值。
访问下一个存储项。我们需要将哈希值增加1。因此,3f - >40。
读取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带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区” 。
- 发表于 1天前
- 阅读 ( 68 )
- 学分 ( 0 )
- 分类:Solidity
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK