Ga naar hoofdinhoud

File Upload — Impossible

Hoe beveilig je een uploaddienst dan wél tegen deze trucs?

1. Predict (Voorspel)

De server gooit het roer drastisch om. Alles wat binnenkomt wordt niet langer zomaar opgeslagen. Kijk naar de beschermingsmaatregelen:

// Genereer een veilige, totaal nieuwe naam, zonder originele extensies:
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

// Open de foto en herbouw hem compleet via de GD library!
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100 ); // Verwoest alle verstopte metadata/PHP code

// Gooi origineel direct weg
imagedestroy( $img );

Vraag: Hoe lossen het herbouwen (imagecreate) en het hernoemen de kwetsbaarheden op?

Antwoord
  • Hernoemen: Als de gebruiker het bestand origineel shell.php of ../shell.php had genoemd om gekke dingen uit te halen, verdwijnt die hele intentie. De server verzint nu zélf een willekeurige, unieke naam.
  • Herbouwen: Door de foto niet op te slaan, maar letterlijk in te laden in het virtuele geheugen en hem zélf als schone JPG pixels opnieuw op de harde schijf te schilderen, verdwijnt álle verstopte PHP code of metadata die hackers in de bestandslagen hadden verwerkt.

2. Run & Investigate

Start het lab.

Laden...

Kijk hoe de applicatie niet te kraken is en verwoestende beveiligingsniveaus op uploads loslaat.

3. ✓ Wat moest je zien?

Controle
  • Een gewone .php of valse JPG met verstopte code wordt geweigerd of opgeslagen onder een willekeurige hash-naam (zoals a1b2c3…d4.jpg).
  • Zelfs als je het bestand vindt en aanroept: het is door de GD-library opnieuw opgebouwd, dus alle PHP-code in metadata is weg.
  • De broncode toont md5(uniqid()) voor de bestandsnaam en imagecreatefromjpeg() + imagejpeg() voor het herbouwen — dát is de combinatie die je niet kraakt.

Krijg je tóch code-uitvoering werkend? Dan staat het level rechtsboven niet op Impossible.

Wat heb je geleerd?

  • Uploaden = Gecontroleerde uitvoering: Een shell uploaden leidt tot Remote Code Execution (RCE) op de server. Het is de hoofdprijs voor een aanvaller.
  • Vertrouw de extensie en MIME-types nooit: Deze worden meegestuurd door de client en zijn door een hacker altijd te vervalsen met de Developer Tools of andere HTTP-tools.
  • Validatie vs Mutatie: Alleen controleren (validatie) is onvoldoende gebleken. Je moet de input van de gebruiker fysiek transformeren (mutatie, zoals image processing) en afdwingen tot een voorspelbare opslag-naam.