De WooCommerce REST API stelt externe applicaties in staat om veilig te communiceren met de webshop. Voor mobiele apps of single-page toepassingen wordt vaak gebruikgemaakt van JSON Web Tokens (JWT) voor de authenticatie van gebruikers. Als de plug-in die verantwoordelijk is voor het verwerken en decoderen van deze JWT-tokens echter onveilig is gecodeerd en gebruikmaakt de PHP-deserialisatie, ontstaat er een risico op een kritiek Insecure Deserialization lek.

Hoe JWT en Deserialisatie botsen

Een JWT-token bestaat uit drie delen, gescheiden door punten: een Header, een Payload, en een Signature. De Payload bevat gegevens over de gebruiker (claims) in een base64-gecodeerd formaat.

Wanneer een externe app een verzoek stuurt naar een WooCommerce REST API-eindpunt, stuurt hij het JWT-token mee in de HTTP-header. Een slecht gecodeerde JWT-plug-in decodeert de payload en controleert de inhoud. De kwetsbaarheid ontstaat wanneer de plug-in de gegevens uit de payload onveilig verwerkt:

PHP
 
$token_payload = base64_decode($parts[1]);
// GEVAARLIJK: De data wordt gedeserialiseerd als PHP object
$user_data = unserialize($token_payload);

Een aanvaller kan het token handmatig aanpassen. Hoewel hij de cryptografische handtekening (Signature) niet kan namaken zonder de geheime sleutel, kan hij in scenario's waarin de plug-in de handtekening vóór de deserialisatie niet correct valideert, een kwaadaardig PHP-object injecteren in de payload. Dit leidt direct tot een PHP Object Injection aanval, waarmee de server kan worden gedwongen om willekeurige code uit te voeren (Remote Code Execution).

Gevaren voor de e-commerce infrastructuur

Aangezien de REST API direct verbonden is met de kern van WooCommerce, kan een succesvolle RCE-aanval via een JWT-token de volledige server compromitteren. De aanvaller kan de configuratiebestanden van payment gateways aanpassen, database-dumps genereren of de webshop omvormen tot een distributiepunt voor malware.

Hoe ontwikkelaars JWT-authenticatie beveiligen

  • Gebruik uitsluitend JSON: Gegevens binnen een JWT-payload moeten altijd strikt als JSON-strings worden opgeslagen en gedecodeerd met json_decode(). JSON is een pure data-indeling en is immuun voor PHP Object Injection.

  • Valideer de handtekening ALTIJD eerst: De allereerste stap bij het ontvangen van een token moet de verificatie van de handtekening zijn met een robuust cryptografisch algoritme (zoals HMAC-SHA256 of RSA). Als de handtekening niet klopt, moet het proces direct worden afgebroken.

PHP
 
// VEILIGE INTEGRATIE VIA EEN GOEDE BIBLIOTHEEK (Bijv. Firebase JWT)
try {
    // Decodeer en valideer in één stap met de geheime sleutel
    $decoded = \Firebase\JWT\JWT::decode($jwt_token, new \Firebase\JWT\Key($secret_key, 'HS256'));
    $user_id = $decoded->user_id; // Data is veilig toegankelijk als standaard PHP type
} catch (Exception $e) {
    return new WP_Error('jwt_invalid', 'Ongeldig token opgegeven.', array('status' => 403));
}

Advies voor site-beheerders

  • Kies gecertificeerde JWT plug-ins: Als u JWT-authenticatie toevoegt aan uw WooCommerce REST API, gebruik dan uitsluitend veelgeteste plug-ins met een hoog aantal actieve installaties en een schone beveiligingsgeschiedenis.