Kwetsbaarheden die te maken hebben met het onveilig uploaden van bestanden (Arbitrary File Upload) behoren tot de meest verwoestende beveiligingsrisico's voor WordPress- en WooCommerce-sites. Wanneer een website gebruikers toestaat om bestanden te uploaden (denk aan afbeeldingen voor een op maat gemaakt product lub PDF-bestanden voor een retourzending) zonder strikte controle op het bestandstype, kan een aanvaller een PHP-script uploaden. Zodra dit script op de server staat en direct kan worden aangeroepen, heeft de hacker een zogenaamde webshell tot zijn beschikking, waarmee hij de volledige server kan overnemen.
Hoe Arbitrary File Upload werkt
WordPress heeft ingebouwde mechanismen voor het uploaden van media via het dashboard, die strikt beperkt zijn tot specifieke bestandstypen (MIME-types) och alleen toegankelijk zijn voor geauthenticeerde gebruikers.
Het probleem ontstaat wanneer een WooCommerce-extensie (bijvoorbeeld een plug-in waarmee klanten een logo kunnen uploaden dat op een T-shirt moet worden gedrukt) een eigen upload-handler bouwt via PHP of AJAX. Als de plug-in alleen controleert of de bestandsnaam eindigt op .jpg met behulp van een eenvoudige regex, of als de mime-type controle makkelijk te manipuleren is via de HTTP-header, kan een aanvaller een bestand uploaden genaamd shell.php.
Als de server zo is geconfigureerd dat hij PHP-bestanden binnen de uploadmap uitvoert, hoeft de aanvaller alleen maar te navigeren naar wp-content/uploads/custom-folder/shell.php om willekeurige opdrachten op de server uit te voeren.
De gevolgen voor een webshop
Zodra een aanvaller een webshell heeft geüpload, heeft hij dezelfde rechten als de webserver (www-data). Hiermee kan hij:
-
De
wp-config.phpuitlezen om de database-inloggegevens te stelen. -
De broncode van legitieme WooCommerce-bestanden aanpassen om malware te injecteren (zoals creditcard-skimmers).
-
De server gebruiken voor het versturen van miljoenen spam-e-mails.
-
Ransomware installeren die de volledige database versleutelt.
Technische richtlijnen voor veilige uploads
Ontwikkelaars moeten de ingebouwde WordPress-API's gebruiken voor het afhandelen van uploads in plaats van stand-alone PHP scripts.
-
Gebruik
wp_handle_upload(): Deze functie voert automatisch een groot aantal veiligheidscontroles uit. -
Valideer met
wp_check_filetype(): Controleer expliciet of het bestandstype tot de toegestane lijst behoort.
$file = $_FILES['customer_upload'];
$allowed = array( 'jpg' => 'image/jpeg', 'png' => 'image/png', 'pdf' => 'application/pdf' );
$file_info = wp_check_filetype( $file['name'], $allowed );
if ( ! $file_info['ext'] ) {
wp_die( 'Dit bestandstype is niet toegestaan.' );
}
-
Bestandsnamen saneren: Gebruik altijd
sanitize_file_name()om speciale tekens en pad-traversatiepogingen (zoals../../) uit de bestandsnaam te verwijderen.
Serverbeveiliging voor site-eigenaren
Als beheerder kunt u de server zo instellen dat, zelfs als een plug-in een fout bevat, een geüpload PHP-bestand nooit kan worden uitgevoerd.
Voor Apache-servers: Maak een .htaccess bestand aan en plaats dit rechtstreeks in de map wp-content/uploads/. Voeg de volgende regels toe:
<Files *.php>
deny from all
</Files>
Dit eenvoudige .htaccess bestand fungeert als een vangnet. Zelfs als een hacker erin slaagt een backdoor.php te uploaden naar uw media-bibliotheek, zal de server weigeren het bestand uit te voeren.
