周杰伦价值300万的NFT被偷了!
4月1号愚人节这一天,NFT圈子里最大的热点就是周杰伦持有的BAYC#3738被偷走了,按照当前价格该NFT价值320万。
被偷到的方式是通过散步钓鱼网站诱导用户去进行mint,BAYC的Discord被黑导致钓鱼网站被大量扩散,除了BAYC当天Doodles的Discord也被黑了,一天连着两大蓝筹项目都出了事。
在外行都在看热闹的时候,我们的公众号致力于让大家成为web3的内行,那自然要刨析刨析到底被偷的过程是怎么样的,从而提升大家的防范意识,其实在之前的文章怎么通过看懂etherscan了解NFT项目情况?中我已经提过了,一定要小心 set approval for all这个方法,这次周杰伦就是栽倒在了这里。
如下图,我们在etherscan中可以看到周杰伦稀里糊涂的进行了一堆set approval for all操作,然后被进行了 safe transfer from操作转移到了另一个地址。
set approval for all是干嘛的呢?授权某个人拥有权限将你的collection中的NFT转移出去,所以只要你进行了授权,被授权人就犹如拿到了你家门的钥匙可以随意进出搬走你家的冰箱电视机,你在交易平台如opensea进行挂单就相当于是授权了opensea具有将你的NFT转移给其他人的权限,当别人购买后,opensea就会把你的NFT转移给他,然后将他的钱转给你,opensea好歹是一个正规平台,但是如果你一旦被钓鱼网站上钩,那就哭吧。
所以我们来开发一个钓鱼网站吧!注意!本教程只帮助大家来更深刻的理解NFT被偷的过程从而避免被偷,请勿将此教程应用于实际来损害他人利益!
思路为我们先开发一个长的和BAYC很像的钓鱼网站,用户钱包登录后,页面有个按钮叫free mint,实际上用户点击这个按钮后执行的是set approval for all,当用户授权后,我们就可以去他们家搬走冰箱电视机了。
首先我们先写一个假网页如上图所示,然后需要将该网页与BAYC的合约进行交互,我们要得到合约的地址与ABI(包含了该合约全部的接口函数)将其写入我们的网站就可以与合约进行交互。
打开BAYC的etherscan即可获得其合约地址与ABI。
将它们复制粘贴引入代码中,这里需要用到web3.js一个前端与智能合约交互的框架,具体的写代码过程我就不再赘述大家可以自己研究,这里只描述流程。
然后我们将free mint按钮绑定一个触发事件为setApprovalForAll。
然后定义该函数,调用BAYC合约中的setApprovalForAll接口,并传入两个参数,分别为你自己的地址和true,它代表着如果周杰伦点击了该按钮并同意执行,则授权给了你的地址可以将他的NFT转移走。
然后我们点击网站上的free mint按钮,可见小狐狸钱包弹出了交易请求,交易方法为set approval for all,这时候如果我点击确定则意味着上钩了我的NFT可以被其他人转移走,当然大家可以看到我的余额不足以支付这一笔交易….贫穷使我避免上当受骗,假设这时候是周杰伦不差钱闭眼点了确定那就可以转走他的NFT了。
因为我并不真实持有BAYC,所以为了给大家继续演示后续的路径,我在测试网部署一套合约从而继续模拟被盗过程。
首先可以看到周杰伦这时候持有3个NFT。
然后周杰伦在钓鱼网站中误触了steApprovalForAll,其中operator写的是我的地址。
以上两步就是刚才演示的在钓鱼网站中进行的过程,接下来我获取到了周杰伦steApprovalForAll的权限,我就可以将他的BAYC转移走。
我执行safeTransferFrom函数,from地址填写周杰伦,to地址填写张三,tokenid填写2,意味着我帮助周杰伦将编号为2的NFT转移给了张三,至于我为什么有这个权限是因为刚才周杰伦已经给我进行了授权。
执行完成后我们再检查一下周杰伦的余额发现少了一个NFT只剩2个了。
可以查到刚才转移出去编号为2的BYAC已经属于张三了,至此周杰伦痛失300万。
以上就是昨天周杰伦被偷的全过程为大家复现了一遍,所以其实搞一个钓鱼网站不难,我曾经在刚开始玩NFT的时候,进入某个discord时会有人伪装成管理员给我丢一个链接,说是官方mint地址,当时我也傻傻的进去,不过那时候穷没钱mint,web3领域因为去中心化使得骗术很多,之前的文章也专门讲到我是怎么让V神给我转了一个NFT的?。
再次提示,本文仅用作科普警醒大家防止上当受骗,请勿进行任何违反法律道德的行为。