Summary
any user just after verifying their charity address can mint unlimited nfts
Vulnerability Details
once user verified its charity by admin then user can send ether to its own charity can mint unlimited nfts
Impact
Tools Used
Manual
##POC
attacker register his own charity on charityRegistery
function registerCharity(address charity) public {
registeredCharities[charity] = true;
}
admin verify his charity contract
function verifyCharity(address charity) public {
require(msg.sender == admin, "Only admin can verify");
require(registeredCharities[charity], "Charity not registered");
verifiedCharities[charity] = true;
}
call donate function using own charity address
function donate(address charity) public payable {
require(registry.isVerified(charity), "Charity not verified");
(bool sent,) = charity.call{value: msg.value}("");
require(sent, "Failed to send Ether");
_mint(msg.sender, tokenCounter);
string memory uri = _createTokenURI(msg.sender, block.timestamp, msg.value);
_setTokenURI(tokenCounter, uri);
tokenCounter += 1;
}
Recommendations
function donate(address charity) public payable {
require(registry.isVerified(charity), "Charity not verified");
+ require(msg.sender != charity);
(bool sent,) = charity.call{value: msg.value}("");
require(sent, "Failed to send Ether");
_mint(msg.sender, tokenCounter);
// Create metadata for the tokenURI
string memory uri = _createTokenURI(msg.sender, block.timestamp, msg.value);
_setTokenURI(tokenCounter, uri);
tokenCounter += 1;
}