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:
$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 PHPunlink()functies.
// 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
.htaccessenwp-config.php) bewaken en direct alarm slaan als deze bestanden plotseling worden gewijzigd of verwijderd. -
Strikte servermachtigingen: Zorg ervoor dat de
wp-config.phpop serverniveau is ingesteld op alleen-lezen (400of440), zodat zelfs de webserver zelf het bestand niet zomaar kan verwijderen of overschrijven via een scriptfout.
