智能合约安全 | 合约无效化攻击

news/2025/2/27 6:20:33

目录:

智能合约安全

   合约无效化攻击

   合约自毁函数 selfdestruct

   攻击实现

   漏洞防御

   总结

智能合约安全

合约无效化攻击

合约无效化攻击类同于web安全中的逻辑漏洞中的一种 我们这里拿一个典型的例子来讲解 有这样一份智能合约, 每个人可以向其中发送1 eth 第七个发送的人可以获取全部的7 eth 我们按照这个功能去编写代码​​​​​​​

​​contract Games { function play() public payable { require(msg.value == 1 ether); if (address(this).balance == 7 * 10 ** 18) { // 当此人发送的是本轮中第七次eth, 则获得全部奖励 msg.sender.call{value:7 ether}(""); } }}

阅读代码, 乍一看好像没什么问题 require保证了每人每次只能发送1eth 功能也可以正常实现

合约自毁函数 selfdestruct

接下来就要引入一个关于 合约自毁 的概念:合约部署之后, 假设我们发现了bug, 需要更改,智能合约不像传统的服务器那样, 传统的服务器可以直接关停服务,甚至热更新(在不停止服务的情况下更改服务器代码),在区块链上的代码我们是无法更改的。那么假设我们的某个服务存在类似于”支付漏洞”的漏洞,我们必须要停止掉这个智能合约,这时候就需要用到合约自毁函数,函数签名 selfdestruct(address payable); 该函数接收一个可支付地址作为参数,函数会销毁该智能合约的部署,并将此时合约中存在的余额强制转给指定的地址

攻击实现

那么这个漏洞就很清楚了 只需要我们部署一个智能合约 并使用自毁函数强制转账 8 eth 给上述合约 由于上述合约中的 if(address(this.balance == 7 ether)), 这个条件永远不会被满足 该合约也就失去了作用

攻击代码如下​​​​​​​

contract Attack { function draw() public payable {} // 用来存eth, 方便测试 function over(address addr) public { selfdestruct(payable(addr)); }}

先转账8eth到攻击合约中

图片

然后在将目标合约的地址传给over函数调用

图片

可以看到目标合约中的eth已经变成了8 这时候无论怎样向该合约传入eth 都已经无效了


漏洞防御

作为一名攻击者, 可能会觉得这种类型的攻击可能有些”鸡肋” 换一个角度, 如果你作为一名开发者, 一定是不希望这种事情的发生的 防御的话, 我们可以专门设置一个值, 只有在每次函数被调用时 才会增加, 判断的依据也使用这个值来判断​​​​​​​

contract Games { uint blance = 0; function play() public payable { require(msg.value == 1 ether); blance += 1; if (blance == 7) { // 当此人发送的是本轮中第七次eth, 则获得全部奖励 msg.sender.call{value:7 ether}(""); } }}

总结

本篇主要引入 自毁函数 在攻击上的一些可能点, 其核心还是代码逻辑漏洞, 另外, 本篇中的漏洞代码也可以使用回滚攻击去”耍赖”, 感兴趣的同学可以自行尝试.

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关     


http://www.niftyadmin.cn/n/5869632.html

相关文章

vue测试:单元测试、组件测试、端到端测试

1、单元测试:单元测试通常适用于独立的业务逻辑、组件、类、模块或函数,不涉及 UI 渲染、网络请求或其他环境问题。 describe(increment, () > {// 测试用例 }) toBe():用于严格相等比较(),适用于原始类…

win11本地部署deepseek大模型(安装ollama+docker+open-webui)最终实现自己的项目可通过API调用投喂数据后的模型

硬件配置:笔记本win11,内存32G,CPU锐龙7 ,无独显;只能考虑deepseek-r1:1.5b模型。 第一步:安装Ollama 此处不过多累赘了,https://ollama.com/官网选择对应的系统版本下载即可。 需要注意的是…

前端关于Cursor编辑器的了解与深度使用及对工作的便利

1. 什么是 Cursor 编辑器? Cursor 是一款基于 AI 的现代代码编辑器,类似于 VS Code,但内置了强大的 AI 功能。它的核心目标是帮助开发者更快、更智能地编写代码。 主要特点: AI 驱动的代码补全:提供上下文相关的智能代码建议。代码生成与修复:通过自然语言描述生成代码…

(功能测试)第五章 APP性能测试 常用的APP命令格式 补充与总结

app性能测试 solopi 工具监控性能数据 实时监控所选项的各类数据的变化 性能测试就是记录性能数据 从而去分析是否是存在有异常 使用工具去监控数据 查看录制数据 可以持续使用两个小时去查看性能的使用情况 重点是对拿到的数据去进行分析 内存数据查看 性能指标有如下内容&a…

react 中,使用antd layout布局中的sider 做sider的展开和收起功能

一 话不多说,先展示效果: 展开时: 收起时: 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…

安装react报错

安装react报错 背景 执行命令npx create-react-app my-app,然后出现报错unable to resolve dependency tree 解决: 出现这个报错是因为依赖包版本出现冲突,查看package.json可以看到react版本是19.0.0,但是testing-library/rea…

理解梯度消失与梯度爆炸及其缓解策略

目录 理解梯度消失与梯度爆炸及其缓解策略 一、梯度消失与梯度爆炸的概念 1. 梯度消失 2. 梯度爆炸 二、缓解梯度消失与爆炸的策略 1. 改进权重初始化 2. 选择合适的激活函数 3. 使用归一化技术 4. 梯度裁剪(Gradient Clipping) 5. 结构设计改…

NLP07-朴素贝叶斯问句分类之数据集加载(1/3)

一、概述 数据集加载(Dataset Loading)是机器学习、自然语言处理(NLP)等领域中的一个重要步骤,指的是将外部数据(如文件、数据库、网络接口等)加载到程序中,以便进行后续处理、分析…