合约代码:
https://arbiscan.io/address/0x812cda2181ed7c45a35a691e0c85e231d218e273#code
攻击交易:
https://arbiscan.io/tx/0x57dc8e6a28efa28ac4a3ef50105b73f45d56615d4a6c142463b6372741db2a2b
在合约TreasureMarketplaceBuyer中
函数
function buyItem(
address _nftAddress,
uint256 _tokenId,
address _owner,
uint256 _quantity,
uint256 _pricePerItem
) external {
(, uint256 pricePerItem,) = marketplace.listings(_nftAddress, _tokenId, _owner);
require(pricePerItem == _pricePerItem, "pricePerItem changed!");
uint256 totalPrice = _pricePerItem * _quantity;
IERC20(marketplace.paymentToken()).safeTransferFrom(msg.sender, address(this), totalPrice);
IERC20(marketplace.paymentToken()).safeApprove(address(marketplace), totalPrice);
marketplace.buyItem(_nftAddress, _tokenId, _owner, _quantity);
if (IERC165(_nftAddress).supportsInterface(INTERFACE_ID_ERC721)) {
IERC721(_nftAddress).safeTransferFrom(address(this), msg.sender, _tokenId);
} else {
IERC1155(_nftAddress).safeTransferFrom(address(this), msg.sender, _tokenId, _quantity, bytes(""));
}
}
在判断为721token默认代币数量为1,不管买入数量_quantity的设置。都会发送tokenid.如果买入数量为设置为0就会0成本买入Nft
该博客揭示了一个智能合约的安全漏洞,具体位于TreasureMarketplaceBuyer合约的buyItem函数。攻击者可以利用721token(ERC721)在价格验证不当时,以0成本购买NFT,无论指定的购买数量是多少。合约代码和攻击交易链接已提供,显示了当买入数量设为0时,攻击者能够不受限制地获取NFT。
893

被折叠的 条评论
为什么被折叠?



