
Repository PoC per CVE-2025-68147: Cross-Site Scripting Memorizzato (XSS) in OpenSourcePOS. La vulnerabilità consente l'escalation dei privilegi tramite l'iniezione di JavaScript dannoso nel modulo Store Config. Include dettagli del payload e verifica della patch (v3.4.0). Ricercatore di sicurezza: Aditya Singh (Nixon-H).
| Metadati | Dettagli |
|---|---|
| ID CVE | CVE-2025-68147 |
| Gravità | Alta CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N |
| Tipo di Vulnerabilità | Cross-Site Scripting Memorizzato (CWE-79) |
| Versioni Affette | OpenSourcePOS v3.4.0, v3.4.1 |
| Versione Corretta | v3.4.2 |
| Componente Vulnerabile | Modulo di Configurazione del Negozio (campo Return Policy) |
| Segnalatore | Aditya Singh (Nixon-H) |
Una vulnerabilità di Cross-Site Scripting (XSS) Memorizzato è stata scoperta nel modulo Configurazione del Negozio di OpenSourcePOS. L'applicazione non è riuscita a sanificare correttamente l'input fornito dall'utente nel campo "Politica di Reso" prima di memorizzarlo nella tabella del database ospos_app_config.
Questa falla ha permesso a un attaccante autenticato con privilegi di configurazione (o a un attaccante che sfrutta una catena CSRF separata) di iniettare payload JavaScript arbitrari. Poiché la "Politica di Reso" viene renderizzata dinamicamente su ogni ricevuta di vendita, il payload iniettato viene eseguito automaticamente nel browser di qualsiasi utente—inclusi cassieri con privilegi bassi, altri amministratori o clienti—ogni volta che una ricevuta viene generata o visualizzata.
La vulnerabilità risiede nel template di visualizzazione della ricevuta: app/Views/sales/receipt_default.php.
L'applicazione recupera la stringa "Politica di Reso" dall'array di configurazione globale ($this->config['return_policy']) e la prepara per la visualizzazione.
nl2br() per convertire i newline in interruzioni di riga HTML (<br>).nl2br() non sanifica i caratteri speciali HTML. Lascia tag come <script>, `` e attributi onload completamente intatti.Codice Vulnerabile (Prima della Patch):
<div id="sale_return_policy">
<?php echo nl2br($this->config['return_policy']); ?>
</div>
Quando un amministratore salva la configurazione, il payload viene memorizzato grezzo nel database.
ospos_app_configreturn_policyPolicy Text... <script>alert('XSS')</script>Poiché non c'è sanificazione dell'input lato controller (Config.php) e nessun escaping dell'output lato vista (receipt_default.php), l'applicazione è vulnerabile a XSS Memorizzato.
L'attacco prende di mira il pannello Configurazione del Negozio ma ha impatto sul modulo Vendite/Ricevuta.
http://[TARGET]/config (richiesta POST per salvare la configurazione)http://[TARGET]/sales/receipt/[SALE_ID]Passo 1: L'Iniezione Abbiamo effettuato l'accesso come Amministratore e navigato in Configurazione del Negozio -> Generale. Nell'area di testo "Politica di Reso", abbiamo iniettato il seguente payload specifico:
Standard Return Policy: No Refunds.
<script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
Passo 2: Persistenza
Facendo clic su "Invia", l'applicazione ha inviato una richiesta POST a /config/save. Il payload è stato correttamente salvato nel database.
Passo 3: L'Attivazione Per verificare l'impatto su altri utenti:
http://localhost/sales/receipt/1). Il browser analizza il div return_policy, incontra il tag <script> ed esegue immediatamente il JavaScript.Risultato Osservato:
È apparsa una finestra di avviso del browser con il messaggio: XSS_BY_NIXON_SUCCESSFUL.
Screenshot 1: Attivazione dell'Alert
Screenshot 2: Payload nella Configurazione
🎥 Video Dimostrativo: Clicca per Scaricare / Guardare il Video PoC
Questa è una vulnerabilità con Ambito Modificato (S:C) perché l'attacco è memorizzato sul server ma viene eseguito nel contesto del browser della vittima.
Escalation dei Privilegi e Furto dell'Account:
/sales/receipt/105). Lo script si esegue silenziosamente, inviando document.cookie (contenente l'ID ospos_session) al server dell'attaccante.Creazione Amministratore Wormabile:
/employees/save.hacker / password123) viene creato istantaneamente in background. La vittima non vede nulla se non la ricevuta, mentre l'attaccante ottiene una backdoor permanente.Deturpazione e Phishing:
La vulnerabilità è stata corretta in OpenSourcePOS v3.4.2.
Il manutentore ha applicato una patch che implementa Codifica dell'Output Sensibile al Contesto. Il valore di configurazione è ora avvolto nella funzione helper globale esc() di CodeIgniter prima di essere passato a nl2br().
La Patch (Commit 22297a):
<div id="sale_return_policy">
<?php echo nl2br(esc($this->config['return_policy'])); ?>
</div>
Verifica: Dopo l'aggiornamento a v3.4.2, lo stesso payload viene renderizzato come testo innocuo:
Standard Return Policy: No Refunds. <script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
22297a) e verificata dal ricercatore.