Hack Web3 Black or White

Hack Web3 Black or White

 

Online Study #1 Get POAP at the end.

 
原文地址:
 
Web3是一种新技术,据称它可以大大提高使用它的网站的安全性。事实上,web3是我们旧万维网的新版本,但这次是分布式的,基于区块链。Web3适用于区块链,加密货币和NFT。由于Web 3是一项新技术,因此公司没有为新的风险和安全问题做好准备,而赢家是能够预测和预防所有可能的安全问题的人。
由于web3应用程序每天有数百万美元处于危险之中,因此今天,一些Web3公司已经签署了一个漏洞赏金计划,并向白帽黑客支付费用以保护他们的业务。

概念:

去中心化金融(DeFi):

使用智能合约提供金融工具,而不依赖经纪公司或银行等中介机构。这些应用程序允许用户节省,借贷,放贷和交易,而无需任何费用(任何金融公司,如银行收到)。此外,这些应用程序非常快,任何人都可以在没有任何批准的情况下使用它们。这意味着任何地方只要有互联网连接的任何人都可以访问此金融服务。DeFi应用程序使用区块链,名为DApps的应用程序管理和处理交易。

去中心化应用程序 (DApp):

去中心化应用程序是分散式网络上的应用程序,它提供前端用户界面,并结合由以太坊开发和支持的智能合约。集中式应用程序使用一台计算机,但DApps在计算机的点对点网络上运行,并使用区块链进行数据存储。在以太坊上,智能合约是开源和透明的。

Web3 漏洞赏金 :

Web3漏洞赏金几乎是一个新话题,并且没有很多平台。但在2017年,一家名为Hacken的新网络安全咨询公司开始致力于为区块链安全提供网络安全服务。Hackenproof是Hacken集团的一部分。此外,Immunefi是一个很好的web3漏洞赏金平台,成立于2020年。Immunefi为白人黑客提供了最大的赏金,例如Immunefi中的单个程序(虫洞)为关键的智能合约错误提供10,000,000美元

基础:

在所有学科中,您都需要坚实的基础才能成为专家。例如,在一场赛车比赛中,想象你有一辆好车,但你不太了解道路或你的车的可能性,同时你的朋友有一辆普通的车,但他很了解路线,也知道他可以做些什么来加快速度,并通过他的车的能力更容易通过这条路。那么,猜猜谁赢了?是的,绝对是你的朋友。这意味着专业的Solidity开发人员知道关键功能在哪里实现,合同开发人员可能在哪里犯错误,但是一个不了解智能合约开发的黑客如何想要破解智能合约?这就是为什么我强烈建议您更多地了解区块链的原理,以太坊如何工作以及如何开发智能合约。首先,您需要知道区块链是什么,以及它是如何工作的,Blockchain Theory 101 Udemy课程和Elad Elrom的The Blockchain Developer是区块链基础知识的良好资源。由于所有智能合约和以太坊账户都位于以太坊虚拟机中,您应该知道这一点。Andreas Antonopoulos的《掌握以太坊》是一本关于以太坊如何运作的书。
编程是你应该学习的另一件重要事情。如您所知,所有以太坊去中心化应用程序(DApps)都有一个智能合约(通常由Solidity编写)和一个前端用户界面。您使用它的智能合约可能是由您或其他人编写的,因为在以太坊中的每个智能合约之前都提到它是开源的。
透明度和可访问性是Web3或DeFi的一个很好的特性,在Web 2.0中,一个小的开发团队编写代码,其他人看不到程序代码,但在Web3中,应用程序是在每个人的全视角下开发的。
最流行的智能合约语言是Solidity。这种语言是一种面向对象的高级语言,用于实现智能合约。如果你已经知道一门编程语言,学习Solidity对你来说非常容易,“Solidity by example”是学习Solidity的更好资源。编写智能合约的另一种流行语言是JavaScript。这种流行的语言适用于客户端和服务器端。“JavaScript: The Definitive Guide”一书是学习JavaScript的最佳方式。最流行的JavaScript web3库是web3.js和ethers.js。除了这两种语言,Viper和Rust也是智能合约的好语言。

Web3 中的漏洞 :

Web3 bug 不像 web2 bug,有很多区别。实际上,您可以在web3应用程序中找到web2错误,而不是在智能合约中。在web2中,我们使用CWE对漏洞进行分类,但在智能合约中,我们使用智能合约弱点分类(SWC)对问题进行分类。您可以在SWC注册表中找到智能合约弱点的完整列表。
在本文中,您将熟悉一些最流行的web3漏洞。

功能默认可见性 (SWC-100)

实际上,当开发人员忘记为函数设置正确的可见性并且恶意用户(黑客)能够进行未经授权或意外的状态更改时,会出现此问题。
pragma solidity ^0.4.24;
contractFunctionDefaultVisibility {
functionwithdrawWinnings() {
require(uint32(msg.sender) == 0);
     _sendWinnings();
   }
function_sendWinnings() {
     msg.sender.transfer(this.balance);
   }
}
如您所见,尚未设置任何功能可见性(私有、公共、内部等)。

不受保护的以太坊提款 (SWC-105)

由于缺少访问控制或访问控制不足,恶意方可以从合约中撤回所有以太币。此问题有时是由无意中公开 init 函数引起的。通过错误地命名一个旨在成为构造函数的函数,构造函数代码最终会出现在运行时字节代码中,并且任何人都可以调用它来重新初始化协定。

重新整合 (SWC-107)

在重入攻击中,恶意合约(攻击者合约)在函数的第一次调用完成之前回调调用合约。这可能会导致函数的不同调用以不良方式进行交互。
易受攻击的合约示例:
contract DepositFunds {
    mapping(address => uint) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal > 0);

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }


}
该漏洞来自用户请求的以太币数量。在这种情况下,攻击者调用该函数。即使他已经收到代币,他也可以转移代币,因为他的余额尚未设置为0。withdraw()
如何利用它们?
攻击者可以创建以下合约并利用重入漏洞:
contract Attack {
    DepositFunds public depositFunds;

    constructor(address _depositFundsAddress) {
        depositFunds = DepositFunds(_depositFundsAddress);
    }

    // Fallback is called when DepositFunds sends Ether to this contract.
    fallback() external payable {
        if (address(depositFunds).balance >= 1 ether) {
            depositFunds.withdraw();
        }
    }

    function attack() external payable {
        require(msg.value >= 1 ether);
        depositFunds.deposit{value: 1 ether}();
        depositFunds.withdraw();
    }


}

可塑性签名 (SWC-117)

通常,人们认为在以太坊合约中使用加密签名系统可以验证签名是唯一的,但是以太坊中的签名可以在没有私钥的情况下进行更改并保持有效。例如,椭圆密钥加密由三个变量组成:vr 和 s,如果以正确的方式修改这些值,则可以使用无效的私钥获取有效的签名。

写入任意位置 (SWC-124)

智能合约的数据永久存储在EVM级别的某个存储位置。合同负责确保只有授权用户或合同帐户才能写入敏感存储位置。
如果攻击者能够写入任意存储位置,则可以轻松绕过授权检查。它允许攻击者覆盖包含所有者地址的字段。
pragma solidity ^0.4.25;
contract Wallet {
  uint[] private bonusCodes;
  address private owner;  constructor() public {
        bonusCodes = new uint[](0);
        owner = msg.sender;
  }  function () public payable {
  }  function PushBonusCode(uint c) public {
        bonusCodes.push(c);
  }  function PopBonusCode() public {
        require(0 <= bonusCodes.length);
        bonusCodes.length--;
  }  function UpdateBonusCodeAt(uint idx, uint c) public {
        require(idx < bonusCodes.length);
        bonusCodes[idx] = c;
  }  function Destroy() public {
        require(msg.sender == owner);
        selfdestruct(msg.sender);
  }
}
如您所见,在第 4 行中声明了一个变量,其名称在第 26 行中,我们可以在此位置写入。bonusCodes

下一步

现在你已经对DeFi,DApp和Web3有足够的了解,我建议你更多地了解智能合约的弱点,这可能非常有帮助。如果你想让以太坊虚拟机测试智能合约的错误,CTF可以提供帮助。您可以练习所学到的课程,并更加熟悉Web3黑客攻击。Ethernaut游戏Capture the etherUnderableDefi是实践智能合约漏洞的最佳CTF。
这些CTF的解决方案可以在Hackernoon上找到,您可以通过以下标签solidity-hack找到。
此外,工具可以帮助您在狩猎过程中,通过自动化,您可以找到越来越多的错误。最好的web3黑客工具是:MythrilSuryaSethDAppTools
经过大量的练习和学习,你成为一个熟练的web3黑客,然后你可以登录到web3 bug赏金平台,选择一个程序并开始黑客攻击。当然,您可以在学习时将其作为练习,但是当您是专家时,去现有平台赚钱是件好事。

结论:

没有一项技术是完美的,安全性从来都不是100%的。要破解东西,你只需要开始学习,练习,练习和练习。
 
 
😜
Click to get POAP (Over)