Willekeurige bestandsverwijdering (Arbitrary File Deletion) is een specifieke en zeer schadelijke kwetsbaarheid die optreet wanneer een applicatie gebruikersinvoer gebruikt om een bestandspad te specificeren dat van de server gewist moet worden, zonder dit pad te valideren. Binnen WordPress-thema's komt dit risico soms voor in functies voor het opschonen van tijdelijke bestanden of het verwijderen van door klanten geüploade media. Dit lek kan door hackers worden misbruikt om vitale systeembestanden (zoals .htaccess) te wissen, waardoor de site openbreekt voor verdere aanvallen.

Hoe Arbitrary File Deletion werkt

Stel dat een WooCommerce-thema een functie heeft waarmee klanten een geüpload logo voor een gepersonaliseerd product kunnen verwijderen als ze zich bedenken:

PHP
 
$file_to_delete = $_POST['logo_path'];
// ONVEILIG: Directe verwijdering zonder pad-controle
unlink(WP_CONTENT_DIR . '/uploads/logos/' . $file_to_delete);

Een aanvaller kan de parameter logo_path manipuleren met behulp van pad-traversatietekens (../): logo_path=../../../../.htaccess

Wanneer de functie unlink() wordt uitgevoerd, navigeert PHP buiten de uploads-map en verwijdert het centrale .htaccess bestand in de hoofdmap van uw website. Zodra de .htaccess is verdwenen, vervallen alle server-beveiligingsregels, worden verborgen mappen weer zichtbaar en kan de aanvaller bijvoorbeeld PHP-bestanden uitvoeren in mappen die voorheen strikt waren afgesloten. In extreme gevallen kan een hacker zelfs de wp-config.php wissen, waardoor WordPress denkt dat het om een nieuwe installatie gaat en de aanvaller de site opnieuw kan installeren en overnemen.

Hoe ontwikkelaars bestandsverwijdering beveiligen

Ontwikkelaars mogen gebruikers nooit directe invloed geven op het bestandspad dat aan de functie unlink() wordt doorgegeven.

  • Gebruik basename(): Dit verwijdert alle pad-informatie en isoleert de bestandsnaam.

  • Gebruik WordPress media-functies: Maak gebruik van wp_delete_attachment() in plaats van rauwe PHP unlink() functies.

PHP
 
// VEILIGE AANPAK
$filename = basename($_POST['logo_path']); // Verwijdert alle '../' tekens
$safe_path = WP_CONTENT_DIR . '/uploads/logos/' . $filename;

// Controleer of het bestand daadwerkelijk binnen de beoogde map staat
if (file_exists($safe_path) && strpos($safe_path, WP_CONTENT_DIR . '/uploads/logos/') === 0) {
    unlink($safe_path);
}

Advies voor site-beheerders

  • Monitor bestandswijzigingen: Gebruik beveiligingsplug-ins die de integriteit van kritieke bestanden (zoals .htaccess en wp-config.php) bewaken en direct alarm slaan als deze bestanden plotseling worden gewijzigd of verwijderd.

  • Strikte servermachtigingen: Zorg ervoor dat de wp-config.php op serverniveau is ingesteld op alleen-lezen (400 of 440), zodat zelfs de webserver zelf het bestand niet zomaar kan verwijderen of overschrijven via een scriptfout.