Een van de krachtigste eigenschappen van WooCommerce is de mogelijkheid voor thema-ontwikkelaars om de standaard WooCommerce-sjablonen te overschrijven (Template Overrides). Dit gebeurt door specifieke bestanden (zoals single-product.php) in de map van het thema te plaatsen. Als een thema-ontwikkelaar echter een dynamisch systeem bouwt om deze sjablonen in te laden op basis de URL-parameters, ontstaat er een risico op Local File Inclusion (LFI).

Hoe het LFI-lek ontstaat bij sjabloon-invoegingen

Stel dat een thema een aangepaste productlay-out wil inladen op basis van de voorkeur van de gebruiker, en hiervoor de volgende onveilige PHP-logica gebruikt:

PHP
 
$layout = $_GET['product_layout']; // Bijv. 'grid' of 'list'
$template_path = get_stylesheet_directory() . "/woocommerce/custom-" . $layout . ".php";
if (file_exists($template_path)) {
    include($template_path);
}

Een aanvaller kan de parameter product_layout manipuleren om buiten de map /woocommerce/ te treden met behulp van pad-traversatietekens (../): ?product_layout=../../../../wp-config

De functie file_exists() zal controleren of het bestand wp-config.php bestaat (wat het geval is). Vervolgens zal het include statement het configuratiebestand inladen en uitvoeren. Hoewel dit niet direct de code in platte tekst op het scherm toont, kan de aanvaller via foutmeldingen of door het combineren van dit lek met andere kwetsbaarheden (zoals log poisoning) de server dwingen om kwaadaardige code uit te voeren.

Hoe ontwikkelaars LFI bij sjablonen voorkomen

Ontwikkelaars moeten gebruikmaken van de ingebouwde WordPress-functie wc_get_template() of get_template_part(). Deze functies zijn intern beveiligd tegen padmanipulatie.

Als handmatige inclusie noodzakelijk is, gebruik dan altijd een strikte whitelist en de functie basename() om alle pad-informatie rigoureus te verwijderen:

PHP
 
$allowed_layouts = array('grid', 'list', 'compact');
$layout = basename($_GET['product_layout']);

if (in_array($layout, $allowed_layouts)) {
    include(get_stylesheet_directory() . "/woocommerce/custom-" . $layout . ".php");
} else {
    include(get_stylesheet_directory() . "/woocommerce/custom-grid.php");
}

Advies voor site-beheerders

  • Beperk bestandstoegang op de server: Schakel de PHP-richtlijn open_basedir in via het controlepaneel van uw hostingprovider. Dit zorgt ervoor dat PHP-scripts uitsluitend bestanden mogen openen binnen de specifieke hoofdmap van uw website, waardoor het uitlezen van systeembestanden (zoals /etc/passwd) via een LFI-lek onmogelijk wordt.