重入攻击举例
与web2.0
中的重放攻击导致的逻辑漏洞类似,当用户向合约提现时,正常情况如下
-
用户向合约发起请求提现
-
合约检测该用户是否有足够的余额,有的话进行转账
-
转账成功,用户余额置为0
相信大家已经看出问题了:转账后才将用户的余额置为0,如果我们能做到像web2.0
一样在短时间内不断的发包,在置为0前不断的触发转账函数即可做到将大量的钱转走。因此,我们可以写一个恶意合约来完成我们的设想
思路
-
用户发起提现请求
-
合约检测用户余额,向用户提供的提现地址转账
-
通过向恶意合约转账。触发恶意
fallback()/recevie()
函数,该函数的内容为请求合约向合约转账。就此,陷入转账的循环,却一直没有到将用户余额置0的那行
/*
实例
预备阶段
bank
合约
contract Bank {
往银行先转个20eth
部署Attack合约
contract Attack {
开始攻击
因为Attack
合约中,构造函数已经初始化了Bank
,因此,直接传入Bank
地址创建该Attack
合约
目前该Attack
合约没有钱,调用attack
方法的时候记得转2eth
过去
调用attack
方法后,Attack
合约余额变为了22eth
,banck
余额为0