some things
This commit is contained in:
@@ -85,9 +85,25 @@ contract AnotherPlease is ERC721Enumerable {
|
||||
|
||||
# Analyse
|
||||
|
||||
Ziel ist es alle 30 Tickets zu besitzen. Glücklicherweise kriegen wir die ersten 20 gratis, aber die letzten 10 sind teurer als wir es uns leisten können.
|
||||
Ziel ist es alle 30 Tickets zu besitzen. Glücklicherweise kriegen wir die ersten 10 gratis, aber die letzten 20 sind teurer als wir es uns leisten können.
|
||||
Die Methode ```claimFreeTicket``` prüft erst, ob noch gratis Tickets vorhanden sind, und sendet dann das Ticket und decrementiert dann den Counter. Und hier liegt die Schwachstelle:
|
||||
Der Angreifer Callt schnell hintereinander die ```claimFreeTicket``` Methode. Das Übertragen der Tickets via ```_safeMint``` dauert (vermutlich eine gewisse zeit in der alle 30 If-Abfragen positiv durchlaufen werden). Wenn der Counter heruntergesetzt wird, werden wir schon alle Tickets besitzen.
|
||||
Der Angreifer Callt schnell hintereinander die ```claimFreeTicket``` Methode. Das Übertragen der Tickets via ```_safeMint``` triggert vermutlich einen call auf uns, was uns erlaubt die methode erneut aufzurufen. Wenn der Counter heruntergesetzt wird, werden wir schon alle Tickets besitzen.
|
||||
|
||||
```
|
||||
_safeMint(address to, uint256 tokenId)
|
||||
internal
|
||||
|
||||
Safely mints tokenId and transfers it to to.
|
||||
|
||||
Requirements:
|
||||
|
||||
tokenId must not exist.
|
||||
|
||||
If to refers to a smart contract, it must implement IERC721Receiver.onERC721Received, which is called upon a safe transfer.
|
||||
|
||||
Emits a Transfer event.
|
||||
```
|
||||
|
||||
|
||||
# Lösung
|
||||
|
||||
|
||||
Reference in New Issue
Block a user