智能合约常见攻击方式

准备

普通攻击

fallback回退函数

合约可以有一个未命名函数,该函数不能有参数,也不能有返回值。fallback函数在以下情况会被调用:

  • 一个调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据)。由于Solidity中,Solidity提供了编译期检查,所以我们不能直接通过Solidity调用一个不存在的函数。但我们可以使用Solidity的提供的底层函数address.call来模拟这一行为,进行函数调用。
  • 合约收到以太币,没有任何数据(为接受以太币,fallback函数必须标记为payablefunction() payable public{},否则合约无法接收,如果通过转账函数transfer发送到没有定义payable的合约,会抛出错误,导致后面的代码无法执行!但如果有合约通过自毁selfdestruct(address)的方式发送,即使没有定义为payable都得收下!)。通过MetaMask的Send向合约地址转以太币触发(ethernaut环境下可通过集成函数contract.sendTransaction({value: 1})转以太币;通过address.call.gas(1000000).value(msg.value)();在合约中转以太币)。

构造函数

构造函数无法显式调用,但如果构造函数和contract名字不一致,就能被直接调用,solidity 0.4.22引入了关键词constructor来指定构造函数。

随机数预测

  • 使用区块变量block.coinbase/difficulty/gaslimit/number/timestamp,或基于过往块的哈希值block.blockhash(block.number – 1),由于区块变量在同一区块是共用的,通过攻击合约调用目标合约,即可实现预测
12345678910111213
contract CoinFlip {
  function flip(bool _guess) public returns (bool);
}
contract Attack {
  address _addr;
  constructor(address param) { _addr = param;}
  function guess() public{
    CoinFlip cf = CoinFlip(_addr); //new instance with address
    uint256 blockValue = uint256(block.blockhash(block.number-1)); //generate the same random value
    bool side = uint256(uint256(blockValue) / FACTOR) == 1;
    return cf.flip(side); //invoke method with instance
  }
}
  • 使用未来区块的区块哈希(使用上一次调用区块高度计算哈希值),由于EVM 能存储的区块哈希为最近的256条,超过的话置为 0。因此,如果第二次调用时,与第一次下注时的区块高度差超过了 256,那么此时的产生的区块哈希为0,此时伪随机数就变成可猜测的了
  • 使用私有的种子变量,将变量标记为私有只会阻止其他合约访问它,但是可以以链下的方式去获取链上的存储信息。如使用客户端的web3 API方法web3.eth.getStorageAt(addr, argument_index,callback),可以检索合约的存储
123
web3Provider = new Web3.providers.HttpProvider('https://ropsten.infura.io/'); //默认的web3必须带上callback回调函数
web3 = new Web3(web3Provider);
web3.eth.getStorageAt("0xad836dc9bc4fa0af947a27128edfa14459d77f19", 1, function(x, y) {大专栏  智能合约常见攻击方式pan class="nx">alert

时间: 2024-10-10 08:41:18

智能合约常见攻击方式的相关文章

全方位解读及介绍windows网络安全及常见攻击方式

本来我就是来逛逛论坛的,可是看到前面有位一样是干网络安全的同行,留下来过的痕迹,发了一篇相对不错的文章,我寻思咱既然来这一趟,也不能显得就比别人差啊.所以我也就写了这一片不算成熟小文章,望各位共勉之哈.1.网络安全的概念网络安全的定义:网络系统的硬件.软件和数据受到保护,不因偶然和恶意的原因而遭到破坏.更改和泄露,系统可以连续正常运行,网络服务不会终止. 1>.网络安全主要涉及3个方面: 硬件安全:即要保证网络设备的安全,如网络中的服务器.交换机.路由器等设备的安全. 软件和数据安全:即保证网络

第一行代码:以太坊(3)-使用更多的工具编写和测试智能合约

<第一行代码:以太坊>开始连载了 在上文中已经使用了Remix环境运行和测试了本书编写的第一个智能合约程序,不过编写和测试智能合约的测试方式很多,例如,在testrpc环境测试:在Intellij IDEA集成开发环境中用Solidity语言编写智能合约:在纯Web环境中测试智能合约:使用AJAX方式测试智能合约等.本文将详细介绍这些用于编写和测试智能合约的方法. 1.安装本地remix环境(Windows.Mac OS X和Linux) 在本节使用Remix环境运行和测试了Calc智能合约,

物联网智能硬件设备常见攻击方法

以太网接入型设备,一般分为网线或WiFi两种.不管是WiFi还是网线,可以通过局域网抓包.笔记本WiFi桥接抓包等等手段.最著名的抓包软件 Wireshark如何抓取硬件设备的网络数据包,考量的是网络知识基本功,需要大家自行度娘! 基本准备工作:1,Wireshark监听udp的53端口,一部分硬件设备会使用域名,连接服务器之前,需要首先进行域名解析,走的就是udp53端口,也有极少数可能走tcp532,通过桥接等手段,让硬件设备的任何数据包必须经过本机,Wireshark不设过滤器,通过抓到的

php网站常见的几种攻击方式(转)

针对 PHP 的网站主要存在下面几种攻击方式::1.命令注入(Command Injection)2.eval 注入(Eval Injection)3.客户端脚本攻击(Script Insertion)4.跨网站脚本攻击(Cross Site Scripting, XSS)5.SQL 注入攻击(SQL injection)6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7.Session 会话劫持(Session Hijacking)8.Sessio

WEB开发中一些常见的攻击方式及简单的防御方法

WEB开发中一些常见的攻击方式及简单的防御方法 20151127 转载http://www.lvtao.net/dev/582.html SQL注入最常见的攻击方式,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击. 跨站脚本攻击(XSS)跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取

常见的网站攻击方式和防护方法(小白通俗篇)

作为站长兢兢业业的编辑推广,辛辛苦苦才收点广告费,网站流量大了便会时常面对黑客的攻击,我的网站遭遇了两次因攻击死亡或瘫痪的经历,第一次是织梦CMS被博彩整站篡改网站死亡,第二次是刚刚经历的流量攻击网站多次瘫痪流量波动,故总结下常见的网站攻击方式和防护方法,以供自己和大家参见,因安全这方面我也是小白,这里以小白看得懂的语言分类编写,如总结有误或不足,望大神们不吝赐教. 第一种:网页篡改 攻击描述:针对网站程序漏洞,植入木马(webshell.跨站脚本攻击),篡改网页,添加黑链或者嵌入非本站信息,甚

网页前端常见的攻击方式和预防攻击的方法

常见攻击 XSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入的恶意html代码会被执行,从而达到恶意用户的特殊目的.XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性.但是随着前端技术的不断进步富客户端的应用越来越多,这方面的问题越来越受关注.举个简单例子 : 假如你现在是sns站点上一个用户,发布信息的功能存在漏洞可以执行js 你在 此刻输入一个 恶意脚本,那么当前所有看到你新信息的

智能合约如何可信的与外部世界交互

区块链应用中,外部世界如何与智能合约交互往往是一个容易被忽视的问题,很多的智能合约应用场景是根据一些外部事件,输出相应的结果,而传统的IT数据交互方式实际上并不能投入真正的工作.例如,按照农产品价格情况来支付投保人赔款的农产品价格险保单.传统IT人员一般认为是如下的流程:智能合约会在预定的时间,从期货交易场所获取农产品价格,然后按照获取的数据采取预设的行动.听起来很简单,但却不可能实现.为什么呢?因为这里存在两个问题,一是共识问题,二是受信任方问题. 一.共识问题 区块链是基于共识的系统,只有在

solidity编写智能合约(入门)

一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } } 在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成